Fyzikální kabinet FyzKAB

ESP32 a čidlo DHT11/22 v MicroPythonu

V předchozích článcích jsme si představili, jak lze modul ESP32 programovat v jazyce MicroPython, ale upřímně řečeno, co by to bylo za mikrokontrolér, kdybychom jej nepožili ve spojení s nějakým čidlem. Zkusíme se tedy v následujících článcích postupně zaměřit na ovládání a obsluhu některých základních čidel v programovacím jazyce MicroPython.

První vlaštovkou v tomto našem počinu bude čidlo DHT11 (resp. DHT22), které slouží pro měření teploty a vzdušné vlhkosti. Určitě jednou ze základních aplikací, do kterých se „bastlíři“ pokoušejí pustiti, je nějaké jednoduchá meteorologická stanice, tak proč zrovna nezačít měřením teploty a vlhkosti. Následující obrázek č. 1 zachycuje obě čidla (tj. DHT11 a DHT22) určená pro měření základních meteorologických veličin. Obě tyto čidla jsou poměrně oblíbená a můžeme je najít v nejedné aplikaci. Relativně příznivá je i jejich cena, kdy číslo DHT11 lze zakoupit za cenu od 50 Kč a čidlo DHT22 od 150 Kč (pochopitelně dle prodejce). Dokonce obě tato čidla jsou tak populární, že jejich řídicí knihovny jsou již standardně součástí MicroPythonu! A tak to už je důvod, proč se na ně podívat podrobněji.

DHT11 a DHT22
Obr. 1 – Srovnání čidel DH11 a DHT22

Na samý začátek se podíváme na parametry obou čidel, ať víme, co od nich můžeme očekávat a hlavně, jaký je mezi nimi rozdíl, kromě barvy, velikosti a ceny. Senzory DHT11 a DHT22 (také známý jako AM2302) se používají podobně, ale mají určité rozdíly. DHT11 má modré pouzdro, zatímco DHT22 má bílé pouzdro a je o něco větší (viz obr. 1). Více rozdílů nám ukáží následující tabulky srovnání.

DHT11
Přesnost teploty±2 °C
Přesnost vlhkosti±5 %
Teplotní rozsah0–50 °C
Rozsah vlhkosti20–90 %
Rychlost měření1 s
Napájecí napětí3–5,5 V
Proud∼2,5 mA

Tab. č. 1 – Specifikace čidla DHT11

DHT22 (AM2302)
Přesnost teploty±0,5 °C
Přesnost vlhkosti±2 %
Teplotní rozsah–40 až +80 °C
Rozsah vlhkosti0–100 %
Rychlost měření2 s
Napájecí napětí3–6 V
Proud∼1,5 mA

Tab. č. 2 – Specifikace DHT22 (AM2302)

Jak v předchozích tabulkách vidíme, čidlo DHT22 je přesnější, má širší interval použití, ale je na druhou stranu pomalejší. Upřímně řečeno obě čidla zrovna rychlostí neoplývají, ale pro výrobu nějakého DIY IoT projektu typu jednoduché meteostanice, budou dostačovat. V tom případě je čidlo DHT22 asi lepší volbou pro měření venkovní teploty, protože zvládne teploty od –40 °C.

Zapojení snímačů DHT11 a DHT22 k modulu ESP32

Senzory DHT11 a DHT22 (dále jen DHTxx) mají 3 až 4 piny v závislosti na provedení čidla. Holé čidlo má zpravidla vývody čtyři, ale jedno není použito, pokud je čidlo zapájeno do destičku DPS, takto vzniklý modul mívá vývodu jen tři. Situaci zachycuje obrázek č. 2.

Sensory DHT11 a DHT22
Obr. č. 2 – schéma vývodů čidel DHT11 a DHT22

Bohužel rozmístění jednotlivých vývodů závisí na konkrétním výrobci modulu, takže je třeba před zapojením čidla dávat pozor!

Další věc, na kterou si musíme dát pozor, je případný pull-up rezistor (4,7 kΩ až 10 kΩ), který může být zapojený mezi pin kladného napájení (+Vcc) a signálovým pinem (S). Pokud používáme holé čidlo, patrně mezi těmito vývodu pull-up rezistor není, v případě zapájení čidla DHTxx v podobě modulu na malé destičce DPS, asi tento rezistor na DPS bude připájen. Není na škodu přidat odpor, i když to není nezbytně nutné.

Pro připojení čidla DHTxx můžeme pro načítání signálu použít jen jeden (libovolný) GPIO pin modulu ESP32, který lze použít jako digitální vstup. (tzv. One Wire Protocol). Pro napájení čidla použijeme piny s napětím 3,3 V a GND.

V některých návodech se uvádí, že je možné zapojit čidla i na napětí 5 V, ale s ohledem na zmíněná pull-up rezistor mezi napájecím napětím a signálovým pinem to s ohledem na třívoltovou logiku modulu ESP32 rozhodně nedoporučujeme!

Jako příkladu ukázkového propojení čidla DHTxx s modulem ESP32 můžeme využít propojení popsané v následující tabulce.

Čidlo DHTxxModul ESP32
+Vcc3V3
SignalD4
GNDGND

Tab. č. 3 – propojení čidla DHTxx a modulu ESP32

Schéma zapojení znázorňuje obrázek č. 3. Pokud naše čidlo nemá pull-up rezistor, přidáme rezistor 4,7 kΩ–10 kΩ mezi piny 3V3 a signál ( GPIO4).

schéma DHT11 - ESP32
Obr. č. 3 – schéma připojení čidla DHT11
(červeně naznačena možnost přidání pull-up rezistoru, pokud není součástí čidla)
připojení DHT11 k ESP32
Obr. č. 4 – Připojení čidla DHT11 k modulu ESP32

Načítání čidla DHTxx pomocí MicroPython

Pro komunikaci se senzory DHTxx budete využívat knihovnu, protože pro svou komunikaci používá proprietární protokol. Dobrou zprávou je, jak již bylo naznačeno, že MicroPython má tuto knihovnu již vestavěnou, takže nebudete muset nic stahovat a instalovat!

Knihovna (modul) pro řízení čidela DHT11 i DHT22 se jmenuje DHT a můžeme ji importovat stejně jako většinu modulů, které jsme do teď používali. Pro přístup k danému čidlu následně stačí vytvořit objekt DHT11(), případně DHT22() podle použitého čidla. Argumentem této instance je signálový pin, na kterém budeme čidlo načítat. Měření pak spustíme metodou measure() a již se můžeme dotazovat na jednotlivé měřené veličiny metodami temperature() a humidity(). Jednoduchá čidla mají i jednoduché příkazy! 😉

Následující ukázkový kód ukazuje základní obsluhu čidel DHTxx:

from machine import Pin
from time import sleep
import dht

sensor = dht.DHT11(Pin(4))
# sensor = dht.DHT22(Pin(4))
# podle cidla nastavte instatnci objeku

while True:
    try:
        sleep(1)   # pro cidlo DHT11 je třeba cekat 1s
        # sleep(1)  # pro cidlo DHT22 je třeba pridat ještě 1s
        # podle cidla nastavte cas cekani
        sensor.measure()
        print(f"Teplota: { sensor.temperature():.1f }")
        print(f"Vlhkost: { sensor.humidity():.0f }")
    except OSError as e:
        print('Problem s nactenim cidla')

Poznámka:
Mezi každým měřením se přidává čekací čas, který zohledňuje rychlost čidla. V případě čidla DHT11 je to jedna vteřina, pro čidlo DHT22 to jsou vteřiny dvě. Celý blok načítání čidla je vložen do struktury try, except, která dokáže podchytit případnou chybu načtení čidla. Pokud dojde k jakékoliv chybě při čtení čidla, nebude generována chyba programu, ale vyvolá se blok except, který vypíše na výstup chybovou hlášku.

Zajímavou strukturou v Pythonu je použití tzv. f-string pro zobrazení proměnných v textu. Asi jsme to již v některém dřívějším článku zmiňovali, ale raději to připomeneme. Tato struktura začíná znakem f a proměnná, která bude do textu vložena, musí být uzavřena ve složených závorkách. Zde dokonce máme zadán počet desetinných míst, která se mají zobrazit, a to přidáním :.1f nebo .0f. Měli bychom si však promyslet, zda i výpis naměřených hodnot teploty na jedno desetinné místo je v případě čidla DHT11 dobrý nápad – když se podíváme na přesnost čidla. V případě vlhkosti máme pro formát výpisu zadanou nulu, protože oba snímače jsou v případě měření vlhkosti přesné pouze na celá procenta!

Funkci programu máme zobrazenou v terminálu prostředí Thonny IDE. Teplota je vyjádřena ve stupních Celsia, zatímco vlhkost je vyjádřena v procentech.

program DHT11
Obr. č. 5 – Výstup z čidla DHT11 ve výstupu prostředí Thonny IDE

Pocitová teplota

Abychom alespoň k výše uvedenému programu, který je standardní ukázkou použití čidla DHTxx v MicroPythonu, přidali něco netradičního, zkusíme jej rozšířit o možnost výpočtu jednoduché pocitové teploty (též tzv. tepelný index). Pocitová teplota se snaží zohlednit pocit subjektivního vnímání teploty a vlhkosti. Pocitová teplota je vyjádřená ve °C, ale zohledňuje nejen teplotu, ale i množství vlhkosti ve vzduchu. Když je vzduch vlhčí, je pocitově teplota vyšší, než skutečná naměřená teplota teploměrem teploměr.

Následující vzorec (získáno z Wikipedie) ukazuje, jak z naměřených hodnot teploty a relativní vlhkosti získat hodnotu pocitové teploty Pt:

Pt = –8,78469475556 + 1,61139411 t + 2,33854883889 h – 0,14611605 t·h – 0,012308094 t2 – 0,016424827778 h2 + 0,002211732 t2·h + 0,00072546 t·h2 – 0,000003582 t2·h2 (1)

kde t je teplota dosazená ve stupních Celsia, h je relativní vlhkost v procentech (0–100)

Nás program pak upravíme následujícím způsobem:

from machine import Pin
from time import sleep
import dht

sensor = dht.DHT11(Pin(4))
# sensor = dht.DHT22(Pin(4))
# podle cidla nastavte instatnci objeku

def Pt(t, h):
    pt = -8.78469475556
    pt += 1.61139411*t
    pt += 2.33854883889*h
    pt -= 0.14611605*t*h
    pt -= 0.012308094*(t**2)
    pt -= 0.016424827778*(h**2)
    pt += 0.002211732*(t**2)*h
    pt += 0.00072546*t*(h**2)
    pt -= 0.000003582*(t**2)*(h**2)
    return pt

while True:
    try:
        sleep(1)   # pro cidlo DHT11 je třeba cekat 1s
        # sleep(1)  # pro cidlo DHT22 je třeba pridat ještě 1s
        # podle cidla nastavte cas cekani
        sensor.measure()
        teplota = sensor.temperature()
        vlhkost = sensor.humidity()
        print(f"Teplota: { teplota:.1f } °C")
        print(f"Vlhkost: { vlhkost:.0f } %")
        print(f"Pocitova teplota: { Pt(teplota, vlhkost):.1f} °C")
    except OSError as e:
        print('Problem s nactenim cidla')

Pro výpočet pocitové teploty jsme si definovali funkci Pt(), která má dva vstupní parametru a to teplotu ve stupních Celsia a relativní vlhkost v počtu procent. Výstupná proměnná pt se pak v této funkci postupně vypočítává podle vzorce (1). Pro účel vložení potřebných vstupních hodnot této funkce jsou v hlavní nekonečné smyčce hodnoty teploty a vlhkosti načítány do proměnných teplota a vlhkost (oproti předchozímu přímému vypisování na výstup).

Za možnou zmínku akorát stojí pythonovský zápis druhé mocniny ve výrazech kvadrátů dílčích členů výpočtu. Zápis mocniny je v Pythonu možný pomocí symbolu **, kde první operand je základ a druhý mocnina, například 2 ** 8 odpovídá mocnině 28. Zde tedy závorky (t**2) a (h**2) odpovídají výrazům t2 a h2.

Následující obrázek č. 6 ukazuje výpis teploty, vlhkosti a vypočítané pocitové teploty ve výstupu prostředí Thonny IDE.

program DHT11
Obr. č. 5 – Výpis pocitové teploty ve výstupu prostředí Thonny IDE

Závěr

V dnešním článku jsme se seznámili s použitím modulu ESP32 k měření teploty a vlhkosti pomocí čidla DHT11 (a jeho přesnější verze DHT22) pod taktovkou jazyka MicroPython. Tento základní senzor je oblíbený pro různé projekty díky své jednoduchosti a cenové dostupnosti. Jak jsme viděli, čidla DHTxx jsou snadno připojitelná k modulu ESP32, a díky vestavěné knihovně v MicroPythonu, lze rychle začít s jejich obsluhou. Hlavní výhodou čidel DHT11 a DHT22 je jejich jednoduché zapojení a použití v základních projektech, jako je například DIY meteostanice. S těmito čidly můžeme získávat měření teploty a vlhkosti a analyzovat je přímo v našem kódu   jako ukázku jsme kupříkladu ukázali možnost výpočtu pocitové teploty, která zohledňuje vliv vlhkosti na vnímání teploty.

Znalosti a dovednosti získané při práci s těmito senzory mohou být využity v mnoha dalších praktických aplikacích. Příkladem může být vývoj inteligentního domácího systému, který by sledoval a reguloval podmínky v interiéru (teplotu, vlhkost) pro zajištění optimálního prostředí, například pro pěstování rostlin nebo regulaci vytápění v domácnostech. Dalším využitím může být integrace těchto senzorů do IoT projektů, kde bude možné data o teplotě a vlhkosti sbírat a analyzovat na dálku, což je užitečné pro monitorování počasí nebo správy klimatických podmínek v různých prostředích.

Takový projekt může být skvělým základem pro začínající bastlíře nebo pro ty, kteří se chtějí naučit základům IoT a automatizace. Tak nečekejte na dokonalý okamžik – teď je ta pravá chvíle, kdy můžete začít objevovat kouzlo ESP32 a MicroPythonu. Vezměte do ruky svůj modul ESP32, ponořte se do tvorby a nechte svou kreativitu rozkvést v úžasné projekty! 😎

UPOZORNĚNÍ:
Nesouhlasíme s vyřazením Newtonových zákonů, Ohmova zákona a zákona zachování energie z učiva fyziky základních škol v České republice!