realisations:arduino:sondes_temperature

Sondes de température

J'ai branché des sondes de température de type DS18B20 à un Arduino. J'ai developpé un sketch (programme en C) coté microcontrôleur 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
Agrandir
Sonde de témpérature DS18B20
Pinout
Agrandir
Pinout

La connexion à l'Arduino est la suivante :

  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 faut les brancher en parallèle. Une seule résistance est nécessaire pour toute l'installation.

Montage Arduino + DS18B20
Agrandir
Montage Arduino + DS18B20

J'ai installé l'ensemble dans une boite en bois. L'Arduino est relié à une breadboard pour éviter de souder un circuit ce qui rendrait difficile les éventuelles évolution à venir.

Installation
Agrandir
Installation

06/2013 : de très nombreux articles (ici ou ) décrivent l'utilisation de cette sonde. 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
Agrandir
Exemple d'affichage pour la semaine
Exemple d'affichage pour l'année
Agrandir
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
Agrandir
Sonde dans son boitier
Boitier fermé
Agrandir
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 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"'

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 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
Agrandir
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
    Agrandir
    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 :
    • 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
Agrandir
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.

09/2018 : j'ai remplacé la grande breadboard par un shield Arduino en intégrant une plus petite. J'ai alors réorganisé un peu le cablâge et gagner de la place.

Shield Arduino Breadboard
Agrandir
Shield Arduino Breadboard

J'en ai profité pour ajouter un sonde de pression atmosphérique BMP280 et j'ai enrichit le sketch Arduino pour ajouter une nouvelle commande p retournant les valeurs lues par le capteur :

> p
Temperature = 25.70 *C
Pressure = 102352 Pa

Voici l'ensemble monté :

Shield Arduino Breadboard
Agrandir
Shield Arduino Breadboard
  • realisations/arduino/sondes_temperature
  • Dernière modification : 2024/09/30 21:37