- Požadavky
- Obvodové schéma spánkového režimu ESP32
- Přehled spánkových režimů v ESP32
- Programování ESP32 pro režim hlubokého spánku
- Testování ESP32 v režimu hlubokého spánku
ESP32 je jedním z nejpopulárnějších modulů mikrokontroléru založených na Wi-Fi a je oblíbenou volbou v mnoha přenosných aplikacích IoT. Jedná se o výkonný řadič, který podporuje dvoujádrové programování a má také zabudovanou podporu Bluetooth Low Energy (BLE), což z něj činí dobrou volbu pro přenosné aplikace, jako jsou zařízení iBeacon, GPS trackery atd. V aplikacích napájených z baterie, jako jsou tyto, hlavním problémem je záložní baterie. Tuto záložní baterii lze zvýšit chytřejším ovládáním nad jednotkou mikrokontroléru, jako by bylo možné program ESP32 v režimu spánku během ideálního stavu zvýšit, aby se zvýšila záložní baterie zařízení.
V tomto projektu zkontrolujeme aktuální spotřebu velmi populární jednotky mikrokontroléru ESP32 s podporou Wi-Fi a Bluetooth v normálním pracovním režimu a režimu hlubokého spánku. Také otestujeme rozdíl a zkontrolujeme, jak přepnout ESP32 do režimu hlubokého spánku. Můžete se také podívat na článek o tom, jak minimalizovat spotřebu energie v mikrokontrolérech, kde najdete další tipy, díky nimž bude váš design mnohem energeticky efektivnější. Kromě toho, pokud vás zajímá režim spánku jiných mikrokontrolérů, můžete také sledovat režim spánku Arduino a režim spánku ESP8266 NodeMCU.
Požadavky
K tomu použijeme systém Devkit V4.0 založený na ESP32 od Espressif, který má USB na UART bridge a další pinouty ESP32 pro snadné připojení. Programování bude provedeno pomocí Arduino IDE. Pokud jste úplně noví, přečtěte si nejprve článek Začínáme s ESP32 pomocí Arduina a přečtěte si propojený článek.
Požadavky tohoto projektu jsou následující -
- Do režimu hlubokého spánku přejde stisknutím tlačítka.
- Probudí se z režimu hlubokého spánku stisknutím jiného tlačítka.
- K detekci stavu ESP32 bude blikat LED s dobou zapnutí 1000 milisekund. Během režimu spánku se vypne.
Proto jsou zapotřebí další komponenty -
- LED - 1 ks
- Tlačítko (hmatový spínač) - 2 ks
- 4,7k rezistory - 2 ks
- Rezistor 680R - 1 ks
- Nepájivá deska
- Připojte drát
- 5V adaptér nebo napájecí zdroj
- Kabel micro-USB
- Arduino IDE s programovacím rozhraním ESP32 v PC nebo notebooku.
Obvodové schéma spánkového režimu ESP32
Schéma uvedení ESP32 do režimu spánku pomocí tlačítka je uvedeno níže.
Schéma je docela jednoduché. Má dvě tlačítka. Tlačítko spánku přepne ESP32 do režimu hlubokého spánku a další spínač se používá k probuzení ESP32 z režimu spánku. Obě tlačítka jsou připojena v PIN 16 a PIN 33. Obě tlačítka jsou při stisknutí nakonfigurována jako aktivní nízká, proto je uveden další pull-up. Aby se však zjistilo, zda je ESP 32 v režimu spánku nebo v normálním režimu pracovních podmínek, je LED připojena k IO Pin 4.
Přehled spánkových režimů v ESP32
Existuje mnoho různých režimů napájení pro ESP32, jmenovitě aktivní režim, režim spánku modemu, režim lehkého spánku, režim hlubokého spánku a režim hibernace.
Za normálních provozních podmínek běží ESP32 v aktivním režimu. Během aktivního režimu ESP32 jsou CPU, hardware WiFi / BT, paměť RTC a periferní zařízení RTC, koprocesory ULP aktivovány a fungují v závislosti na pracovní zátěži. V různých režimech napájení je však jedna nebo více periferních zařízení vypnuta. Chcete-li zkontrolovat různé operace režimu napájení, postupujte podle níže uvedené tabulky -
Hardware |
Aktivní režim |
Režim spánku modemu |
Režim lehkého spánku |
Režim hlubokého spánku |
Hibernace |
procesor |
NA |
NA |
PAUZA |
VYPNUTO |
VYPNUTO |
WiFi / BT |
NA |
VYPNUTO |
VYPNUTO |
VYPNUTO |
VYPNUTO |
RTC a periferní zařízení RTC |
NA |
NA |
NA |
NA |
VYPNUTO |
Procesor ULP-Co |
NA |
NA |
NA |
ZAPNUTO VYPNUTO |
VYPNUTO |
Jak vidíme ve výše uvedené tabulce, v režimu hlubokého spánku ESP32, který se často nazývá vzor monitorovaný snímačem ULP - CPU, WiFi / BT, RTC paměť a periferie, jsou všechny koprocesory ULP vypnuty. Zapnuta je pouze paměť RTC a periferní zařízení RTC.
Během situace probuzení musí být ESP32 upozorněn zdrojem probuzení, který probudí ESP32 z režimu hlubokého spánku. Vzhledem k tomu, že jsou zapnuty periferní zařízení RTC, lze ESP32 probudit pomocí GPIO s podporou RTC. Existují i další možnosti. Může být probuzen pomocí externích kolíků přerušení probuzení nebo pomocí časovače k probuzení ESP32. V tomto projektu používáme probuzení ext0 na kolíku 33.
Programování ESP32 pro režim hlubokého spánku
Kompletní program naleznete ve spodní části této stránky. Je napsán pro Arduino IDE a lze jej proto snadno přizpůsobit vašim požadavkům. Vysvětlení kódu je následující.
Na začátku kódu
// Vytvoření proměnné PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // definovat Led Pin uint8_t led_pin = GPIO_NUM_4; // definovat pin pro probuzení uint8_t wakeUp_pin = GPIO_NUM_33;
Výše uvedené tři řádky definují kolík probuzení, kolík LED a kolík režimu spánku.
void setup () { // vložte svůj instalační kód, aby se spustil jednou: // nastavte sériový port na 115200 Serial.begin (115200); zpoždění (1000); // nastavit pin pushButton jako vstup s interním PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // nastavit obsluhu přerušení s pinem pushButton v padajícím režimu attachInterrupt (pushBtn.pin, isr_handle, FALLING); // nastavit Led pin jako ouput pinMode (led_pin, OUTPUT); // vytvoření úkolu, který bude proveden ve funkci blinkLed () s prioritou 1 a proveden na jádru 0 xTaskCreate ( blinkLed, / * funkce úkolu. * / "blinkLed", / * název úkolu. * / 1024 * 2, / * Velikost zásobníku úkolu * / NULL, / * parametr úkolu * / 5, / * priorita úkolu * / & taskBlinkled); / * Popisovač úkolu pro sledování vytvořeného úkolu * / delay (500); // Nakonfigurujte Pin 33 jako ext0 zdroj probuzení s LOW logickou úrovní esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
Ve výše uvedeném případě je přerušení nastaveno na klesající režim pomocí fragmentu kódu
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Proto při každém stisknutí spínače dojde ke změně logické úrovně z logiky 1 (3,3 V) na logiku 0 (0 V). Napětí kolíku tlačítka poklesne a ESP32 zjistí, že je spínač stisknutý. Je také vytvořen úkol blikat LED.
xTaskCreate ( blinkLed, / * Funkce úkolu. * / "blinkLed", / * název úkolu. * / 1024 * 2, / * Velikost zásobníku úkolu * / NULL, / * parametr úkolu * / 5, / * priorita úkolu * / & taskBlinkled); / * Popisovač úkolu pro sledování vytvořeného úkolu * / delay (500);
Pin 33 je také nakonfigurován pomocí níže uvedeného fragmentu kódu jako externího zdroje probuzení identifikovaného jako ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Dále v while smyčce
void loop () { // sem vložte svůj hlavní kód, který se má opakovaně spouštět: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Pozastavit úlohu 'blinkLed' \ n"); // Pozastavte blinkLed úkol vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Jít spát….. \ n", pushBtn.pin); pushBtn.pressed = false; // Jdi spát hned esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); switch (wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println ("pomocí externího signálu ext0 pro WakeUp ze spánku"); přestávka; případ ESP_SLEEP_WAKEUP_EXT1: Serial.println ("pomocí externího signálu ext1 pro WakeUp z režimu spánku"); přestávka; případ ESP_SLEEP_WAKEUP_TIMER: Serial.println ("pomocí signálu časovače pro WakeUp z režimu spánku"); přestávka; případ ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("pomocí signálu TouchPad pro WakeUp z režimu spánku"); přestávka; případ ESP_SLEEP_WAKEUP_ULP: Serial.println ("pomocí signálu ULP pro WakeUp z režimu spánku"); přestávka; výchozí: konec; Serial.printf ("Obnovit úlohu 'blinkLed' \ n"); // restart blinkLed Task vTaskResume (taskBlinkled); } }
Smyčka while neustále kontroluje, zda je stisknuto tlačítko spánku. Pokud je tlačítko stisknuto, zastaví nebo pozastaví blikání LED a spustí funkci esp deep sleep start-
esp_deep_sleep_start ();
V této situaci, pokud stisknete tlačítko externího přerušení ext0, okamžitě se probudí z režimu hlubokého spánku a obnoví úlohu blikání LED.
A konečně, funkce blikání LED je vidět na níže uvedených úryvcích, bude blikat LED 1000 ms sekund.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // přepne hodnotu pinu pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Jednoduše přepněte LED každých 1000ms nebo 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Testování ESP32 v režimu hlubokého spánku
Obvod je konstruován v prkénku a k měření proudu se používá multimetr edice Metravi XB. Proud odebíraný obvodem v aktivním režimu je téměř 58 mA, ale v režimu hlubokého spánku je proud téměř 4,10 mA. Níže uvedený obrázek ukazuje aktuální spotřebu aktivního režimu ESP32 -
V režimu hlubokého spánku se aktuální spotřeba zaznamenává pokleslá na přibližně 3,95 mA, obrázek níže ukazuje aktuální spotřebu ESP32 Deep Sleep Mode -
V režimu hlubokého spánku je však aktuální spotřeba ESP32 téměř 150 uA. Ale zaznamenaná spotřeba proudu pro tuto desku ESP32 Devkit je téměř 4,10 mA. Důvodem je CP2102 a lineární regulátor. Tyto dva jsou připojeny k 5V napájecímu vedení. K napájecímu vedení je připojena také LED napájení, která spotřebovává téměř 2 mA proudu.
Proto lze snadno zjistit, že ESP32 spotřebovává velmi nízké množství energie v režimu hlubokého spánku, což je velmi užitečné pro operace napájené z baterie. Další informace o tom, jak to fungovalo, najdete ve videu, na které odkazujete níže. Pokud máte nějaké dotazy, nechte je v sekci komentářů níže nebo použijte naše fóra pro další technické dotazy.