4.6.2 Senzor DS18B20
Senzor DS18B20 umožňuje merať len teplotu (v rozsahu -55 až 125 °C, ±0,5 °C, rozlíšenie 0,06 °C), no má jednu zaujímavú výhodu - každý jeden senzor má svoj unikátny 64-bitový identifikátor (sériové číslo), čím je možné spoľahlivo rozlišovať pripojené senzory a využívať korekciu nameraných údajov cez individuálnu kalibráciu. Cena senzora je približne od 0,40 € (CN) / 4 € (SK), je možné ho kúpiť aj s káblom v kovovom puzdre, ktoré je možné ponoriť do vody.
Senzor komunikuje pomocou zbernice One-Wire (zahrnutá v MicroPython). V štandardnom zapojení pripájame komunikačný pin, zem a napájacie napätie (3,3 V), je však možné aj zapojenie bez potreby samostatného napájania - využíva sa „parazitné napájanie“ z komunikačného pinu. Komunikačný pin by mal mať externý pull-up rezistor s hodnotou 4,7 kΩ.
Aj keď sa pri veľmi krátkych prepojovacích vodičoch a jednom senzore môže zdať, že postačuje interný pull-up rezistor v ESP32, pri dlhších kábloch alebo viacerých senzoroch na zbernici začne komunikácia pre vysokú kapacitu kábla bez externého rezistora zlyhávať.
Pred meraním je možné nastaviť presnosť rozlíšenia - implicitne je nastavené najvyššie rozlíšenie (0,06 °C), kedy je na výsledok nutné čakať 750 ms, inak bude na výstupe prítomná ešte predošlá nameraná hodnota.
Pre používanie samotného senzoru máme k dispozícii v MicroPython zabudovaný objekt DS18X20 z modulu ds18x20, inicializujeme ho nasledovne:
from onewire import OneWire
from ds18x20 import DS18X20
teplomer = DS18X20(OneWire({dátový pin}))
Najskôr je potrebné skenovať zbernicu a získať zoznam pripojených senzorov objektovou funkciou scan(). Samotné meranie sa na všetkých pripojených senzoroch spustí funkciou convert_temp(), po uplynutí času merania si môžeme vyžiadať výslednú hodnotu pre každý senzor individuálne funkciou read_temp({adresa senzora}).
Senzor DS18B20 zo sady D1 Mini kit je pripojený k D2 (na ESP32 D1 Mini zodpovedá GPIO 21).
Ukážkový program
Jednoduchý program pre jeden teplomer na zbernici, bude merať (približne) každú sekundu:
from ds18x20 import DS18X20
from onewire import OneWire
from machine import Pin
from time import sleep_ms
from binascii import hexlify
teplomer = DS18X20(OneWire(Pin(21))) # ESP32 D1 Mini
s = teplomer.scan()
if len(s):
print("Teplomer:", hexlify(s[0]).decode())
while True:
try:
teplomer.convert_temp()
sleep_ms(750)
teplota = teplomer.read_temp(s[0])
except Exception:
print("Nastala chyba pri meraní! ")
sleep_ms(1000)
else:
print(f"Teplota: {teplota:.2f} °C", end = " \r")
sleep_ms(250)
else:
print("Nie je pripojený správny senzor!")
Za povšimnutie stojí prevod identifikátora (adresy) senzoru - najskôr ho funkciou hexlify() prevedieme do binárneho reťazca v šestnástkovej sústave, potom ho objektovou funkciou decode() prevedieme do bežného reťazca.
Druhý program je vylepšený - vypisuje teploty zo všetkých teplomerov na zbernici:
from ds18x20 import DS18X20
from onewire import OneWire
from machine import Pin
from time import sleep_ms
from binascii import hexlify
teplomer = DS18X20(OneWire(Pin(21))) # ESP32 D1 Mini
zoznam = teplomer.scan()
počet = len(zoznam)
if počet:
print("Našiel som {} teplomer{}:".format(počet, "" if počet == 1 else "y" if počet < 5 else "ov"))
for adresa in zoznam:
print("* adresa", hexlify(adresa).decode())
while True:
try:
teplomer.convert_temp()
sleep_ms(750)
teploty = [f"{teplomer.read_temp(t):.2f} °C" for t in zoznam]
except Exception:
print("Nastala chyba pri meraní! ")
sleep_ms(1000)
else:
print("Teplota:", ", ".join(teploty))
sleep_ms(250)
else:
print("Nepodarilo sa nájsť žiadny teplomer!")