Capteur de température avec un Arduino🔗
Introduction
Un Arduino permet pas mal de choses. Un petit tour sur Hackaday.com devrait vous en convaincre… Toutefois, en tant que débutant dans la matière et n'ayant que des concepts théoriques en électronique, il faut que je me tourne vers des choses assez basiques. Sur ce point, il existe un excellent site: celui de ladyada, fondatrice de Adafruit.com qui vend des circuits électroniques pour l'amateur et qui surfe sur la vague du hardware libre.
Sur le site de LadyAda, il y a un montage qui m'a particulièrement intéressé car il est assez simple sur la partie électronique et il permet de commencer doucement à coder avec l'Arduino: c'est le montage sur le capteur de température. Ce montage fait intervenir un capteur de type TMP36. Néanmoins, mon magasin d'électronique le plus proche n'avait pas ça en stock. Je me suis rabattu vers quelque-chose de plus conventionnel: un LM335 (lien vers datasheet). Le fonctionnement du capteur est différent de celui présenté sur le site de ladyada. En effet, le LM335 se comporte comme une diode Zener (une diode qui maintient une tension quasi constante à ses bornes sur une plage large d'intensité). Pour peu qu'on lui fournisse suffisamment de courant (entre 450µA et 5mA), on peut lire la température en °K par pas de 10 mV.
La plage des °K est la même que celle des °C à la différence près que 0°K = -273,15 °C. Ainsi, à 20°C, la température sera de 293,15 °K. Ce qui correspond à 293,15°K\*10mV = 2,9315 V !
L'objectif est très simple: transformer un Arduino en interface PC<----\>Capteur de température, de manière à ramener les données sur la machine. Ce petit exercice fait intervenir du code basique pour Arduino: prendre une mesure analogique et envoyer les données par le port USB.
Schéma
Voici à quoi ça pourrait ressembler:
Pour le branchement du LM335 en boitier TO92, il y a un truc pour les débutants: la datasheet indique le branchement des bornes avec une vue par dessous le composant et non par dessus… Ça à l'air trivial mais j'avais inversé le branchement et les résultats étaient franchement bizarres (mesure entre ADJ et V+).
Calculs
Pour le calcul de la résistance, j'ai appliqué la formule suivante:
- Nous serons à presque 20°C de température ambiante.
- A cette température, la tension aux borne du LM335 sera de 2,9315V.
- A noter que sur une place de 0°C à 40°C, la tension aux bornes du LM335 variera peu: de 2,73V à 3,13 V.
- L'Arduino permet de sortir un courant continu de 5V.
- La tension aux bornes de la résistance devrait être de 5V - 2,93 soit environ 2V.
- Nous voulons que le courant soit dans les limites du LM335. La valeur de 1mA devrait faire l'affaire.
- U=RI donc R=U/I soit R=2/0,001 = 2000 Ohms.
- Dans mon stock, j'ai des résistances de 2,2kOhms, ça fera bien l'affaire (I sera égal à 0,0009mA).
Arduino
Reste le code pour l'Arduino. Globalement, ce que nous voulons faire est simple:
- Faire un relevé de tension sur le port d'entrée analogique 0.
- Convertir cette tension en °C
- Envoyer le résultat par le port Série de l'Arduino
- L'Arduino étant branché sur le port USB du PC, on peut utiliser un périphérique Serial-USB pour récupérer ce que l'Arduino nous renvoie.
- On attend une seconde et on recommence la boucle.
Pour comprendre comment coder, vous pouvez trouver des exemples à droite et à gauche sur de nombreux sites web (celui de ladyada est encore une fois très bien fait). Néanmoins, pour bien comprendre, lisez cet ouvrage: le Arduino Programming Notebook.
Voici le code commenté:
/* Capteur de température avec un LM335 */ int capteurPin = 0; // Port analogique pour lire la température // Boucle Setup pour indiquer le port de communication void setup() { Serial.begin(9600); } // Boucle principale void loop() { // On lit la tension sur le bon port: int tension_l = analogRead(capteurPin); // La tension est un entier qui va de 0 à 1024 fois la tension de // référence (5V chez nous). Il faut la convertir en tension: float tension = (tension_l * 5.0) / 1024.0; // La température se calcule facilement: float temp = ((tension_l*5.0)/10.24)-273.15; // On envoie les résultats sur le port série: Serial.print(tension); Serial.println(" volts"); Serial.print(temp); Serial.println(" °C"); // On attend une seconde: delay(1000); }
Mettez tout ça dans un fichier capteur_temp.pde
.
Programmer l'Arduino
Maintenant que le source est compris, il reste à le compiler, à l'envoyer sur l'Arduino et à le tester. Comme sur mon article précédent, il va falloir un fichier Makefile du genre:
ARDUINO_DIR = /usr/share/arduino TARGET = capteur_temp MCU = atmega328p F_CPU = 16000000 ARDUINO_PORT = /dev/ttyUSB* AVRDUDE_ARD_PROGRAMMER = arduino AVRDUDE_ARD_BAUDRATE = 57600 include /usr/share/arduino/Arduino.mk
Ensuite, un simple make
permettra de compiler le projet correctement. Pour envoyer le tout sur l'Arduino, il suffit de le brancher et de lancer la commande: make upload
Lecture depuis le PC
Pour lire depuis le PC, il suffit de brancher votre Arduino sur un port USB et de lancer la commande:
screen /dev/ttyUSB0 9600
Screen permettra d'afficher le contenu de ce qui est envoyé par l'Arduino sur l'écran. Le paramètre 9600 indique le débit (9600 bauds) que nous avons indiqués dans le code source.
Vous verrez alors des lignes du genre:
2.91 volts 17,31 °C 2,91 volts 17,31 °C 2,92 volts 17,89 °C …
Nous avons donc des données qui peuvent éventuellement être récupérées via un script pour former un fichier de données qui pourra être représenté de manière graphique (avec GNUPlot par exemple).
Note: Pour faire les illustrations de cet article et pour le prototypage, j'ai utilisé le logiciel Fritzing. Il n'est pas (encore) packagé sous Debian mais j'espère que ça changera bientôt. Ce logiciel est destiné à des débutants en électronique. Il utilise une représentation simple des composants, proche de ce qu'on peut faire avec une planche d'essai.