Installation d’un capteur de température 1-wire DS18B20 sur Raspberry – partie 1

La série d’articles :

Raspi-logo

  • Partie 1 : Installation capteur DS18B20 et lecture en ligne de commande
  • Partie 2 : Lecture des valeurs avec un script Python basique
  • Partie 3 : Lecture des valeurs avec un script Python avancé et stockage dans une base MySQL

Le matériel nécessaire :

  • 1 raspberry pi fonctionnel avec Raspbian installé
  • 1 resistance 4700 ohms (jaune-violet-rouge)
  • 1 capteur de température DS18B20

Compter 1 euro sur amazon/ebay/aliexpress ou 2 euros pour la version étanche

ds18b20-dallas ds18b20-etanche

Le capteur DS18B20 de Dallas est un capteur numerique sur bus 1-wire, et ça tombe bien car Raspbian est déja configuré pour faire fonctionner le 1-wire (uniquement sur le GPIO 4). Du coup l’installation et l’utilisation de ce capteur est vraiment très simple.

De plus il est possible de mettre plusieurs capteurs 1-wire à la suite sur le même port . il suffit de les brancher en parallèle , une seule résistance suffit quelque soit le nombre de capteur.

Ce type de capteur peux se brancher de 2 manières :

  • en mode alimenté : 3 fils à brancher : positif , masse et data
  • en mode parasite : 2 fils à brancher : masse et data , le positif étant rélié à la masse

le mode parasite par contre demande plus de puissance pour réussir a convertir la temperature et le Raspberry n’est pas capable de la fournir. c’est pour ça que certaines personnes ont une sonde qui indique toujours 85°C

Il existe une version de cette sonde DSB18B20-P ou PAR qui se branche uniquement en mode parasite , faites attention lors de l’achat à bien prendre la version normale DS18B20

La résistance de pull up sert a maintenir un niveau haut sur la broche afin d’éviter les fausses mesures dues aux fluctuations du voltage

Pour brancher tout ce petit monde je vous conseille d’utiliser une nappe 26 fils

tuto pour en fabriquer une facilement avec une nappe IDE

le branchement est simple , 3 fils à brancher :

  • 1-la masse (GND): sur le 0v du Raspberry (broche 9)
  • 2-le data (DQ): sur le port GPIO 4 (broche 7) (il s’agit du port 1-wire du raspberry)
  • 3-le plus (Vdd) : sur le 3.3v (broche 1)

et la resistance (pull-up) entre le 3.3v et le data
pour la version etanche ca depend de la couleur des fils mais en général on a le fil noir pour la masse , le rouge pour le 3.3v et le jaune ou bleu pour le data

Il faut par contre absolument faire attention au sens de branchement. sinon le capteur va très rapidement chauffer et claquer. Donc,  touchez le capteur juste après avoir mis votre circuit sous tension. Si il chauffe, coupez tout et recommencer votre branchement!

Voila le plus dur est fait , maintenant pour lire la température c’est vraiment ultra facile , il suffit juste de savoir lire un fichier sous linux

Test du capteur :

Connectez vous sur la console avec votre logiciel habituel, par exemple PuTTy puis tapez les commandes suivantes :

 
éditez le fichier
/boot/config.txt 
et ajoutez cette ligne à la fin
dtoverlay=w1-gpio

puis rebooter le raspberry:


sudo reboot

Une fois la machine rebootée passons a la suite :

Ces deux commandes vont permettre à linux de charger les modules et de communiquer avec la sonde. 

sudo modprobe w1-gpio
sudo modprobe w1-therm

Si vous voulez charger ces modules directement au boot, éditez le fichier
/etc/modules
et ajoutez ces 2 lignes à la fin

w1-gpio
w1-therm

sous linux tous les péripheriques sont gérés comme des fichiers, on se déplace donc dans le répertoire des péripheriques et on liste le contenu, chaque sonde possède un numéro de série , si vous avez mis plusieurs sondes vous verrez plusieurs répertoires commencant par 28 (en fait il s’agit de lien vers les répertoires) chez moi j’ai mis 3 sondes:

cd /sys/bus/w1/devices/
ls -l

ScreenShot001

déplacez vous dans le répertoire de votre sonde

cd 28-xxxxxxxx
ls -l

ScreenShot002

et affichez le contenu du fichier qui nous intéresse w1_slave qui contient la température :

more w1_slave

ScreenShot003

la température est indiquée en degrés celsius x1000 à la fin de la 2 eme ligne, il suffit donc de diviser par mille pour avoir la température exacte , ici 20.75 °C

Et voila votre maitrise du Raspberry viens d’augmenter un peu 🙂

Comprendre le fonctionnement du  fichier w1_slave:

En réalité ce fichier n’est pas mis a jour en permanence ,le capteur n’envoi la température que si on lui demande et pour lui demander …il suffit de lire le fichier 🙂 .

en effet au moment d’afficher le fichier ( que ce soit avec un cat , un more, un vi …) celui ci est vide mais linux va envoyer une requete au capteur , qui lui  renvoi la valeur qui au final est stocké dans le fichier et enfin le fichier s’affiche sous vos yeux emerveillés.

C’est ce qui explique la petite latence entre la demande d’affichage et la réponse .

Par defaut  la durée  du calcul (convertion time) est de 750 ms avec une résolution sur 12 bits

Cette latence n’est pas le fruit du hasard , les sondes DS18B20 ont une résolution modifiable.

Resolution 9 bit 10 bit 11 bit 12 bit
Conversion Time (ms) 93.75 187.5  375  750
LSB (°C) 0.5 0.25 0.125  0.0625

 Attention la différence entre les résolutions n’est pas synonyme de marge d’erreur ou de précision, simplement l’échelle est gradué  de 0.5° en 0.5° sur 9 bits ou de 0.0625° sur 12 bits mais la marge d’erreur reste de 0.5° tout le temps

De tout façon il me semble que sur le module w1-therm de Raspbian il n’est pas prévu de pouvoir modifier cette résolution donc on est sur 12 bits par défaut.

 le fichier contient 2 lignes avec des valeurs en hexa et en clair.

ce qui nous interesse c’est la fin en clair des 2 lignes.

la 1 ère contient soit YES soit NO

si c’est YES ça veut dire que la 2 ème ligne contient la température

si c’est NO ça veut dire que le capteur n’a pas réussi a lire la température , ce qui peut arriver de temps en temps a cause de parasite. il suffit de relire une 2 ème fois .

La température est indiquée  à la fin de la 2 eme ligne, il faut diviser par 1000 pour avoir la température exacte.

Voila , dans la partie 2 nous verrons comment lire cette sonde avec un script python

20 réflexions sur “Installation d’un capteur de température 1-wire DS18B20 sur Raspberry – partie 1

  1. Bjr; mon capteur affiche t=85000 soit 85°C. Je travaille à 10cm de raspberry, ce n’est donc pas pb de longueur de fil. mon capteur est reconnu, la fin de la premiere ligne est bien YES
    Avez vous une idée sur l’origine de ce pb?Merci

    J’aime

    • Je sais qu’il existe un bug sur ces capteurs qui fait que de temps en temps de manière aléatoire ils affichent t=85000. du coup la plupart des gens ajoute un test dans le script de lecture qui permet de relancer la lecture si la valeur est 85000. par contre si ça affiche 85000 en permanence ça veut dire que tu as acheté un DS18B20-P , P pour mode Parasite , et ca ne se cable pas pareil.
      de plus le mode Parasite necessite un gros pull-up que le raspberry ne semble pas capable de fournir.
      je te conseille de racheter un DS18B20 normal , ou sinon essaye de googler sur le mode parasite , peut etre que quelqu’un a reussi

      J’aime

  2. Bonjour,
    Merci pour ce site où on apprend des choses. D’abord que la résolution de conversion est de 12 bits par défaut avec w1-therm, et ensuite que le fichier w1_slave est mis à jour à chaque lecture. Ca pourrait être une réponse à mes problèmes de conversion très fréquents quand je lis mes températures.
    Quelles sont vos sources svp ?
    Voici mes températures http://82.227.40.57/jpt/ws_temp_jd.html et les programmes ici http://82.227.40.57/public/
    Si vous avez une idée ?
    Merci

    J’aime

  3. Merci pour ce tuto 🙂

    Dans mon cas la sonde n’était pas détectée, j’ai du ajoute ceci dans /boot/config.txt :

    dtoverlay=w1-gpio
    

    Il semblerait que ce soit lié à des modifications dans le firmware de début 2015 (avec l’arrivée du Pi2) cf https://www.fanjoe.be/?p=1332

    Et ensuite nickel 🙂 J’ai utilisé une résistance de 4,7K pour 1M de câble environ pour info

    J’aime

  4. Bonjour.

    Je me permet de poser ce lien qui me semble assez utile concernant la mise en place de nombreux DS18B20 ou autre 1-WIRE devices sur de grandes longueurs : (ajout d’une résistance de 100-120 Ohm en série de chaque pin DATA de DS18B20 avant de connecter le capteur au bus et ajout d’une diode Schottky type 1N5817 entre DATA (Cathode) et GND (Anode)
    en fin de bus.

    http://dreamgreenhouse.com/designs/automation/1wire/index.php

    Il y est fait usage d’une version ancienne (le DS18S20) mais je pense que les conseils s’appliquent à tous les 1-WIRE devices.

    J’aime

  5. Bonjour

    Je n’arrive plus a lire mes capteurs DS18B20 après une nouvelle réinstallation de ma RASBIAN 4.4.43.
    J’ai bien fait les manip indiquées par Xhark le 15 aout 2015, mais rien y fait.

    Cela à bien changé quelque chose puisque dans :
    cd /sys/bus/w1/devices/
    apparait maintenant
    « w1_bus_master1 »
    qui n’apparaissait pas avant, cependant, je n’ai toujours pas de sonde 28-xxxxxxxxxx.

    D’autre part, je ne me souviens pas avoir fait toutes ces manipulations lors la première mise en œuvre de ce « tuto »

    J’aime

  6. Oups !
    Je n’ai pas la possibilité mon post précédant, mais en fait, j’avais « juste » une erreur de connectique !

    N’en reste pas moins que je ne me souviens pas avoir effectué les manip indiquées par Xhark le 15 aout 2015 lors de la première install, or il me semble qu’avant d’avant mon soucis de connectique j’avais le problème évoqué concernant cette mise à jour !

    J’aime

Laisser un commentaire