Sondes de température

J'ai couplé des sondes de température de type DS18B20 à l'Arduino. J'ai developpé un programme en C coté micro controleur et en perl coté serveur pour enregistrer dans une base temporelle, rrdtool, les mesures. Pour l'affichage des données, rrdtool est capable de générer des graphiques simple. J'ai ensuite mis une base plus dynamique infuxdb pour pouvoir utiliser grafana permettant de zoomer/dezoomer, changer la plage de date….

Ces sondes de températures sont des capteurs numériques adressable sur BUS 1 Wire.

Sonde de témpérature DS18B20   Schéma de cablage

La connexion à l'Arduino est simple :

  1. la masse (GND) : sur le 0V;
  2. la data (DQ) : sur le port n°10;
  3. le plus (Vdd) : sur le 5V.

Il faut également ajouter une résistance, dite de pull up, entre la data et l'alimentation pour fiabiliser la lecture d'informations. Pour installer plusieurs sondes, il suffit de les brancher en parallèle. Une seule résistance est nécessaire pour toute l'installation.

Montage Arduino + DS18B20

06/2013 : de très nombreux articles (ici ou ) décrivent l'utilisation de cette sonde. Comme tout le monde, j'ai utilisé la lib OneWire pour interroger les sondes. Le sketch arduino est disponible sur mon gitlab. Celui fonctionne sur le même principe que le pilotage des cartes relais en ajoutant une commande supplémentaire t qui effectue les taches suivantes :

  1. requête le bus 1 Wire pour énumérer tous les devices connectés
  2. filtre sur les sondes de temperature DS18B20
  3. pour chaque sonde :
    1. interrogation et récupération de la temperature
    2. conversion en °Celsius
    3. affichage du résultat

Exemple d'utilisation :

$ picocom /dev/ttyACM0 -b 9600

> h
    ___          _       _
   / _ \        | |     (_)
  / /_\ \_ __ __| |_   _ _ _ __   ___
  |  _  | '__/ _` | | | | | '_ \ / _ \
  | | | | | | (_| | |_| | | | | | (_) |
  \_| |_/_|  \__,_|\__,_|_|_| |_|\___/

  Build Feb  7 2015 : 14:10:41

Help
Command available :
      <pin number [2-9]>=<0,1>
      h - help
      s - i/o status
      t - temperature

> t
Temperature :
ROM = [ 28 A 4C 3B 4 0 0 5B ] - Temperature : 13.69 °C
ROM = [ 28 6 AD 33 4 0 0 2D ] - Temperature : 15.38 °C
ROM = [ 28 65 DC 33 4 0 0 17 ] - Temperature : 18.06 °C

Ici les 3 sondes affichent leurs températures. La première est la sonde extérieure, la 2e dans le garage, 3e est très proche du serveur.

Côté serveur, le script perl de commande des relais a été repris et adapté afin d'ajouter l'interrogation des sondes de temperatures. Le tout alimente une base à taille fixe de type RRD (Round Robin Database) : rrdtool. Pour la visualisation des données, j'ai developpé un script perl dedié au rendu des données qui s'execute via un CGI sur le serveur web :

Exemple d'affichage pour la semaine   Exemple d'affichage pour l'année

En plus, un dernier script perl s'exécute tout les jours pour afficher sur le LCD, au moment où l'on quitte la maison, la température extérieur actuelle.

Pour mesurer la température extérieur, une des sondes installée dehors au niveau d'un des murs extérieur du garage. En suivant cette video, je l'ai rendu étanche : j'ai glissé la sonde dans un tube de crayon BIC en faisant dépasser d'un millimètre la tête de la sonde et rempli le tube de mastique de salle de bain. L'ensemble mesure 3/4 cm de long et je l'ai logé dans un boitier électrique étanche que j'ai ajouré pour que l'air circule. Le résultat final est propre et discret :

Sonde dans son boitier

  Boitier fermé

06/2015 : j'ai modernisé le mode de restitution des courbes de temperatures en mettant en place une base de données écrite en Go : InfluxDB. Un simple post permet d'ajouter une nouvelle donnée.

curl -i -XPOST 'http://localhost:8086/db/temperature/series?u=temp&p=XXX' -d '[{"name" : "ext. nord","columns": ["val"], "points": [[20]]}]'

Le script perl de grabbing des temperatures a été enrichi pour poster dans cette base.

Côté rendu, Grafana est utilisé. Cela permet d'avoir des graphiques plus sexy et dynamique : Température