(modifié le 9 décembre 2017 à 1:12)

Afin d'optimiser le fonctionnement de ma chaudière à gaz j'ai voulu connaître la température ambiante de mon logement. Comment ? Chaque pic de température correspond à la mise en route chaudière.

domoticz_temp-graph

C'est naturellement à mon Raspberry Pi B+ que j'ai confié cette mission pour communiquer avec une sonde DS18B20. Ce tutoriel fonctionne avec toutes les versions de Raspberry Pi. Après avoir utilisé Raspbian je suis passé sous Domoticz.

La sonde DS18B20

Après quelques recherches sur une sonde compatible avec mon Rasperry Pi une seul ressort majoritaitement : la sonde Dallas DS18B20.

Vous en trouverez pour moins de 3 euros :

  • sur Amazon
  • sur eBay

Cette sonde utilise le bus 1-wire et se connecte directement sur le GPIO en 3,3v et peut mesurer une température allant de -55 °C à +125 °C, avec une précision de ±0,5 °C (entre -10 °C et +85 °C). La résolution programmable est de 9 à 12 bit (voir ce tutoriel).

ds18b20

La sonde existe sous deux formes :

  • un composant à souder (3 pattes similaire à un TO92)
  • étanche avec une longueur de fil variable (3 fils)

J'ai opté pour le format étanche (1m) afin de déporter la sonde facilement, pour ne pas que la chaleur dégagée par le Rasperry soit ressentie par la sonde, aussi mineure soit-elle.

La sonde DS18B20 peux se brancher de 2 façons :

  • en mode alimenté : 3 fils (positif, masse, data)
  • en mode parasite : 2 fils (masse, data) - le positif est rélié à la masse

Le mode parasite nécessite plus de temps pour récupérer la température, le temps que le condensateur à l'intérieur de la sonde soit plein, environ 2 secondes. C'est pour cette raison que certains sur le web se plaignent de récupérer une température de 85°c en mode alimenté (t=85000), ou bien c'est que la sonde n'est pas une DS18B20.

Il existe plusieurs versions de cette sonde. Les versions DSB18B20-P ou et DS18B20-PAR  se branchent uniquement en mode parasite. Je vous conseille de bien vérifier la référence DS18B20.

Connexion de la sonde

La sonde dispose de 3 fils :

  • noir (masse - gnd)
  • rouge (+3,3v)
  • jaune ou bleu pour les données (data)

Pour fonctionner sur le bus 1-wire il faut ajouter une résistance entre le 3,3v (rouge) et les données (jaune ou bleu). On appelle ça une résistance "pull-up", elle permet de maintenir un niveau haut sur la broche de données afin de ne pas impacter les mesures quand le courant fluctue.

schema-ds18b20

La valeur de la résistance doit se situer entre 4 kΩ et 10 kΩ, en fonction de la longueur du fil, la mienne est de 4,7 kΩ pour 1 mètre de fil. Plutôt que d'acheter une pack de résistance d'une valeur fixe je vous conseille ce kit à moins de 4 euros :

kit-elec

J'ai commencé par un montage un peu rustique avec un domino électrique, histoire de vérifier le bon fonctionnement de la sonde :

montage-domino

G pour GND (masse), D pour Data, "+" pour 3,3v. Les fils ayant une croix verte ne sont pas utilisés, j'ai recyclé une connectique pour le test c'est pourquoi ce montage es très brouillon 🙂 Si vous avez un breadboard ce sera nettement plus pratique, depuis j'ai acheté celle-ci à moins de 2 euros.

Pour le montage définitif j'ai acheté des connecteurs duponts que j'ai fixés sur les 3 fils de la sonde pour les connecter directement sur le GPIO :

gpio-zoom

Un coup de pistolet à colle pour isoler les connecteurs entre-eux, très important pour ne pas provoquer de court-circuit en boitier fermé :

rpi-boitier-detail

Pour ceux que ça intéresse voici les périphériques que l'on voit sur la photo :

J'ai percé un trou proche de la sortie du GPIO pour le cable de la sonde. Faite un noeud pour que si quelqu'un tire sur la sonde cela n'arrache pas le GPIO.

Pré-requis

Nous devons activer deux modules dans le kernel Linux pour communiquer avec la sonde.

Ajouter ceci dans le fichier /etc/modules :

w1-gpio
w1-therm

Redémarrer le Raspberry Pi, ou activer les modules sans reboot :

sudo modprobe w1-gpio; sudo modprobe w1-therm

Ajouter dans le /boot/config.txt :

dtoverlay=w1-gpio

Cette modification règle un problème lié aux mises à jour de firmware du Pi datant de début 2015.

Si vous avez une Raspberry Camera et qu'elle ne fonctionne plus avec l'activation des deux modules, ajouter tous ces modules dans le fichier /etc/modules :

pi@domoPi ~ $ more /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.
snd-bcm2835
i2c-bcm2708
i2c-dev
w1-gpio
w1-therm

Puis blacklister-les dans /etc/modprobe.d/raspi-blacklist.conf :

pi@domoPi ~ $ more /etc/modprobe.d/raspi-blacklist.conf
# blacklist spi and i2c by default (many users don't need them)
blacklist spi-bcm2708
blacklist i2c-bcm2708

Merci framboise314 pour l'astuce.

Première communication avec la sonde

Sous GNU/Linux les péripheriques sont gérés comme des fichiers. Il faut aller dans le répertoire /sys/bus/w1/devices contenant ces périhériques pour les lister. En réalité il s'agit de liens symboliques mais ce sera transparent pour vous.

Chaque sonde est identifiée par son numéro de série unique de 8 octets précédé d'un octet indiquant le type de sonde (28h pour la DS18B20). L'activation des modules génère la création du répertoire correspondant à la sonde.

Exemple :

ls /sys/bus/w1/devices/
28-021561a1f9ff w1_bus_master1

La température est lisible dans le fichier w1_slave :

more /sys/bus/w1/devices/28-021561a1f9ff/w1_slave
27 01 80 80 7f ff 7f 80 a6 : crc=a6 YES
27 01 80 80 7f ff 7f 80 a6 t=18437

La température est affichée en celcius x1000. "t=18437" correspond à 18,437 °C. Si au lieu de "YES" vous avez "NO" alors c'est que le bus n'est pas parvenu à communiquer avec la sonde.

Comme je vous le disais il ne s'agit pas d'un simple fichier statique. Ce n'est pas le capteur qui écrit dans ce fichier à intervalle régulier, lorsque vous affichez son contenu le bus 1-wire va interroger la sonde et vous afficher la valeur. D'où ce léger délai avant le retour de la température.

Et voilà vous savez lire la température grâce à la sonde DS18B20 !

Lecture de la température par script

Il existe plusieurs langages pour récupérer la température : python ou shell (bash).

Voici la commande que j'utilise :

cat /sys/bus/w1/devices/28-*/w1_slave | grep "t=" | awk -F "t=" '{printf("%.1f\n", $2/1000)}'

Aucun ID à préciser, simple et efficace!

Si vous préférez avoir deux chiffres après la virgule :

cat /sys/bus/w1/devices/28-*/w1_slave | grep "t=" | awk -F "t=" '{printf("%.2f\n", $2/1000)}'

Insérez le code dans un script.sh si vous préférez l'appeler que de saisir la ligne en CLI.

Ajout de la sonde dans Domoticz

Le terminal c'est bien mais une interface web avec un historique ce serait quand même plus sympa. Domoticz gérant nativement la sonde nous allons l'ajouter.

Dans Réglages > Matériels :

domoticz_ajout-1-wire

Ensuite cliquer sur l'onglet "Température" pour voir la sonde :

domoticz_temp-ambiante

On peut lui donner un nom sympa avec le bouton "éditer" :

domoticz_editer-sonde

L'ajustement permet d'affiner la température remontée si vous constatez que la sonde est légèrement décallée. Sur la mienne j'ai ajouté 0,6°c car elle était légèrement en dessous de la température réelle.

Le bouton log permet de consulter l'historique des températures enregistrées :

domoticz_temp-graph

Domoticz réalise une mesure toutes les 30 secondes et il n'est pas possible à ma connaissance de modifier cet intervalle.

Vous pouvez créer un ramdisk pour limiter les écritures sur votre carte microSD. J'ai modifié le fichier /etc/init.d/domoticz.sh de la sorte :

DAEMON_ARGS="-daemon -www 8080 -log /ramdisk/domoticz.log"

Il faudrait aussi faire de même pour la base de données de collecte, mais je n'ai pas encore eu le temps de me pencher dessus.

Conclusion

Pour quelques euros nous avons maintenant une sonde de température, directement pilotée par le Raspberry Pi.

La sonde étant étanche vous pouvez très bien la mettre dehors tout en laissant le RPi à l'intérieur. Et pourquoi pas ajouter plusieurs sondes car une seule résistant suffit pour ajouter autant de sondes que vous voulez.

J'ajoute le datasheet de la sonde DS18B20 si vous cherchez une info technique précise. Deux autres billets sur la domotique seront bientôt publiés (RFXcom et delta dore).

note : si vous utilisez plusieurs sondes une seule résistance de 4,7K est nécessaire, que vous soyez en mode alimenté ou parasite (voir schema ici).

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter