Skip to content

1-wire : DS18B20

Description

Il s'agit d'un capteur de température :

  • peu cher (2 Euros)
  • qui réalise en interne la conversion analogique numérique
  • peut être connecté simplement sur 2 fils (technique dite 1-wire)
  • qui réalise une mesure de température sur la plage -55°C à + 125°C sans composant supplémentaire (polyvalent donc...)
  • qui renvoie le résultat de la mesure sous forme de données série sur 12 bits (précision de 0.0625°C)
  • plusieurs capteurs peuvent être utilisés simultanément sur les 2 mêmes fils grâce à un système d'adressage de chaque capteur qui possède une adresse unique (64 bits ROM soit 8 octets).
  • Facile à utiliser avec Arduino grâce à une librairie dédiée fournie.

En un mot, vous allez pouvoir utiliser de 1 à 20 capteurs 18B20 sur une seule broche de la carte Arduino pour mesurer des températures !

Brochage

Ce capteur présente 3 broches :

  • le +5V (Vdd) (entre 3.0 to 5.5V donc compatible carte 3.3V)
  • le 0V ou masse (GND)
  • la broche de communication série "1-wire" entrée/sortie (DQ) : cette broche est de type "drain ouvert" et devra être connectée au +5V par une résistance de 4,7 K.

Ce capteur est disponible en module « prêt à câbler » :

Montage type

Pour assurer l'alimentation par la masse, on connecte les broches +5V et 0V ensemble à la masse :

Structure interne

Le DS18B20 dispose d'une adresse 64 bits ayant la structure suivante :

Le DS18B20 dispose de 8 octets contenant les données utiles :

La température codée sur 12 bits sera exprimée sur 2 octets selon :

Le câblage à utiliser

Il y a 2 façons de câbler en pratique. Soit on utilise Vcc et dans ce cas, on met une résistance 4 .7K entre Data et Vcc :

Soit comme présenté précédemment, on peut l’alimenter via les « parasites », et dans ce cas, on met Vcc capteur à la masse.

Warning

Noter que même dans ce cas, Data devra être connecté à Vcc du micro-contrôleur via une résistance de 4.7K

Cas particulier : le DS18B20 encapsulé et étanche

Voici la connectique dans ce cas :

  • le vert ou noir est connecté à la masse GND (0V)
  • le rouge est connecté à Vcc compris entre 3.0 to 5.5V (connecter à la masse si on utilise l’alimentation par « parasite »)
  • le jaune ou blanc est connecté à la broche de l’Arduino.
  • Une résistance de 4.7K est à mettre entre data et Vcc

Warning

Ben en fait, çà dépend… J’ai eu un capteur de ce type où c’était le vert le data et le jaune le 0V… Le rouge Vcc… Bref, faut tester !

Librairies

Micropython

Montage type

Sur plaque essai avec le Pi Pico vertical :

Ce montage est compatible/identique avec l'utilisation d'un capteur étanche

Sur plaque essai avec le Pi Pico vertical et module "prêt à câbler" :

La lib

Lib 1-wire

La lecture du DS18B20 en micropython nécessite de la lib' 1-wire suivante (officielle projet Micropython) :

https://github.com/micropython/micropython/blob/master/drivers/onewire/onewire.py

Ouvrir un Terminal dans le répertoire libs de votre répertoires de codes Micropython. Téléchargement en ligne de commande avec :

wget https://raw.githubusercontent.com/micropython/micropython/master/drivers/onewire/onewire.py

A copier coller sur la carte avec notre utilitaire selon :

./copy.sh /dev/ttyACM0 onewire.py

Lib 18x20

La lecture du DS18B20 en micropython nécessite de la lib' 1-wire suivante (officielle projet Micropython) :

https://github.com/micropython/micropython/blob/master/drivers/onewire/ds18x20.py

Ouvrir un Terminal dans le répertoire libs de votre répertoires de codes Micropython. Téléchargement en ligne de commande avec :

wget https://raw.githubusercontent.com/micropython/micropython/master/drivers/onewire/ds18x20.py

A copier coller sur la carte avec notre utilitaire selon :

./copy.sh /dev/ttyACM0 ds18x20.py

Code d'exemple

Ce code assure la lecture simple du capteur à intervalle régulier via un Timer :

from machine import Pin, Timer

import onewire
import ds18x20

led=Pin(25,Pin.OUT) # la broche GP25 dispose d'une LED onboard

bus1wire=onewire.OneWire(Pin(18)) # declare bus1wire sur broche

adr=bus1wire.scan() # recupère coordonnees capteurs presents
#print(adr)

ds=ds18x20.DS18X20(bus1wire) # declare capteur

timer=Timer()

def loop(timer):
        #global led
        #led.toggle()
        roms=ds.scan() # lit le contenu du capteur
        ds.convert_temp()

        for rom in roms:
                print(ds.read_temp(rom))

# fin loop

timer.init(freq=1, callback=loop)

# d'apres http://www.esp32learning.com/micropython/esp32-and-ds18b20-sensor-and-micropython-example.php

Une variante du code précédent avec cette fois la mesure de délai de la lecture du capteur (on trouve 34ms pour la lecture de la température) :

from machine import Pin, Timer
import utime

import onewire
import ds18x20

led=Pin(25,Pin.OUT) # la broche GP25 dispose d'une LED onboard

bus1wire=onewire.OneWire(Pin(18)) # declare bus1wire sur broche

adr=bus1wire.scan() # recupère coordonnees capteurs presents
#print(adr)

ds=ds18x20.DS18X20(bus1wire) # declare capteur

timer=Timer()

def loop(timer):
        #global led
        #led.toggle()

        start=utime.ticks_us() # pour comptage delai mesure

        roms=ds.scan() # lit le contenu du capteur
        ds.convert_temp()

        for rom in roms:
                print(ds.read_temp(rom))

        print(utime.ticks_diff(utime.ticks_us(),start)/1e3) # delai mesure en ms

# fin loop

timer.init(freq=1, callback=loop)

Liens utiles :