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.
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).
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.
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 :
J'ai commencé par un montage un peu rustique avec un domino électrique, histoire de vérifier le bon fonctionnement de la sonde :
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 :
Un coup de pistolet à colle pour isoler les connecteurs entre-eux, très important pour ne pas provoquer de court-circuit en boitier fermé :
Pour ceux que ça intéresse voici les périphériques que l'on voit sur la photo :
- Module caméra officiel (raspicam)
- mini clavier sans fil iClever (voir mon test)
- clé WiFi Edimax (tutoriel)
- dongle z-wave
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 :
Ensuite cliquer sur l'onglet "Température" pour voir la sonde :
On peut lui donner un nom sympa avec le bouton "éditer" :
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 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
10 commentaires
Pourquoi ne pas utiliser le nas synology dans le cadre de ton système domotique ?
@Patrick: pas de GPIO sur le NAS, et puis je préfère que ce soit un RPi qui consomme nettement moins pour gérer tout ça
@Mr Xhark: effectivement ! Je suis un peu bloqué sur l'utilisation du NAS... 🙂
Bonjour, excusez moi serait il possible d'envoyer la température sur un site web ?
Bonjour,
oui tu peux :
Température
.°
Tu as juste a modifier la ligne ; "/sys/bus/w1/devices/28-0416543e58ff/w1_slave" par le numéro de t'as sonde
Bonjour,
Je souhaite ajouter cette sonde (DS18B20) à un raspberry pi 3 avec windows iot, tout cela codé en c#, quelqu'un pourrait m'aider ?
Merci d'avance
@JrQuentin9: hello, voilà une piste : http://gunnarpeipman.com/2016/01/measuring-temperature-with-windows-10-iot-core-and-raspberry-pi/
Merci pour ce billet qui répond à mes questions sur le branchement + résistance de la sonde.
Bonjour, rectificatif du mail pécédent
Presque tout fonctionne jusqu'au tableau qui ne veut pas s'afficher en mettant AUCUN DISPOSITIF DANS LES FAVORIS alors que la sonde est déclarée dans le matériel. Quand je clic sur température il m'indique PAS DE CAPTEUR .
Merçi d'avance pour votre aide
Bonjour à tous,
Je sollicite votre aide car mes dossiers dans /devices après installation de ma sonde ds18db20 rest vide, la commande cat w1_slave me dit qu'il n'existe pas de fihier de ce type...
J'ai bien fait et vérifié les branchements mais les dossiers dans /devices commencent tons par00-00... ou 00-a00....
enfin bref je suis perdu
Pourriez-vous m'aider ?
Merci d'avance !