lundi 2 septembre 2019

Mesurer une température avec un capteur LM35 et une carte Arduino / Genuino

Source


Qu'est-ce qu’un capteur LM35 ?

Brochage d'un capteur LM35
Brochage du capteur LM35
Le capteur de température LM35 est un capteur analogique de température fabriqué par Texas Instruments. Il est extrêmement populaire en électronique, car précis, peu couteux, très simple d'utilisation et d'une fiabilité à toute épreuve.
Le capteur de température LM35 est capable de mesurer des températures allant de -55°C à +150°C dans sa version la plus précise et avec le montage adéquat, de quoi mesurer n'importe quelle température.
N.B. Les versions grand publiques sont capables de mesurer des températures comprises entre -40°C et +110°C.
La sortie analogique du capteur est proportionnelle à la température. Il suffit de mesurer la tension en sortie du capteur pour en déduire la température. Chaque degré Celsius correspond à une tension de +10mV.
Dans ce tutoriel, nous étudierons deux montages : un très simple permettant de mesurer des températures positives uniquement (de 2°C à 110°C) et un second plus complexe permettant de mesurer des températures de -40°C à +110°C.
Le capteur LM35 supporte des températures assez extrêmes (jusqu'à -55°C / +150°C), mais il n'en est pas de même pour les cartes Arduino.
Si vous soumettez une carte Arduino "classique" à ces températures extrêmes, elle va purement et simplement cesser de fonctionner ou se dégrader très rapidement. Cela est valable pour les cartes Arduino, mais aussi pour tous autres circuits électroniques fabriqués suivant les standards "grand public" (et non "industriels").
Pour information, les gammes de températures classiques en électronique sont les suivantes :
  • grand public : 0°C ~ 70°C
  • industrie : -40°C ~ 85°C
  • militaire : -55°C ~ 125°C

Le montage de démonstration

Matériel pour exemple Arduino LM35
Matériel nécessaire
Pour réaliser ce montage, il va nous falloir :
  • Une carte Arduino UNO (et son câble USB),
  • Un capteur LM35 (attention, il existe plusieurs versions, voir l'encadré ci-dessous),
  • Un condensateur de 100nF (optionnel, mais recommandé),
  • Une plaque d'essai et des fils pour câbler notre montage.
Pour faire simple, si on s'intéresse uniquement aux LM35 "à pattes" (boitier TO-92 pour les intimes), il existe trois versions :
  • Le LM35DZ, capable de mesurer des températures de 0 à 100°C avec une précision de 1.5°C aux extrêmes.
  • Le LM35CZ, capable de mesurer des températures de -40 à 110°C avec une précision de 1.5°C aux extrêmes.
  • Le LM35CAZ, capable de mesurer des températures de -40 à 110°C avec une précision de 1°C aux extrêmes.

Vue prototypage du montage de l'exemple Arduino LM35
Vue prototypage du montage
Pour commencer notre montage, nous allons câbler la broche VCC du capteur à l'alimentation 5V de la carte Arduino au moyen d'un fil. On fait ensuite de même avec la broche GND du capteur qui vient se câbler sur la broche GND de la carte Arduino.
Pour faire les choses bien, on va venir câbler un condensateur de 100nF (un condensateur de découplage en termes techniques) entre les broches VCC et GND du capteur. Il faut que le condensateur soit câblé le plus près possible du capteur pour être efficace.


Le code de démonstration

Maintenant que nous avons notre montage, passons au code !
Le but de notre code va être de :
  1. Lire la tension sur la broche A0
  2. Convertir la valeur mesurée en une température (pour l'affichage)
  3. Envoyer la valeur au PC (pour l'affichage)
  4. Recommencer au point 1.
Pour réaliser ce morceau code, nous allons utiliser la fonction analogRead() vue dans un précédent tutoriel.
1
2
3
void setup() {
  Serial.begin(9600);
}
Nous allons commencer notre programme de démonstration avec la fonction setup() qui va simplement initialiser la communication avec le PC.
PS Ne cherchez pas à comprendre comment utiliser de Serial.begin() pour le moment, cela fera l'objet d'un futur tutoriel ;)
1
2
3
4
5
6
7
8
void loop() {
  int valeur_brute = analogRead(A0);

  float temperature_celcius = valeur_brute * (5.0 / 1023.0 * 100.0);

  Serial.println(temperature_celcius);
  delay(250);
}
Dans la fonction loop(), nous allons faire trois choses :
  1. Mesurer la tension sur la broche A0 avec analogRead().
  2. Transformer le résultat de la mesure en un nombre à virgule (type float) en faisant un simple produit en croix. Rappel : 5V = 5000mV = 1023 en sortie de analogRead()10mV = 1°C, par conséquent, température = valeur_mesurée * (5.0 / 1023.0 * 100.0)
  3. Envoyer la valeur au PC et attendre quelques millisecondes pour avoir le temps de lire ce qui se passe côté PC.
N.B. On utilise valeur * (5.0 / 1023.0 * 100.0) dans le calcul du produit en croix, car lors de la compilation du programme, c'est le type des valeurs d'une opération qui définit le type du résultat. Si on fait valeur * (5 / 1023 * 100) comme valeur, 5, 1023 et 100 sont des nombres entiers, le résultat est un nombre entier, ce qui n'est pas notre but, nous voulons un calcul avec des nombres à virgule. On utilise donc 5.0, 1023.0 et 100.0 pour forcer un calcul avec des nombres à virgule.
N.B. On multiplie par 100 dans le calcul, car dans 5 volts (= 5000mV) il y a 100 fois 10mV (= 1°C).
PS Je vous laisse faire la conversion en degrés Fahrenheit pour ceux que ça intéresse. La formule est : fahrenheit = celcius * 1.8 + 32.
Le code complet avec commentaires :
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
 * Code d'exemple pour le capteur LM35 (2°C ~ +110°C).
 */

// Fonction setup(), appelée au démarrage de la carte Arduino
void setup() {

  // Initialise la communication avec le PC
  Serial.begin(9600);
}

// Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
void loop() {
  
  // Mesure la tension sur la broche A0
  int valeur_brute = analogRead(A0);
  
  // Transforme la mesure (nombre entier) en température via un produit en croix
  float temperature_celcius = valeur_brute * (5.0 / 1023.0 * 100.0);
  
  // Envoi la mesure au PC pour affichage et attends 250ms
  Serial.println(temperature_celcius);
  delay(250);
}
L'extrait de code ci-dessus est disponible en téléchargement sur cette page (le lien de téléchargement en .zip contient le projet Arduino prêt à l'emploi).

N.B. L'appel à la fonction analogReference() doit être fait au démarrage avant de faire le moindre appel à analogRead().
Le changement de référence est effectif après quelques millisecondes. Il est donc possible que les premières mesures de tension après un changement de référence ne soient pas justes.

 Ne rien connecter sur la broche AREF si une tension de référence interne est utilisée

Tout est dans le titre, ne connectez rien à la broche AREF si une tension de référence interne est utilisée.
Si vous connectez quelque chose sur la broche AREF sans être dans le mode EXTERNAL, vous allez déclencher un court-circuit à l'intérieur du microcontrôleur, ce qui lui sera fatal.

Bonus : Mesurer des températures négatives

Mesurer des températures comprises entre 0°C et +110°C, c'est bien. Cependant, il arrive régulièrement qu'on ait besoin de mesurer des températures négatives. Tout le monde n'habite pas dans le sud (dommage).

Le montage

Afin de comprendre comment mesurer des températures négatives avec une carte Arduino, nous allons reprendre le montage de démonstration du chapitre précédent et le modifier.
Matériel pour exemple Arduino LM35 (températures négatives)
Matériel nécessaire
Pour réaliser ce second montage, il va nous falloir :
  • Une carte Arduino UNO (et son câble USB),
  • Un capteur LM35 (attention, il faut bien prendre une version CZ ou CAZ, pas DZ !),
  • Un condensateur de 100nF (optionnel, mais recommandé),
  • Deux diodes 1N4148,
  • Une résistance de 18K ohms (marron / gris / orange),
  • Une plaque d'essai et des fils pour câbler notre montage.
Vue schématique du montage de l'exemple Arduino LM35 (températures négatives)
Vue schématique du montage
Vue prototypage du montage de l'exemple Arduino LM35 (températures négatives)
Vue prototypage du montage
Pour commencer notre second montage, nous allons câbler la broche VCC du capteur à l'alimentation 5V de la carte Arduino au moyen d'un fil. On relie ensuite la broche GND du capteur en série avec les deux diodes 1N4148, puis à la broche GND de la carte Arduino.
N.B. Les diodes sont polarisées ! Elles ont un "sens". Le trait noir sur la diode indique l'emplacement de la barre verticale sur le schéma.
On continue le montage en reliant la broche GND du capteur (juste après les deux diodes), à la broche A1 de la carte Arduino.
Toujours pour faire les choses bien, on va venir câbler un condensateur de 100nF entre les broches VCC et GND du capteur. Comme pour le premier montage, il faut que le condensateur soit câblé le plus près possible du capteur pour être efficace.
Montage de l'exemple Arduino LM35 (températures négatives)
Le montage fini
On achève ensuite le circuit en reliant la sortie du capteur à la broche A0 de la carte Arduino avec un fil et en câblant la résistance de 18K ohms entre la sortie du capteur et la broche GND de la carte Arduino.

 Comment ça marche ?

Astuce/montage pour mesurer des températures négatives avec un capteur LM35 et une alimentation simple
Extrait de la documentation constructeur
Le principe est assez simple.
Les deux diodes 1N4148 induisent une chute de tension d'environ 0.6 volt à leur borne chacune (c'est une caractéristique physique des diodes, appelée "Forward Voltage" dans les documents techniques), soit 1.2 volt au total entre la masse réelle du montage et la broche GND du capteur.
Avec une masse à 1.2 volt au niveau du capteur, il est possible pour le capteur d'aller en dessous de "son" 0 volt vu qu'il n'est en réalité pas à 0 volt, mais à 1.2 volt.
Il y a cependant un petit souci avec ce montage : la tension aux bornes des diodes varie en fonction de la température … Ce qui est embêtant pour un montage censé mesurer des températures. C'est un comportement normal pour une diode, c'est même un comportement qui est utilisé pour mesurer des températures. Sauf que dans notre cas, c'est un comportement parasite.
L'astuce pour "annuler" cette variation de tension en fonction de la température consiste à mesurer la tension au niveau de la broche GND du capteur, puis de corriger la mesure finale en faisant une soustraction dans le code.

Le code

Pour réaliser ce second morceau code, nous allons reprendre le code du montage de démonstration du chapitre précédent et lui apporter quelques modifications.
1
2
3
void setup() {
  Serial.begin(9600);
}
La partie setup() reste inchangée.
On notera seulement qu'il n'est pas possible d'utiliser l'astuce du analogReference() vu dans le chapitre précédent avec ce montage, car nous allons mesurer des tensions entre 0 volt et ~3,5 volts (avec un signal centré autour de 2 volts).
1
2
3
4
5
6
7
8
9
void loop() {
  int valeur_brute = analogRead(A0);
  int valeur_offset = analogRead(A1);

  float temperature_celcius = (valeur_brute - valeur_offset) * (5.0 / 1023.0 * 100.0);

  Serial.println(temperature_celcius);
  delay(250);
}
Dans la fonction loop(), nous allons faire deux modifications:
  1. Nous allons mesurer la tension sur la broche A1 avec analogRead() pour savoir de combien la valeur brute doit être compensée.
  2. Nous allons modifier le produit en croix pour que la valeur brute soit corrigée.
Le code complet avec commentaires :
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
 * Code d'exemple pour le capteur LM35 avec support des températures négatives (-40°C ~ +110°C).
 */

// Fonction setup(), appelée au démarrage de la carte Arduino
void setup() {

  // Initialise la communication avec le PC
  Serial.begin(9600);
}

// Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
void loop() {
  
  // Mesure la tension sur la broche A0 (sortie capteur) et A1 (référence du point zéro)
  int valeur_brute = analogRead(A0);
  int valeur_offset = analogRead(A1);
  
  // Transforme la mesure (nombre entier) en température via un produit en croix
  float temperature_celcius = (valeur_brute - valeur_offset) * (5.0 / 1023.0 * 100.0);
  
  // Envoi la mesure au PC pour affichage et attends 250ms
  Serial.println(temperature_celcius);
  delay(250);
}
L'extrait de code ci-dessus est disponible en téléchargement sur cette page (le lien de téléchargement en .zip contient le projet Arduino prêt à l'emploi).

Le résultat

Capture d'écran du moniteur série de l'exemple Arduino LM35 (températures négatives)
Capture d'écran du moniteur série
Après avoir envoyé le programme dans la carte Arduino, en ouvrant le moniteur série (onglet outils), puis en sélectionnant la bonne vitesse de communication (ici 9600 bauds), vous devriez voir apparaitre en temps réel la température en sortie du capteur.
Si votre montage est correct, en plaçant le capteur au congélateur, les valeurs dans le moniteur série doivent normalement changer et descendre en dessous de 0°C.

Aucun commentaire:

Enregistrer un commentaire

Mesurer une température avec un capteur LM35 et une carte Arduino / Genuino

Source Qu'est-ce qu’un capteur LM35 ? Brochage du capteur LM35 Le capteur de température LM35 est un capteur analogique de...