Utiliser un microcontrôleur Arduino pour mesurer une température

1. Le montage

schéma Cette fois-ci, on va récupérer une tension.

2. Etude physique

schema électrique

U = (R+Rctn).i et Uctn =Rctn.i d'où Uctn = U. Rctn / (R+Rctn)
Uctn . (R+Rctn) = U . Rctn
Uctn . R + Uctn . Rctn = U . Rctn
Uctn . R = U . Rctn - Uctn . Rctn
Uctn . R = (U - Uctn ). Rctn

La conversion analogique numérique sur 10 bits : $2^{10}$=1024 donne

U N
5.0 1024

Il vient Uctn = 5,0.Nctn /1024
5,0 . Nctn / 1024 . R = (5,0 - 5,0 . Nctn / 1024 . R ). Rctn
soit en divisant par 3,3 et en multipliant par 1024
Nctn. R = (1024 -Nctn . R ). Rctn

\begin{align} \fbox{Rctn =$ \frac {Nctn . R}{1024-Nctn}$} \end{align}

2. Mesures

T(°C) U $_{ctn}$ (V)
0 3,84
10 3,34
20 2,78
30 2,23
40 1,72
50 1,30
60 0,97

3. Simulation dans Python

In [1]:
from math import log as ln


A = 0.0009131577435290704 # coefficients Steinhart-Hart de la thermistance de 47k

B = 0.0002144210475986645 # doc technique ou calcul à partir de 3 mesures

C = 1.0773792283999106e-07

Rserie=47000

def calcule_Temperature(Nmes) :
  Resistance = Nmes*Rserie/(1024-Nmes)
  Temp = ln(Resistance) # sauver le log de la résistance mesurée
  Temp = 1 / (A + (B * Temp) + (C * Temp * Temp * Temp));
  Temp = Temp - 273.15; # Kelvin -> Celsius
  return Temp;


N =int(input("N mesuré ?")) #entre 0 et 1023
T=calcule_Temperature(N)
print('T =' f' {T: .0f}'' °C') #fstring à partir de python 3.7 
N mesuré ?456
T =  30 °C

4. Code Arduino

Ne pas exécuter ce code en dehors d'un Arduino!!!

In [ ]:
/----- VARIABLES ---------------------------------------------
int CTN = A0; // Sonde de température CTN entre A0 et 5V
float Rserie = 47000; // valeur Résistance entre A0 et GND

// caractérisation de la thermistance de 47k
float A = 0.0009131577435290704; // coefficients Steinhart-Hart de la thermistance de 47k
float B = 0.0002144210475986645; // doc technique ou calcul à partir de 3 mesures
float C = 1.0773792283999106e-07;

//---calcul de la température avec la relation de Steinhart-Hart----
float Thermistor(int Nmes) {
  long Resistance;
  float Temp; // Dual-Purpose variable to save space.
  Resistance = Nmes*Rserie/(1024-Nmes)
  Temp = log(Resistance); // sauver le log de la résistance mesurée
  Temp = 1 / (A + (B * Temp) + (C * Temp * Temp * Temp));
  Temp = Temp - 273.15;  // Kelvin -> Celsius
  return Temp;
}


void setup(void) {
    Serial.begin(9600)

//--------------- BOUCLE PRINCIPALE -----------------------------

void loop() {
int LECTURE = analogRead(CTN); // Lecture de la valeur de la CTN
float Celsius = Thermistor(LECTURE); // Conversion de la valeur lue en température
Serial.println(Celsius)
}    

5. Le montage linéarisé

Le montage linéarisé

6.La simulation python

In [2]:
from math import log as ln
Rserie=47000
# modélisation de la courbe T=f(Req)= a* Req +b 
a = -0.00309
b =84.8

def calcule_Temperature(Nmes) :
  Resistance = Nmes*Rserie/(1024-Nmes)
  Temp = a*Resistance+b
  return Temp;


N =int(input("N mesuré ?")) #entre 0 et 1023
T=calcule_Temperature(N)
print('T =' f' {T: .0f}'' °C') #fstring à partir de python 3.7 
N mesuré ?279
T =  30 °C

7.Le code Arduino

Ne pas exécuter ce code en dehors d'un Arduino!!!

In [ ]:
/----- VARIABLES ---------------------------------------------
int CTN = A0; // Sonde de température CTN entre A0 et 5V
float Rserie = 47000; // valeur Résistance entre A0 et GND

// modélisation de la courbe T=f(Req)= a* Req +b 
float a = -0.00309
float b =84.8

//---calcul de la température avec la relation de Steinhart-Hart----
float Thermistor(int Nmes) {
  long Resistance;
  float Temp; 
  Resistance = Nmes*Rserie/(1024-Nmes)
  //le calcul de la température est plus adapté à un élève de seconde lorsqu on a linéarisé la CTN
  Temp = a*Resistance+b
  return Temp;
}


void setup(void) {
    Serial.begin(9600)

//--------------- BOUCLE PRINCIPALE -----------------------------

void loop() {
int LECTURE = analogRead(CTN); // Lecture de la valeur de la CTN
float Celsius = Thermistor(LECTURE); // Conversion de la valeur lue en température
Serial.println(Celsius)
}