Le capteur DS18B20 est un capteur à coût réduit (10 € les 5 capteurs étanches avec câble de 1 mètre ou 8 € les 10 capteurs de base), qui utilise le protocole 1-wire. On peut connecter plusieurs capteurs DS18B20 en série sur un même port du Raspberry Pi. Nous allons voir ici comment connecter un seul thermomètre et en écrire la valeur dans un fichier txt par un script Shell ou PHP.
Connecter le capteur DS18B20
Une description détaillée du capteur DS18B20 est disponible en anglais ici. Le capteur peut mesurer des températures entre -55°C et +125°C et reste précis à 0.5°C sur l’intervalle -10°C à +85°C. Chaque capteur a un numéro de série unique (64 bits) et peut donc être identifié précisément.
Pour une seule sonde, on câble comme dans le schéma de droite (note du 29/12/2019 : ATTENTION, le schéma de droite est faux, le connecteur 1 est raccordé à GND, le connecteur 3 à VCC 3.3V !).
On peut mettre plusieurs capteurs en série (en théorie autant qu’on veut, en pratique il semble qu’il vaille mieux se limiter à 10 capteurs). Dans ce cas, on connecte une seule résistance 4.7 K et plusieurs sondes selon le schéma ci-dessous (note du 29/12/2019 : qui est juste, connecteur 1 raccordé à GND, 3 à VDD 3.3 V).
Paramétrer le Pi pour lire la / les températures
Editer /boot/config.txt
pour qu’il contienne la ligne suivante puis redémarrer le Pi :
dtoverlay=w1-gpio
Tester le/les capteurs
En ligne de commande, taper les lignes suivantes
sudo modprobe w1-gpio sudo modprobe w1-therm cd /sys/bus/w1/devices ls cd 28-xxxx (changer pour correspondre aux numéros de série qui s'affichent) cat w1_slave
Si le capteur est correctement câblé, on voit apparaître quelque chose qui ressemble à ce qui suit, où t=20187
signifie que la température est 20.187°C :
43 01 4b 46 7f ff 0d 10 bd : crc=bd YES 43 01 4b 46 7f ff 0d 10 bd t=20187
S’il y a plus d’un capteur de température, ls
dans /sys/bus/w1/devices
affichera plusieurs répertoires.
Installer les drivers sur le Pi
modprobe w1-gpio
et modprobe w1-therm
sont les drivers pour les capteurs de température. Ils doivent démarrer lorsque le Pi démarre. Pour celà, ajouter les lignes suivantes à /etc/modules
:
w1‐gpio w1‐therm
On redémarre le Pi et les drivers sont maintenant chargés.
Un script PHP pour lire les différentes températures
Noter que pour exécuter un script PHP en ligne de commande, il faut avoir préalablement installé PHP-CLI, avec la commande apt-get install php5-cli .
Le script read-temperature.php (exécutable) contient :
#!/usr/bin/env php <?php if (!defined("THERMOMETER_SENSOR_PATH")) { define("THERMOMETER_SENSOR_PATH", "/sys/devices/w1_bus_master1/28-0000046766b0/w1_slave"); } // Open resource file for thermometer $thermometer = fopen(THERMOMETER_SENSOR_PATH, "r"); // Get the contents of the resource $thermometerReadings = fread($thermometer, filesize(THERMOMETER_SENSOR_PATH)); // Close resource file for thermometer fclose($thermometer); // We're only interested in the 2nd line, and the value after the t= on the 2nd line preg_match("/t=(.+)/", preg_split("/\n/", $thermometerReadings)[1], $matches); $temperature = $matches[1] / 1000; // Output the temperature print $temperature . " °C. \n\r"; ?>
On l’exécute avec la commande en ligne php read-temperature.php .
Dans mon cas, il affiche 20.875 ▒C.
Un script Shell pour lire la température
Voir ce projet, en anglais. Il lit plusieurs températures à la fois et les affiche à l’écran du Pi sous la forme 28-0000046766b0=20.937 .
Pour ma part, je n’ai qu’une seule température à lire et je veux l’écrire dans un fichier texte que j’enverrai ultérieurement à un serveur distant.
Je crée le script read-status.sh, (avec encodage UTF8 sans BOM, retours chariot UNIX et droits d’accès 744) qui contient :
#!/bin/bash # afficher les variables d'environnement (utile pour un cron job) printenv # check my Hostname variable ThisHost=$(hostname) # Get UTC time UtcNow= date -u # There should be no ECHO in a CRON job, so comment this ! echo $ThisHost # $1 is the variable appended to the file when executed # example : ./send-status.sh essai would put "essai" in $1 # local file to write into FILE=$ThisHost"-status.txt" # local directory to write to file and pick it for upload REPERTOIRE="/home/jf/temp/" echo $REPERTOIRE$FILE #Read last temperature temperature=$(find /sys/bus/w1/devices/ -name "28-*" -exec cat {}/w1_slave \; | grep "t=" | awk -F "t=" '{print $2/1000}') # create file and add content to it cd $REPERTOIRE cat > $FILE <<EOF # single > will empty and overwrite the file pi hostname, time, statut, temperature $ThisHost, $UtcNow, $1, $temperature EOF
Attention, ce script ne lit que le dernier des capteurs de température.
On l’exécute avec la commande en ligne ./read-status.sh OK .
Dans le répertoire temp, j’ai maintenant un fichier piname-status.txt, qui contient :
pi hostname, time, statut, temperature piname, Sun 2 Apr 15:01:44 CEST 2017, OK, 21.312
Et maintenant ?
Je peux lire la température mesurée par le Pi et la noter dans un fichier texte à chaque fois que j’exécute ./read-status.sh OK en commande en ligne.
La prochaine étape sera d’envoyer les informations du fichier texte à un serveur externe de manière automatique. J’ai déjà décrit l’utilisation d’un cron job dans l’article « Cron Job sur un hébergement mutualisé OVH » mais je vais le réaliser sur un Raspberry Pi. Cest l’objet de l’article « Raspberry Pi : envoyer en ftp un fichier à un serveur, par Cron Job ».
bonjour,
Merci pour le tuto ca fonctionne pour moi avec 3 sondes 🙂
bonjour
juste pour signaler une inversion entre GND et Vcc sur le 1er croquis « Connecter le capteur DS18B20 »
cordialement
rb
Bonjour e cherche à lancer une alarme si la sonde dépasse une température fixé je brancherai un haut-parleur sur la sortie son du raspberry quelqu’un à il une idée? Merci d’avance