- Požiadavky
- Obvodový diagram spánkového režimu ESP32
- Prehľad spánkových režimov v ESP32
- Programovanie ESP32 pre režim hlbokého spánku
- Testovanie ESP32 v režime hlbokého spánku
ESP32 je jedným z najpopulárnejších modulov mikrokontrolérov na báze Wi-Fi a je obľúbenou voľbou v mnohých prenosných aplikáciách IoT. Jedná sa o výkonný radič, ktorý podporuje dvojjadrové programovanie, a má tiež zabudovanú podporu Bluetooth Low Energy (BLE), čo z neho robí dobrú voľbu pre prenosné aplikácie, ako napríklad v zariadeniach iBeacon, GPS Tracker, atď. Avšak v batériových aplikáciách, ako sú tieto,, hlavným záujmom je zálohovanie batérie. Toto zálohovanie batérie je možné zvýšiť pomocou inteligentnejšej kontroly nad jednotkou mikrokontroléra, pretože je možné počas ideálneho stavu programovať ESP32 v režime spánku a zvýšiť tak zálohu batérie zariadenia.
V tomto projekte skontrolujeme súčasnú spotrebu veľmi populárnej jednotky mikrokontroléra ESP32 s podporou Wi-Fi a Bluetooth v normálnom pracovnom režime a režime hlbokého spánku. Tiež otestujeme rozdiel a skontrolujeme, ako prepnúť ESP32 do režimu hlbokého spánku. Môžete si tiež prečítať článok o tom, ako minimalizovať spotrebu energie v mikrokontroléroch, kde nájdete ďalšie tipy, ktoré vám môžu pomôcť zvýšiť energetickú efektívnosť vášho návrhu. Ďalej, ak vás zaujíma spánkový režim iných mikrokontrolérov, môžete vyhľadať aj režim spánku Arduino a režim spánku ESP8266 NodeMCU.
Požiadavky
Použijeme na to systém Devkit V4.0 založený na ESP32 od Espressif, ktorý má USB na UART most a ďalšie pinouty ESP32 pre ľahké pripojenie. Programovanie sa uskutoční pomocou Arduino IDE. Ak ste úplne nový, potom si prečítajte najskôr Začíname s ESP32 pomocou Arduina a prečítajte si prepojený článok.
Požiadavky tohto projektu sú:
- Do režimu hlbokého spánku prejde stlačením tlačidla.
- Z režimu hlbokého spánku sa prebudí stlačením iného tlačidla.
- Na zistenie stavu ESP32 bude blikať LED s dobou zapnutia 1 000 milisekúnd. Počas režimu spánku sa vypne.
Preto sú potrebné ďalšie komponenty -
- LED - 1 ks
- Tlačidlo (hmatový spínač) - 2 ks
- 4,7k rezistory - 2 ks
- Rezistor 680R - 1 ks
- Nepál
- Pripojte drôt
- 5V adaptér alebo napájací zdroj
- Kábel micro-USB
- Arduino IDE s programovacím rozhraním ESP32 v počítači alebo notebooku.
Obvodový diagram spánkového režimu ESP32
Schéma uvedenia ESP32 do režimu spánku pomocou tlačidla je uvedená nižšie.
Schéma je dosť jednoduchá. Má dve tlačidlá. Tlačidlo spánku prepne ESP32 do režimu hlbokého spánku a ďalší spínač sa používa na prebudenie ESP32 z režimu spánku. Obidve tlačidlá sú spojené v PIN 16 a PIN 33. Obidve tlačidlá sú nakonfigurované ako aktívne nízke, keď sú stlačené, preto sa zobrazí ďalšie vyvolanie. Aby sa však zistilo, či je ESP 32 v režime spánku alebo normálnom režime pracovných podmienok, je LED pripojená k IO Pin 4.
Prehľad spánkových režimov v ESP32
Pre ESP32 existuje veľa rôznych režimov napájania, a to aktívny režim, režim spánku modemu, režim ľahkého spánku, režim hlbokého spánku a režim dlhodobého spánku.
Za normálnych pracovných podmienok pracuje ESP32 v aktívnom režime. Počas aktívneho režimu ESP32 sú všetky procesory, hardvér WiFi / BT, pamäť RTC a periférie RTC, koprocesory ULP aktivované a fungujú v závislosti od pracovnej záťaže. V rôznych režimoch napájania je však jedna alebo viac periférií vypnutá. Ak chcete skontrolovať rôzne operácie v režime napájania, postupujte podľa nasledujúcej tabuľky -
Hardware |
Aktívny režim |
Režim spánku modemu |
Režim ľahkého spánku |
Režim hlbokého spánku |
Hibernácia |
CPU |
ZAP |
ZAP |
PAUZA |
VYPNUTÉ |
VYPNUTÉ |
WiFi / BT |
ZAP |
VYPNUTÉ |
VYPNUTÉ |
VYPNUTÉ |
VYPNUTÉ |
RTC a periférne zariadenia RTC |
ZAP |
ZAP |
ZAP |
ZAP |
VYPNUTÉ |
Procesor ULP-Co |
ZAP |
ZAP |
ZAP |
ON / OFF |
VYPNUTÉ |
Ako vidíme vo vyššie uvedenej tabuľke, v režime hlbokého spánku ESP32, ktorý sa často nazýva vzor monitorovaný snímačom ULP - CPU, WiFi / BT, RTC pamäť a periférie, sú všetky procesory ULP vypnuté. Zapnutá je iba pamäť RTC a periférne zariadenia RTC.
Počas situácie prebudenia musí byť ESP32 upozornený zdrojom prebudenia, ktorý prebudí ESP32 z režimu hlbokého spánku. Pretože sú však zapnuté periférie RTC, môže sa ESP32 prebudiť prostredníctvom GPIO s povoleným RTC. Existujú aj ďalšie možnosti. Môže sa budiť pomocou externých kolíkov prerušenia budenia alebo pomocou časovača na prebudenie ESP32. V tomto projekte používame prebudenie ext0 na kolíku 33.
Programovanie ESP32 pre režim hlbokého spánku
Celý program nájdete v dolnej časti tejto stránky. Je určený pre Arduino IDE a dá sa preto ľahko prispôsobiť vašim požiadavkám. Vysvetlenie kódu je nasledovné.
Na začiatku kódu
// Vytvorte premennú PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // definovať Led Pin uint8_t led_pin = GPIO_NUM_4; // definovať pin prebudenia uint8_t wakeUp_pin = GPIO_NUM_33;
Vyššie uvedené tri riadky definujú kolík prebudenia, kolík LED a kolík režimu spánku.
void setup () { // vložte svoj nastavovací kód, aby sa spustil raz: // nastavte sériový port na 115200 Serial.begin (115200); oneskorenie (1 000); // nastav pin pushButton ako vstup s internym PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // nastavi obsluhu Prerušenia s pinom pushButton v Padajúcom režime attachInterrupt (pushBtn.pin, isr_handle, FALLING); // nastav Led pin ako ouput pinMode (led_pin, OUTPUT); // vytvorí úlohu, ktorá sa vykoná vo funkcii blinkLed () s prioritou 1 a vykoná sa v jadre 0 xTaskCreate ( blinkLed, / * funkcia úlohy. * / "blinkLed", / * názov úlohy. * / 1024 * 2, / * Veľkosť zásobníka úlohy * / NULL, / * parameter úlohy * / 5, / * priorita úlohy * / & taskBlinkled); / * Popisovač úlohy na sledovanie vytvorenej úlohy * / delay (500); // Nakonfigurujte Pin 33 ako ext0 zdroj prebudenia s LOW logickou úrovňou esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
Vo vyššie uvedenom prípade je prerušenie kódu nastavené na klesajúci režim
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Preto vždy, keď je stlačený spínač, logická úroveň sa zmení z logiky 1 (3,3 V) na logiku 0 (0 V). Napätie kolíka tlačidla poklesne a ESP32 zistí, že je stlačený spínač. Taktiež je vytvorená úloha pre blikanie LED.
xTaskCreate ( blinkLed, / * funkcia úlohy. * / "blinkLed", / * názov úlohy. * / 1024 * 2, / * veľkosť zásobníka úlohy * / NULL, / * parameter úlohy * / 5, / * priorita úlohy * / & taskBlinkled); / * Popisovač úlohy na sledovanie vytvorenej úlohy * / delay (500);
Pin 33 je tiež nakonfigurovaný pomocou útržku kódu nižšie ako externého zdroja budenia označeného ako ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Ďalej v while
void loop () { // sem vložte hlavný kód, ktorý sa má opakovane spúšťať: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Pozastaviť úlohu 'blinkLed' \ n"); // Pozastavte úlohu blinkLed vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Idem spať….. \ n", pushBtn.pin); pushBtn.pressed = false; // Teraz choď spať esp_deep_sleep_start (); } dôvod esp_sleep_wakeup_cause_t wakeup; wakeupReason = esp_sleep_get_wakeup_cause (); switch (wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println ("použitie externého signálu ext0 pre WakeUp z režimu spánku"); prestávka; prípad ESP_SLEEP_WAKEUP_EXT1: Serial.println ("použitie externého signálu ext1 pre WakeUp z režimu spánku"); prestávka; prípad ESP_SLEEP_WAKEUP_TIMER: Serial.println ("použitie signálu časovača pre WakeUp z režimu spánku"); prestávka; case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("použitie signálu TouchPad pre WakeUp z režimu spánku"); prestávka; case ESP_SLEEP_WAKEUP_ULP: Serial.println ("pomocou signálu ULP pre WakeUp z režimu spánku"); prestávka; predvolené: break; Serial.printf ("Obnoviť úlohu 'blinkLed' \ n"); // restart blinkLed Task vTaskResume (taskBlinkled); } }
Smyčka while neustále kontroluje, či je stlačené tlačidlo spánku. Ak je stlačené tlačidlo, zastaví alebo pozastaví blikanie LED a spustí funkciu hlbokého spánku esp -
esp_deep_sleep_start ();
V tejto situácii, ak stlačíte tlačidlo externého prerušenia ext0, okamžite sa prebudí z režimu hlbokého spánku a obnoví úlohu blikania LED.
A konečne, funkcia blikania LED je viditeľná na nasledujúcich úryvkoch, bude blikať LED 1000 ms sekúnd.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // prepnutie hodnoty pinu pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Jednoduché prepínanie LED každých 1000ms alebo 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Testovanie ESP32 v režime hlbokého spánku
Obvod je skonštruovaný v doske a na meranie prúdu sa používa multimetr edície Metravi XB. Prúd odoberaný obvodom v aktívnom režime je takmer 58 mA, ale v režime hlbokého spánku je prúd takmer 4,10 mA. Nižšie uvedený obrázok zobrazuje aktuálnu spotrebu aktívneho režimu ESP32 -
V režime hlbokého spánku je zaznamenaná súčasná spotreba znížená na približne 3,95 mA, na nasledujúcom obrázku je zobrazená súčasná spotreba prúdu v hlbokom spánku ESP32 -
V režime hlbokého spánku je však súčasná spotreba ESP32 takmer 150 uA. Ale zaznamenaná spotreba prúdu pre túto dosku ESP32 Devkit je takmer 4,10 mA. Môže za to CP2102 a lineárny regulátor. Tieto dva sú pripojené k 5V elektrickému vedeniu. K elektrickému vedeniu je pripojená tiež LED napájania, ktorá spotrebuje prúd takmer 2 mA.
Preto je možné ľahko zistiť, že ESP32 spotrebuje veľmi nízke množstvo energie v režime hlbokého spánku, čo je veľmi užitočné pre operácie napájané z batérie. Ďalšie informácie o tom, ako to fungovalo, nájdete vo videu prepojenom nižšie. Ak máte akékoľvek otázky, nechajte ich v sekcii komentárov nižšie alebo použite naše fóra na ďalšie technické otázky.