Raspberry Pi : Mesurer la température avec un capteur DS18B20

Raspberry Pi : Mesurer la température avec un capteur DS18B20

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

Câblage d'un capteur de température DS18B20 à un Raspberry PiUne 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).

Câblage de plusieurs DS18B20 en série

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 ».