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)