3. diel - Mód hlbokého spánku na module ESP-32
V predchádzajúcej lekcii, Prerušenie a časovač na module ESP-32 , sme sa zoznámili s možnosťou prerušenia a časovania na module ESP-32.
V dnešnom tutoriáli Internetu vecí s ESP32 nás bude zaujímať mód hlbokého spánku na mikrokontroléri ESP-32, ktorý tento modul poskytuje najmä kvôli úspore energie.
ESP-32 a úspora energie
Modul ESP-32 ponúka rôzne možnosti módov na úsporu energie, ktoré užívateľovi umožňujú znížiť spotrebu tým, že deaktivuje niektoré operácie. Je to v podstate podobné, ako by sme dávali počítač do režimu spánku za účelom úspory elektrickej energie. Z týchto režimov je veľmi často využívaný mód Deep Sleep, ktorému sa dnes budeme venovať. Aj keď sa o tomto móde hovorí ako o móde hlbokého spánku, nie je to mód, ktorý ušetrí najviac energie. Tým je režim hibernácie. Nasledujúca tabuľka zobrazuje spotrebu energie pri rôznych režimoch:
Podrobnejšie informácie možno nájsť v oficiálnom datasheete od výrobcu.
Na čo vlastne je režim hlbokého spánku?
Tento režim je veľmi vhodné použiť hlavne pri napájaní modulu z batérie a to najmä v prípadoch, keď celý modul funguje periodicky. Napríklad ako meteostanica, ktorá posiela dáta cez Wi-Fi alebo Bluetooth každých 15 minút.
Po aktivácii Deep Sleep módu sa ESP-32 prepne do čo najzákladnejšieho stavu. To znamená, že sa oba CPU vypnú a všetky operácie si preberá tzv. ULP (Ultra Low Processor). Tento procesor je ale veľmi jednoduchý a zvládne riešiť iba základné operácie. Pri zapnutom Deep Sleep móde sú vypnuté tieto dôležité časti:
- Flash a RAM pamäte,
- WiFi modul,
- Bluetooth modul.
Spôsoby prebudenia z Deep Sleep módu
Ešte než sa dostaneme k praktickej ukážke, poďme si povedať niečo málo o tom, ako sa mikrokontrolér prepína späť do bežného režimu. Na výber máme z niekoľkých možností:
- použitie integrovaného časovača, kedy sa ESP-32 prebudí po určitej dobe,
- použitie kapacitných dotykových senzorov,
- použitie RTC pinov.
Ďalšia z možnosti je samozrejme aj to, že vôbec nemusíme nastaviť akýkoľvek zdroj prebudenia. V tom prípade zostane ESP-32 v Deep Sleep móde nepretržite. Jedinou možnosťou, ako ho prebudiť je buď ručný reset pomocou EN/RST na doske alebo znovupripojenie dosky. Nikdy teda nie je možné zablokovať celý mikrokontrolér tým, že ho necháme neustále v Deep Sleep móde.
Aktivácia a prebudenie z Deep Sleep módu
Keď už máme teoretický základ, poďme si teraz priblížiť, ako je
možné aktivovať Deep Sleep mód a ako nakonfigurovať zdroje prebudenia. Na
aktiváciu Deep Sleep módu sa používa funkcia
esp_deep_sleep_start()
. Ako zdroje prebudenia v tejto lekcii
použijeme časovač a GPIO pin. Pre reálne
projekty si potom vždy musíme najprv uvedomiť a rozvrhnúť:
- aký spôsob prebudenia bude pre daný projekt najlepší (každý zdroj prebudenia má odlišnú spotrebu energie, odchýlka je však veľmi zanedbateľná - v µA),
- ktoré piny môžeme vypnúť a ktoré nie. V predvolenom nastavení mikrokontroléru ESP-32 je, že vypne všetky periférie, ktoré nie sú potrebné na rozpoznanie signálu na prebudenie.
Tento spôsob je ten najmenej náročný čo sa týka spotreby energie. Ako už vieme, v Deep Sleep móde funguje oi RTC časovač. Ten nám zaistí, že sa mikrokontrolér prebudí automaticky po nami určenom časovom úseku. Poďme si teda zostaviť jednoduchý program, v ktorom využijeme časovač ako zdroj prebudenia:
Prvé makro je prevodník medzi mikrosekundami a sekundami, ktorý neskôr využijeme pri konfigurácii dĺžky spánku. Druhé makro určuje časový úsek, ktorý udáva dobu, ako dlho bude mikrokontrolér v spánku.
Aby sme si udržali prehľad o tom, koľkokrát sa náš mikrokontrolér prebudil zo spánku, vytvoríme si k tomu premennú, ktorá bude počet prebudení počítať:
Makro
RTC_DATA_ATTR
je definované v ESP-IDF, čo je oficiálny
vývojový rámec pre ESP32 a iné čipy od Espressif. Toto makro sa používa
pri deklarácii premenných, ktoré chceme, aby pretrvali medzi rôznymi
prebudeniami z hlbokého spánku. RTC_DATA_ATTR
umiestni premennú
do RTC pamäte, o ktorej sme si povedali, že zostáva napájaná.
Teraz si poďme zostaviť funkciu, ktorá do sériového monitora vypíše informáciu o tom, čím bolo spôsobené prebudenie čipu:
V tejto funkcii si jednoducho
priradíme do premennej zdrojProbuzeni
hodnotu a potom ju vo
viacnásobnom vetvení porovnáme a vypíšeme na monitor zodpovedajúcu
informáciu.
Presuňme sa teraz do funkcie setup()
. Najskôr nastavíme
intenzitu sériového monitora:
Potom inkrementujeme počet nabootovaní a vypíšeme informáciu o tom, koľkokrát sa už ESP-32 prebudil:
Teraz je priestor pre operácie, ktoré chceme aby mikrokontrolér vykonal po
prebudení zo spánku, napr. čítanie dát z nejakého senzora atp. Náš kód
iba zavolá nami vytvorenú funkciu vypisZdrojProbuzeni()
, vďaka
ktorej zistíme, čo bolo impulzom pre prebudenie:
V ďalšom kroku nastavíme časovač s pomocou vytvorených makier. Keďže chceme, aby mikrokontrolér sám vykonal výpočet dĺžky spánku, vynásobíme časový úsek v sekundách naším prevodníkom a vypíšeme informáciu na monitor:
A ako posledný krok opäť uspíme mikrokontrolér a môžeme otestovať správnu funkčnosť kódu:
Funkcia loop()
nás opäť nezaujíma, pretože nebude nikdy zavolaná, preto je zbytočné ju
akokoľvek definovať.
Použitie GPIO pinu ako zdroj prebudenia
Ako spôsob prebudenia je možné použiť aj vonkajší impulz. V našom prípade využijeme tlačidlo. Typicky tento princíp využívajú zariadenia, ktoré sa prebudia hneď po stlačení tlačidla, napr. mobily, tablety atď. Čo sa týka spotreby batérie, je tu trošičku vyššia ako pri využití časovača. Rozdiel je ale v cca 2 µA, teda takmer zanedbateľný.
Pozor, pre tento spôsob prebudenia je možné použiť iba RTC_GPIO piny.
Poďme si teraz zostaviť jednoduchý obvod. Budeme potrebovať:
- ESP-32,
- rezistor,
- tlačidlo,
- prepojovacie vodiče.
Máme úspešne zapojené a môžeme sa presunúť ku kódu. Hlavička je opäť veľmi jednoduchá, iba si zadoklarujeme premennú, ktorá bude, rovnako ako pri minulom príklade, počítať počet nabootovaní:
Testovaciu funkciu
vypisZdrojProbuzeni()
už máme hotovú a tak sa rovno presuňme do
funkcie setup()
:
Namiesto funkcie
esp_sleep_enable_timer_wakeup()
využijeme funkciu
esp_sleep_enable_ext0_wakeup()
, ktorá prijíma dva parametre.
Prvý parameter určuje, na ktorý pin je privedené tlačidlo. V našom
prípade je to pin GPIO_NUM_33
. Druhý parameter potom určuje, pri
akej hodnote na tlačidle má byť vyslaný signál pre prebudenie. Funkcia
loop()
opäť zostane prázdna, rovnako ako v predchádzajúcom
prípade. Tým sme úspešne dokončili náš program, ktorý vždy po
stlačení tlačidla prebudí mikrokontrolér ESP-32 z módu hlbokého
spánku.
Oba kompletné programy sú pripojené v archíve pod lekciou.
V budúcej lekcii, Webový server na module ESP-32 , začneme pracovať na webovom serveri na module ESP-32.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 42x (1.95 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C++