IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

Internet vecí s ESP32

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.
Napájaná však zostáva RTC (Real Time Clock) pamäť a je možné s ňou naďalej pracovať.

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.
Zdroje prebudenia je možné rôzne kombinovať.

Ď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.
Použitie časovača ako zdroj prebudenia

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.
Do nepájivého poľa súčiastky osadíme nasledovne:
Internet vecí s ESP32

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++

 

Predchádzajúci článok
Prerušenie a časovač na module ESP-32
Všetky články v sekcii
Internet vecí s ESP32
Preskočiť článok
(neodporúčame)
Webový server na module ESP-32
Článok pre vás napísal Adam Hudeczek
Avatar
Užívateľské hodnotenie:
2 hlasov
Autor se věnuje zejména programování mikrokontrolerů a tvorbou a provozem webových stránek a webových aplikací.
Aktivity