Sondes de température

J'ai couplé des sondes de température de type DS18B20 à l'Arduino. J'ai developpé un sketch (programme en C) coté micro controleur et un programme en perl coté serveur pour enregistrer les mesures dans rrdtool (base temporelle). 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, j'ai installé une des sondes 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 temporelle écrite en Go : InfluxDB couplé à un logiciel de restitution écrit en JS : Grafana.

InfluxDB

InfluxDB est une base NoSQL temporelle (les données sont indexées avec un timestamp) capable de se synchroniser sur plusieurs noeuds, de gérer des gros volumes de données… Avec RRD, il fallait indiquer à la création des tables la stratégie de rétention des données (fréquence d'échantillonage, durée de stockage des mesures…). Ici, l'approche est différente, toutes les données sont conservées. Il est tout de même possible de spécifier le nombre d'élément à conserver.

Installation sur une Debian 9 :

sudo apt install influxdb influxdb-client

Création de la base :

influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 1.0.2
InfluxDB shell version: 1.0.2
 
> CREATE DATABASE temperature;
> SHOW DATABASES;
name: databases
---------------
name
_internal
temperature

Pour ajouter une nouvelle mesure, un simple post suffit (documentation) :

curl -i -XPOST "http://popeye.home:8086/write?db=temperature&precision=s" --data-binary "ext.nord val=20"

Faire un select est tout aussi simple (documentation) :

curl -GET 'http://popeye.home:8086/query?db=temperature&pretty=true' --data-urlencode 'q=SELECT * FROM "ext.nord"'

Mesure de température

La récupération des valeurs de la temperature est effectuée avec mon script perl de récupération décrit précédemment. Celui ci a été enrichi pour poster sur la base à chaque mesure via un appel curl. Il est à noter qu'au moment de l'écriture de ces lignes, le module perl pour InfluxDB n'est pas compatible avec la version 1.0 que j'utilise.

Ce script est ordonnancé via une crontab toutes les 5 mins :

crontab -l
# temperature
   */5   *     *     *    *   ~/scripts/arduino/controller/temperature.pl

Grafana

Grafana est une IHM web produisant des graphiques de différents types à partir de nombreuses sources de données. Dans mon cas, je l'ai configuré pour s'alimenter sur ma base InfluxDB.

Température

La configuration est relativement simple et se déroule en quelques étapes.

  • Tout d'abord, récupérer le deb à partir du site officiel et l'installer.
  • Se connecter à l'IHM sur le port 3000 et se loguer avec admin / admin (original hein ;)).
  • Naviguer dans le menu Grafana pour ajouter une Datasource avec les informations suivantes :
    Champ Valeur
    Name temperature
    Type InfluxDB
    URL http://popeye.home:8086
    Access direct
    Database temperature
    Configuration de la datasource
  • Les dashboard + panel vont permettre de créer un graphique avec les données. Il est possible soit d'importer mon panel, soit d'en créer à la main :
    • Import : cliquer sur le menu Grafana puis importer et choisir mon panel :

      Importer dans Grafana
    • Création :
      • cliquer sur le menu Grafana puis New et nommer le dashboard;
      • Créer ensuite un panel en reprenant les données suivantes :

        Configuration du panel

        Valeur du 'Group by'

        Il faut veiller à valoriser les champs group by de la requête et en bas de la page avec une valeur cohérente avec la fréquence de mesure. Le script de récupération est lancé toute les 5 mins par cron, j'indique donc la valeur 5m.
      • Ajouter autant de query que de mesure en répétant l'étape précédente;
      • Tester les différentes valeurs des onglets suivants pour avoir la mise en page souhaité et sauvegarder.