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….
Composants
Ces sondes de températures sont des capteurs numériques adressable sur BUS 1 Wire.
La connexion à l'Arduino est la suivante :
- la masse (
GND
) : sur le 0V; - la data (
DQ
) : sur le port n°10; - 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.
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.
Récupération des valeurs
06/2013 : de très nombreux articles (ici ou là) 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 :
- requête le bus 1 Wire pour énumérer tous les devices connectés
- filtre sur les sondes de temperature DS18B20
- pour chaque sonde :
- interrogation et récupération de la temperature
- conversion en °Celsius
- 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 :
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.
Sonde extérieure
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 :
InfluxDB / Grafana
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.
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
- 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 :
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 valeur5m
.- 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.
Breadboard
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.
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é :