Nízka spotreba elektrickej energie hlavnou prioritou IoT aplikácií. Tieto aplikácie nazývame aj ULP (Ultra-Low Power), teda aplikácie s ultra-nízkou spotrebou elektrickej energie, alebo s nízkopríkonovým režimom. Využitie týchto aplikácií je predovšetkým v implementáciách s prevádzkou na batériu. Mikrokontroléry ESP8266 a ESP32 z produkcie čínskej firmy Espressif Systems sú veľmi populárne. Zaslúžili sa o veľký rozvoj IoT zariadení s WiFi konektivitou najmä kvôli cene, softvérovej podpore, možnosti programovania v rôznych vývojových prostrediach a tiež možnostiach úspornej prevádzky. Oba mikrokontroléry podporujú režim plytkého (nezaoberá sa ním článok) a hlbokého spánku Deep Sleep, ktorý minimalizuje spotrebu elektrickej energie.
V tomto režime mikrokontróler vypne WiFi adaptér, hlavný procesor Xtensa, ktoré spotrebúvajú veľké množstvo elektrickej energie (rádovo desiatky až stovky mA, najmä pri štarte a WiFi komunikácii). Mikrokontróler v Deep Sleep má spotrebu v jednotkách až desiatkach μA. Nakoľko sú často ESP8266 a ESP32 moduly implementované do vývojových kitov (napr. NodeMCU / Wemos D1 Mini, ESP32 Devkit), je táto spotreba vyššia. Je to spôsobené tým, že vývojové kity sú vybavené USB-UART prevodníkom, ktorý je stále napájaný a taktiež indikačnými LED diódami (ESP32 Devkit V1 má v Deep Sleep spotrebu 4 mA), čo nie je pre ULP aplikácie vhodné, efektívna spotreba sa dosiahne pri využití standalone ESP32 (samostatného modulu) bez ďalších periférii.
V režime Deep Sleep má mikrokontróler napájané len RTC registre a v prípade ESP32 aj RTC hodiny a ULP koprocesor, ktorý môže byť v režime spánku použitý pre operácie s nízkym prúdovým odberom. ESP32 má v porovnaní s ESP8266 dokonalejší energy-manažment a má nižšiu spotrebu elektrickej energie v režime Deep Sleep. Oba mikrokontroléry využívajú hlavný procesor Xtensa, v prípade ESP8266 je to jednojadrový, pri ESP32 dvojjadrový s aplikačným jadrom (APP_CPU) a jadrom protokolu (PRO_CPU)
Možnosti prebudenia mikrokontroléra ESP8266
Mikrokontróler je prebudený reštartom, ktorý môže nastať rôznymi zdrojmi. V prípade mikrokontroléra ESP8266 je možné prebudenie vykonať cez WAKE signál prostredníctvom časovača. WAKE signál je na vývode D0 (GPIO16), ktorý sa prepojí s vývodom RST. Časovač však nie je veľmi presný a oproti nastavenému času v programe sa rozchádza o 10 až 15%. Tento režim som testoval vo vlastnej implementácii pre projekt Hladinomer, kde sa ESP8266 pri 300 sekundovom intervale prebudenia prebudilo o 45 sekúnd pred plánovaným zobudením, čo odpovedá chybe 150 000 ppm.
Vývod GPIO16, kde je vyhradený WAKE signál je štandardne HIGH (3V3) a pri vypršaní časovača je prepnutý do LOW, čo vykoná reštart privedením tohto logického signálu na RST. Obdobne je možné pre reštart využiť aj tlačidlo spínané proti zemi, ktorým sa reštart vykoná identicky (nevyžaduje sa použitie akéhokoľvek vývodu).
Možnosti prebudenia mikrokontroléra ESP32
Mikrokontróler ESP32 umožňuje využiť viacero zdrojov prebudenia. RTC kontróler má integrovaný časovač, ktorý dokáže prebudiť reštartom hlavný procesor Xtensa po nastavenom čase. Tento časovač je veľmi presný a dokáže zobudiť mikrokontróler v presne nastavený čas. Tento spôsob prebudenia je integrovaný aj do projektu Hladinomer, kde je viditeľné, že sú dáta zasielané periodicky po 5 minútach + 1 sekunda oneskorenie, čo je spôsobené pripájaním na WiFi sieť a realizácou HTTPS POST requestu po prebudení.
Druhým spôsobom je možnosť využitia analógových vývodov s podporou TOUCH. Vývody sú schopné detegrovať kapacitnú zmenu - dotyk. Tento typ prebudenia musí mať nastavený vývod a taktiež aj rozhodovací prah - treshold analógovej hodnoty, ktorý spustí trigger reštartu.
Externé prebudenie je možné s využitím RTC IO modulu. Tento typ prebudenia pracuje s logikou očakávanej hodnoty na digitálnom vývode v režime vstupu. Existuje aj možnosť rozšírenia tejto funkcionality na skupinu vývodov, kde sa skúma logická úroveň všetkých vývodov zahrnutých v skupine, čo môže mať využitie napríklad pri podmienenom reštarte procesora Xtensa závislého od viacerých vstupov.
Ako bolo spomenuté pri opise režimu spánku, pri ESP32 ostáva v Deep Sleep aktívny aj ULP koprocesor. Ten môže okrem meraní a jednoduchých operácii vykonať aj prebudenie hlavného procesora Xtensa. Nakoľko dokáže obsluhovať aj základné zbernice, môže napríklad pri rozhodovacom prahu ADC prevodníka vykonať reštart. ULP koprocesor sa programuje najčastejšie v Assembleri. Jeho program sa kompiluje spoločne s hlavnou aplikáciou pre procesor Xtensa. Arduino Core však ULP koprocsor nepodporuje a nie je ho možné v projektoch použiť. Pre využívanie koprocesora je nutné využiť framework ESP-IDF, ktorý je tomu uspôsobený.
Vytvorenie programu pre ULP aplikáciu
Pri vytváraní programu ULP aplikácie pod ESP8266 alebo ESP32 je potrebné dbať na efektívne zapísanie programu pre čo najmenšiu spotrebu. Počas behu programu je spotreba elektrickej energie najvyššia. Program by sa mal vykonať rýchlo s následným spustením režimu spánku. Celý program je vhodné vytvoriť a umiestniť do funkcie setup(). Pri implementácii projektu Hladinomer som využil pripojenie k WiFi, meranie dát, odoslanie HTTPS POST requestom a následným režimom hlbokého spánku. Ak sa meranie vykonáva dlhší čas, je vhodnejšie z hľadiska spotreby elektrickej energie vykonať meranie a až potom spustiť WiFi adaptér mikrokontroléra, ktorý by spotreboval konštatných 80 mA navyše po dobu merania...
Moduly a periférie pripojené k mikrokontroléru sú permanentne napájané z Vin / 3V3 vývodu. Je preto vhodné optimalizovať aj napájanie týchto periférii napr. tranzistorom, ktorý napájanie aktivuje. V prípade, že je nutné uchovať hodnoty v programe s ktorými sa pracuje v následujúcom prebudení, existuje niekoľko možností. Z určitého rozsahu flash pamäte je možné softvérovo emulovať EEPROM pamäť o veľkosti 4 až 4096 B pre permanentné uchovanie informácie v tejto energeticky nezávislej pamäti. Tento typ pamäte má však obmedzené množstvo prepisov. Nakoľko sú v režime Deep Sleep aktívne aj RTC registre, je ich možné použiť. V prípade ESP8266 je k dispozícii 512 B pamäte, u ESP32 je to 8 kB RTC SLOW pamäte (k RTC FAST nemá aplikácia, resp. aplikačné jadro prístup).
Pri ESP32 je implementácia v prostredí Arduino IDE (Arduino Core) veľmi jednoduchá. Pred dátový typ premennej je nutné doplniť atribút RTC_IRAM_ATTR, ktorý zabezpečí, že je premenná v IRAM pamäti prístupná aplikácii. Zároveň je nutné, aby bola premenná iba inicializovaná a NESMIE k nej byť priradená hodnota. V prípade, že programátor pridelí hodnotu k tejto premennej, bude existujúca informácia v RTC SLOW pamäti prepísaná. K RTC SLOW pamäti môže pristupovať aj ULP koprocesor, ktorý môže počas režimu spánku uložiť napríklad meranie zo senzora pre hlavnú aplikáciu, ktoré bude ďalej použité. RTC SLOW je zároveň aj úložiskom pre program ULP koprocesora.
Ukážková implementácia pre ULP mikrokontrolérov ESP8266 a ESP32 je dostupná v projekte Hladinomer: http://arduino.clanweb.eu/studna_s_prekladom/program.php