Skip to main content

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.

DS18B20-pinout.webp

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:

# senzor-ds18b20.py
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:

# senzory-ds18b20.py
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)teplota))
            sleep_ms(250)
else:
    print("Nepodarilo sa nájsť žiadny teplomer!")