El DS18B20 es un sensor de temperatura que proporciona la sortida mitjançant un bus de comunicació 1-Wire al que es poden connectar més sensors, i que poden ser llegits amb una única entrada digital de l'ESP32 (cada sensor DS18B20 té un codi de sèrie únic de 48 bits).
Podem trobar-lo en format TO-92 i en forma de sonda impermeable, que permet realitzar també mesures de temperatura en líquids.
Interval de temperatura de funcionament: -55ºC a +125ºC
Precisió +/-0,5 ºC (en el rang -10ºC i 85ºC)
Podria ser interessant llegir aquesta comparativa entre diferents sensors de temperatura abans d'escollir per a determinats usos.
PAUTES DE CONNEXIÓ
El sensor es connecta a un pin qualsevol d'entrada digital, fent un divisor de tensió amb una resistència de 4.7 kΩ entre l'entrada (pin 3 a l'exemple) i el pin d'alimentació. Aquesta resistència és necessària per controlar el bus de comunicació, i el seu valor depén de la longitud del cable de dades.
En cas d'utilitzar més d'un sensor DS18B20, es connecten tots al mateix pin. Només cal utilitzar una resistència 👇
PAUTES DE PROGRAMACIÓ
Per recuperar els valors mesurats pel sensor cal importar els mòduls onewire i ds18x20 de microPython, recuperar i convertir les dades del bus per tal d'obtenir valors de temperatura en ºC.
Si utilitzem dos o més sensors, en executar sensor.scan() es retornarà una llista. Només cal fer una variable per a cada element d'aquesta llista:
id_1 = dispositius[0]
id_2 = dispositius[1]
Per integrar aquest sensor en un programa complex amb més sensors i/o comportaments val la pena definir la recuperació de les seves lectures en una funció i definir les variables com globals perquè puguin ser reconegudes fora d'aquesta funció.
Desem el programa de recuperació de valors dins el dispositiu microPython, amb el nom termometre.py
El programa final
from onewire import OneWire
from ds18x20 import DS18X20
from machine import Pin
from time import sleep
pin = Pin(19)
sensor = DS18X20(OneWire(pin))
valors = 0.0
# esperar fins que es detecti el sensor (de vegades no el detecta)
while len(sensor.scan()) == 0: # Verifica si hi ha dispositius (len() retorna el núm de items en un objecte
sleep(0.01)
dispositius = sensor.scan()
# print ('dispositius trobats:', dispositius)
id1 = dispositius[0] # se guarda la dirección del primer dispositivo
def recupera():
global id1, valors
sensor.convert_temp()
sleep(0.75)
valors = round(sensor.read_temp(id1), 2)
while True:
recupera()
print ('temperatura =', valors, 'ºC')
sleep (1)
Podem utilizar ticks_ms i ticks_diff per eliminar les pauses bloquejants (proposta de Copilot):
from onewire import OneWire
from ds18x20 import DS18X20
from machine import Pin
from time import ticks_ms, ticks_diff
pin = Pin(19)
sensor = DS18X20(OneWire(pin))
valors = 0.0
start_time = ticks_ms()
while len(sensor.scan()) == 0:
if ticks_diff(ticks_ms(), start_time) > 10:
start_time = ticks_ms() # Reinicia el temporizador
dispositius = sensor.scan()
# print ('dispositius trobats:', dispositius)
id1 = dispositius[0]
def recupera():
global id1, valors
start_time = ticks_ms()
sensor.convert_temp()
while ticks_diff(ticks_ms(), start_time) < 750: # Esperar 0.75s de manera no bloqueante
pass # no facis res
valors = round(sensor.read_temp(id1), 2)
last_time = ticks_ms()
while True:
if ticks_diff(ticks_ms(), last_time) >= 1000: # Esperar 1 segundo de manera no bloqueante
recupera()
print ('temperatura =', valors, 'ºC')
last_time = ticks_ms()
Si utilitzem 2 sensors:
from machine import Pin
from onewire import OneWire
from ds18x20 import DS18X20 # per treballar amb el sensor DS18B20
from time import sleep
pin = Pin(3)
sensor = DS18X20(OneWire(pin)) # configuració de l'objecte ds18x20
dispositius = sensor.scan() # escaneja el bus i desa les adreces dels dispositius trobats dins la variable dispositius, que és una llista
print ('dispositius trobats:', dispositius)
id_1 = dispositius[0]
id_2 = dispositius[1]
while True:
sensor.convert_temp() # obté les dades de temperatura
sleep(0.75) # temps mínim per fer la conversió de les dades
print(sensor.read_temp(id_1))
print(sensor.read_temp(id_2))
time.sleep(5)
PAUTES DE MUNTATGE
A l'hora d'integrar el sensor en muntatges, si utilitzem el format sonda impermeable cal tenir en compte protegir-lo de la radiació solar directa, que pot escalfar la superfície del sensor i donar mesures errònies de temperatura.
En el nostre projecte de sonda estratosfèrica el vam protegir ficant-lo a dins d'un tub de paper higiènic.