Accueil > MICROPYTHON > MicroPython : capteur DS18B20 (sur esp8266 & esp32)
vendredi 24 avril 2020, par
capteur de température de -10°C à +85°C avec une précision de +/-0,5°C
capteur avec sortie numérique. La température est codée sur 9 à 12 bit (codage à virgule fixe avec 1 à 4 bits après la virgule). Le programme ci-dessous se limite à un codage sur 12 bit
communication sur une seule broche via le protocole 1-wire (onewire) https://fr.wikipedia.org/wiki/1-Wire
chaque capteur/périphérique sur le bus 1-wire est reconnu grâce à un numéro de série sur 64 bit gravé dans une ROM
alimentation de 3V à 5,5V
Remarque ESP8266 : les numéros de broches indiqués sur les cartes ne correspondent pas à la numérotation GPIO (General Purpose Input Ouptut).
Voir https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/
Dans les schémas suivants, la broche DATA du capteur est branchée sur la broche GPIO 14 de la carte de développement ESP8266.
Lien vers la documentation concernant la bibliothèque onewire : https://docs.micropython.org/en/latest/esp8266/tutorial/onewire.html
Le protocole 1-wire permet de brancher plusieurs capteurs sur le bus. Le programme suivant se limite au fonctionnement avec un seul capteur.
from machine import Pin import onewire import ds18x20 import time ow = onewire.OneWire(Pin(14)) sensor = ds18x20.DS18X20(ow) roms = sensor.scan() print('Numéro de série ROM : ',end='') for el in roms[0]: print('{:02X}'.format(el),end='') print() while True : sensor.convert_temp() time.sleep(1) print(sensor.read_temp(roms[0]))
Explications.
Dans un premier temps, il faut importer les bibliothèques :
machine et la classe Pin : pour configurer les broches
onewire : driver du bus au protocole 1-wire
ds18x20 : driver spécifique au capteur ds18B20
time : pour attendre la fin de la mesure du capteur
from machine import Pin import onewire import ds18x20 import time
On configure un bus de type 1-wire sur la broche 14. On crée un objet sensor de type ds18x20 afin de mettre en place le driver pour ce type de capteur.
ow = onewire.OneWire(Pin(14)) sensor = ds18x20.DS18X20(ow)
La méthode sensor.scan() permet de récupérer une liste (variable roms) de tableaux d’octets (donc du binaire) (type bytearray) correspondants aux numéros de série des capteurs. Chaque élément de la liste correspond au numéro de série d’un des capteurs branchés (si il y en a plusieurs).
roms = sensor.scan()
Comme il n’y a qu’un seul capteur dans cet exemple, on ne va prendre que le premier élément roms[0] afin de le décoder.
Ces lignes de code ne sont pas nécessaires au bon fonctionnement mais permettent de récupérer et afficher le numéro de série du capteur.
Pour chaque octet du tableau , on affiche la valeur en hexadécimal grâce à la méthode string .format() (https://docs.python.org/3/library/string.html#format-string-syntax)
0 | : | 0 | 2 | X |
la première variable transmise à format, soit byte | ce n’est pas un formatage par défaut (les options suivent) | L’affichage est complèté par des "0" (si par exemple un octet vaut 3, on affiche 03) | On affiche la valeur sur 2 caractères | L’octet est affiché en hexadécimal (et en majuscule) |
print('Numéro de série ROM : ',end='') for byte in roms[0]: print('{0:02X}'.format(byte),end='') print()
On entre dans la boucle infinie.
Déclenchement de la mesure de température et conversion en binaire
sensor.convert_temp()
La conversion sur 12 bit prends un temps minimum de 750ms. Le programme attend 1 seconde
time.sleep(1)
Le programme lit la température du premier capteur (définis par son numéro de série dans la rom) et l’affiche
temp = sensor.read_temp(roms[0]) print(temp))
Après exécution du programme, on obtient l’affichage suivant. Pour faire apparaître le traceur de courbes intégré à Thonny, il faut le sélectionner avec "Affichage -> Grapheur"