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 quelquechose 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:

Schéma capteur de température basée sur LM335 et Arduino

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... Ca à 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ésitance 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 Sérial-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 webs (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.