Température suivie avec un Raspberry Pi B+, une sonde DS18B20 et Munin

La sonde DS18B20 est une sonde de température 1-wire très facile d'utilisation avec le Raspberry Pi. Il y a de très nombreux sites et blogs qui en rapportent l'utilisation : par exemple http://www.framboise314.fr/mesure-de-temperature-1-wire-ds18b20-avec-le-raspberry-pi/ ou https://learn.adafruit.com/downloads/pdf/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing.pdf.

Je vais toutefois reprendre ici les principales étapes et me concentrer ensuite sur le suivi et l'affichage de la température via Munin.

Matériel

  • Un Raspberry Pi B ou B+ avec des GPIO libres
  • Une sonde DS18B20 (composant avec 3 pattes)
  • Une résistance 4.7 KOhms (des valeurs proches peuvent convenir également)
  • Quelques câbles

Montage électrique

Les sondes 1-wire peuvent être alimentées de 2 manières : en alimentant une des pattes à 3.3V ou bien en laissant le composant charger un condensateur avec les parasites ambiants et utilisant la charge de ce condensateur pour effectuer une messure. La 2e méthode a l'avantage de nécessiter un câble de moins dans l'installation mais il est possible qu'il faille être un peu plus patient pour effectuer des lectures de température (quelques secondes pour charger le condensateur selon le niveau des parasites).

Dans la suite, nous alimenterons directement le composant en 3.3V.

Nous allons donc simplement connecter :

  • la masse du capteur à un pin de masse
  • l'alimentation du capteur au pin 3.3V du Raspberry Pi
  • la patte centrale (lecture) au GPIO 4

et nous allons ajouter la résistance de 4.7KOhms en parallèle avec la sonde i.e. entre l'alimentation 3.3V et la ligne de lecture.

raspberry-pi-ds18b20-connections.jpg (image empruntée sur http://www.reuk.co.uk/DS18B20-Temperature-Sensor-with-Raspberry-Pi.htm)

Attention à ne pas inverser la masse et l'alimentation - cela pourrait endommager le composant. On peut se référer à cette documentation pour être certain de ne pas se tromper : http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf. La masse se trouve sur la patte de gauche quand on regarde la face plate du composant avec les pattes vers le bas.

Paramétrons le Pi

On peut alors brancher le Pi, se connecter en SSH et charger les modules nécessaires à la lecture des GPIO :

modprobe w1-gpio
modprobe w1-therm

Il faut aussi modifier le fichier /boot/config.txt et ajouter cette ligne :

dtoverlay=w1-gpio

Pour ne pas avoir à les charger à nouveau à chaque re-démarrage du Pi, on ajoutera les 2 lignes suivants au fichier /etc/modules :

w1-gpio
w1-therm

Remarque : si vous prévoyez plus de 10 sondes, il est possible qu'il faille ajouter un fichier wire.conf dans /etc/modprobe.d avec ce contenu :

options wire max_slave_count=50

Si tout fonctionne, on doit alors voir un dossier au nom de la sonde apparaître dans le dossier /sys/bus/w1/devices :

cd /sys/bus/w1/devices
ls
>> 28-000005330085 w1_bus_master1

'' 28-000005330085'' est le nom de la sonde installée. Si nous avions plusieurs sondes sur le bus, nous verrions un dossier avec un nom unique pour chaque sonde. Si on entre dans le dossier, on accède aux différentes valeurs retournées par la sonde : le fichier w1_slave contient la température sur la 2e ligne en millièmes de degré Celsius :

4c 01 4b 46 7f ff 04 10 f5 : crc=f5 YES
4c 01 4b 46 7f ff 04 10 f5 t=20750

La petite ligne bash suivante (en remplaçant bien sûr le nom de ma sonde par celui de la vôtre !) extrait alors la température en °C :

cat /sys/bus/w1/devices/28-000005330085/w1_slave | grep "t=" | awk -F "t=" '{print $2/1000}'
>> 20.75

Relevons la température avec Munin

J'ai déjà évoqué Munin ici. Munin est un logiciel utilisé par le adminsys pour suivre les variables vitales de serveurs. Mais l'outil peut tout à fait être utilisé aussi pour suivre n'importe quelle variable accessible sur un ordinateur, par exemple la valeur de la température relevée par notre sonde !



Je ne détaillerai pas ici le paramétrage du serveur Munin (qui récolte régulièrement les données des clients, génère les graphes et les rend disponibles au travers d'un serveur http) mais seulement du client Munin.

On installe un client (noeud dans le vocabulaire de Munin) sur le Pi avec cette commande :

aptitude install munin-node

Le noeud/client munin fonctionne en récoltant les variables de scripts stockés dans /etc/munin/plugins : par défaut les plugins seront en fait des liens relatifs vers les scripts par défaut disponibles dans /usr/share/munin/plugins/. Si vous ne souhaitez suivre aucune variable vitale du Pi, vous pouvez supprimer tous les liens dans /etc/munin/plugins (si vous changez d'avis il suffira de les reprendre depuis /usr/share/munin/plugins).

Nous allons donc créer un nouveau script Munin pour collecter la température. Les scripts Munin sont tout simples - ils comprennent 2 parties : une partie qui décrit le graphique (et les éventuelles options graphiques que l'on souhaite voir appliquées) et une seconde partie imprime chaque variable et sa valeur sur chaque ligne. Par exemple, le script "memory" de Munin retourne les valeurs suivantes :

slab.value 8949760
swap_cache.value 0
page_tables.value 638976
vmalloc_used.value 954368
apps.value 21979136
free.value 291938304
buffers.value 35708928
cached.value 99397632
swap.value 0
committed.value 51347456
mapped.value 6803456
active.value 64913408
inactive.value 85291008

Nous allons donc générer un script qui imprime la valeur de notre sonde de la même façon dans /etc/munin/plugins :

nano temperature_1

et voici le contenu du script :

#!/bin/sh

case $1 in
   config)
        cat <<'EOM'
graph_title Temperature probe 1
graph_vlabel temperature_1
temperature_1.label temperature_1
EOM
        exit 0;;
esac

printf "temperature_1.value "
cat /sys/bus/w1/devices/28-000005330085/w1_slave | grep "t=" | awk -F "t=" '{print $2/1000}'

Si on exécute ce script (./temperature_1) voici la sortie :

temperature.value 21.5

On peut alors redémarrer le client Munin.

Lors de la prochaine collecte des données, le serveur Munin viendra récupérer la sortie du script temperature_1 et proposera alors les graphes standards de Munin pour cette valeur.

Si l'on dispose de plusieurs sondes, on peut alternativement multiplier les scripts (un script par sonde) ou alors demander au script d'imprimer les valeurs de chacune des sondes : les différentes valeurs seront alors affichées sur un même graphe !

ambient_temperature-day.png

Bon suivi de température !