Capteurs de température et applications
Texte légal : Points du programme concernés
Classe de 2nde
Mesurer une grandeur physique à l'aide d'un capteur électrique résistif. Produire et utiliser une courbe d'étalonnage reliant la résistance d'un système avec une grandeur d'intérêt (température, pression, intensité lumineuse, etc.). Utiliser un dispositif avec microcontrôleur et capteur.
Le capteur de température LM335Z
Définition : Caractéristiques
Ce capteur de température permet de mesurer la température en prélevant le signal sur sa borne centrale dont la tension varie proportionnellement à la température absolue.
Le coefficient de proportionnalité est égal à \(10\ mV \cdot K^{-1}\) (voir datasheet [pdf]). Donc la tension et la température sont liées par la relation \(\mathbf {V = 0{,} 010 \times T_K}\), où V
est la tension en volts et TK
la température en kelvins.
Méthode : Connexion à l'Arduino
Ci-contre le montage avec l'alimentation de la plaque d'essais à l'aide de la platine Arduino et le capteur de température.
Le potentiel permettant de calculer la température est prélevé entre la borne centrale du composant et la résistance \(R=2{,}2\ k \Omega\). Ici, on lit la tension sur l'entrée analogique A0.
Capteur orienté face plate vers l'opérateur, la borne de droite est reliée à la masse (GND). La borne de gauche peut être laissée libre ou reliée au curseur d'un potentiomètre pour calibrer le capteur.
Méthode : Obtenir la valeur de la température
La tension permettant de calculer la température est lue sur l'entrée analogique de l'Arduino A0.
Si une variable tension
a été déclarée dans le programme, l'instruction tension=analogRead(A0)*5/1023.0;
permet de la mesurer en convertissant la valeur comprise entre 0 et 1023 donnée par le convertisseur analogique/numérique de la carte Arduino.
Pour obtenir la valeur de la tension et en déduire la température, on utilise donc les instructions ci-dessous :
tension = analogRead(A0) * 5 / 1023.0;//Lecture de la tension sur l'entrée analogique A0
tempK = tension * 100.0;//Conversion de la tension en température exprimée en kelvin
tempC = tempK - 273.15;//Conversion des kelvins en celsius
Les variables tension
, tempK
et tempC
doivent être déclarées en début de programme en tant que décimaux (type float
).
Fondamental : Code permettant d'afficher la température sur le moniteur série
Le programme ci-dessous permet l'affichage de la température sur le moniteur série.
float tension; //Variable permettant de stocker la valeur de la tension
float tempC; //Variable température en °C
float tempK; //Variable température en kelvins
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //Initialisation de la communication avec le moniteur série
}
void loop() {
// put your main code here, to run repeatedly:
tension = analogRead(A0) * 5.0 / 1023.0;//Lecture de la tension sur l'entrée analogique A0
tempK = tension * 100.0;//Conversion de la tension en température exprimée en kelvin
tempC = tension * 100 - 273.15;//Conversion des kelvins en celsius
Serial.print(tempK);//Affiche la valeur de la température en kelvins
Serial.println(" K");
Serial.print(tempC);//Affiche la valeur de la température en degrés Celsius
Serial.write(223);//Affiche le symbole degrés
Serial.println("C");
delay(3000);//On fait une mesure toutes les 3 secondes
}
Complément : Affichage de la température sur un écran LCD
Modifiez le programme précédent pour utiliser un afficheur LCD en ajoutant les lignes de code nécessaires et en supprimant celles qui sont superflues.
Se reporter ci-besoin à la partie "Les méthodes d'affichage avec les cartes Arduino" pour connecter et commander l'écran LCD avec module I2C.
Remarque : Proposition de questionnement élève
On peut proposer aux élèves de répondre aux questions suivantes :
On fournit le schéma Fritzing et ils doivent le réaliser sur la plaque. On impose le respect du code couleur suivant : fils noirs reliés à la masse et fils rouge reliés aux \(+5\ V\).
Après avoir rappelé les caractéristiques du capteur, notamment la relation \(\mathbf {V = 0{,} 010 \times T_K}\), où
V
est la tension en volts etTK
la température en kelvins : Quelle relation existe entre la température et la tension mesurée ?Quel calcul permet de convertir la température en degrés Celsius ?
Compléter le code ci-dessous en reprenant les noms des variables déjà déclarées.
float tension; //Variable permettant de stocker la valeur de la tension
float tempC; //Variable température en °C
float tempK; //Variable température en kelvins
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //Initialisation de la communication avec le moniteur série
}
void loop() {
// put your main code here, to run repeatedly:
tension = analogRead(A0) * 5.0 / 1023.0;//Lecture de la tension sur l'entrée analogique A0
tempK = //RELATION À COMPLÉTER //Conversion de la tension en température exprimée en kelvin
tempC = //RELATION À COMPLÉTER //Conversion des kelvins en celsius
Serial.print(tempK);//Affiche la valeur de la température en kelvins
Serial.println(" K");
Serial.print(tempC);//Affiche la valeur de la température en degrés Celsius
Serial.write(223);//Affiche le symbole degrés
Serial.println("C");
delay(3000);//On fait une mesure toutes les 3 secondes
}
Complément : Calibrer le capteur de température à l'aide d'un potentiomètre
Il est possible d'ajouter un potentiomètre sur la borne libre du capteur afin de le calibrer avec un thermomètre de référence comme indiqué dans le montage ci-dessous.
Thermistance CTN
Définition : Caractéristique des thermistances CTN
La thermistance utilisée ici est une CTN 470 : la résistance R25 à \(25\ °C\) est égale à \(470\ \Omega\).
La dépendance entre la valeur de la résistance et la température est donnée par la relation :
\(R_{CTN}=R_{25}\times \text{e}^{B\times \left(\frac{1}{T}- \frac{1}{T_{25}}\right)}\)
La fiche technique de la thermistance utilisée ici donne \(B=3450\ K\).
On exploitera dans la suite la relation suivante entre la valeur de la résistance et la température en kelvins : \(R_{CTN}=A\times \text{e}^{B/T}\).
Pour la thermistance utilisée :
\(\left \{\begin{aligned} B &=3450\ K \\ A &\simeq 4{,}407\times 10^{-3}\ \Omega \end{aligned}\right.\)
Méthode : Montage en pont diviseur de tension
On réalise un pont diviseur de tension avec la thermistance et une résistance \(R=560\ \Omega\). La tension aux bornes de l'assemblage vaut \(+5\ V\).
On mesure la tension aux bornes de la thermistance sur l'entrée analogique A0.
\(U_{CTN}=\dfrac{5}{1+\dfrac{R}{R_{CTN}}}\).
On en déduit \(R_{CTN}=\dfrac{R}{\dfrac{5}{U_{CTN}}-1}\).
Et enfin la température en kelvins : \(T=\dfrac{B}{\ln{\left(\dfrac{R_{CTN}}{A} \right)}}\)
Le programme ci-dessous permet de récupérer la valeur de la température et de l'afficher sur le moniteur série.
float tension, RCTN, TK, TC;//Variables tension, résistance CTN, températures (K et °C)
const float R = 547.0;//Résistance connue du pont diviseur
const float B = 3450.0;//Caractéristique de la CTN
const float A = 0.004407;//Coeff dans RCTN=A.exp(B/T)
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);//initialisation Moniteur série
}
void loop() {
// put your main code here, to run repeatedly:
tension = analogRead(A0) * 5 / 1023.0;//Lecture de la tension aux bornes de la CTN
RCTN = R / (5.0 / tension - 1.0);//Calcul de RCNT
TK = B / (log(RCTN / A)); //Calcul de la température en K
TC = TK - 273.0;//Calcul de la température en °C
//Affichage des résultats (on peut se dispenser de certaines lignes)
Serial.print("tension ");
Serial.println(tension);
Serial.print("R_CTN ");
Serial.println(RCTN);
Serial.print("Température ");
Serial.print(TC);
Serial.println("°C");
delay(3000);
//Fin de l'affichage
}
Remarque : Questionnement préalable et expérience préliminaire
Un travail préliminaire peut consister à faire étudier aux élèves la dépendance de RCTN en fonction de la température à l'aide d'un ohmmètre et d'un thermomètre de référence.
L'exercice ci-contre tiré du manuel collaboratif Le Livre Scolaire propose une étude théorique exploitant notamment la notion de pont diviseur.
Simuler une alarme de température
On peut proposer cette activité avec le capteur LM335Z ou la thermistance. On peut simuler l'alarme au choix avec deux DEL ou un buzzer piézoélectrique.
S'il s'agit de modéliser une alarme, on peut préférer le capteur LM335Z pour sa facilité de mise en œuvre et sa relation tension/température plus simple que la thermistance
D'un point de vue programmation, c'est l'occasion d'introduire les conditions : if, else, else if...
Le code ci-dessous permet de faire fonctionner l'alarme comportant des DEL : la DEL verte s'allume quand la température est en dessous du seuil défini et la DEL rouge s'allume quand la température dépasse ce même seuil.
Vous pouvez y repérer la syntaxe des structures conditionnelles.
//Déclaration des variables
float tension;
float tempC;
float tempK;
float seuilTemp;
void setup() {
// put your setup code here, to run once:
seuilTemp = 20.0; //On fixe une température limite
pinMode(3, OUTPUT);//On définit les deux bornes numériques en SORTIE
pinMode(11, OUTPUT);
digitalWrite(11, 1); //On allume la DEL verte
digitalWrite(3, 0); //On éteind la DEL rouge
}
void loop() {
// put your main code here, to run repeatedly:
tension = analogRead(A0) * 5.0 / 1023.0;//Lecture de la tension sur l'entrée analogique A0
tempK = tension * 100.0;//Conversion de la tension en température exprimée en kelvin
tempC = tension * 100 - 273.15;//Conversion des kelvins en celsius
if (tempC > seuilTemp) {
digitalWrite(11, 0); //On éteind la DEL verte
digitalWrite(3, 1); //On allume la DEL rouge
}
else if (tempC < seuilTemp) {
digitalWrite(11, 1); //On allume la DEL verte
digitalWrite(3, 0); //On éteind la DEL rouge
}
}
Complément : Amélioration possible du programme
Comment faire en sorte de limiter les effets des fluctuations faibles de la température autour du seuil afin que l'alarme ne passe pas très rapidement de l'état actif à inactif ?