Spotreba ESP32 — reálne čísla
ESP32 v aktívnom režime s WiFi spotrebuje 160–240 mA. 18650 Li-Ion batéria má kapacitu ~2600 mAh — to je menej ako 16 hodín. Deep sleep zníži spotrebu na 10–150 µA (0,01–0,15 mA), čo je 1000× menej.
| Režim | Spotreba (typická) | CPU | WiFi/BT |
|---|---|---|---|
| Aktívny (WiFi TX) | 160–240 mA | bežiaci | aktívne |
| Modem sleep | 20–30 mA | bežiaci | vypnuté |
| Light sleep | 0,8 mA | pozastavený | vypnuté |
| Deep sleep | 10–150 µA | vypnutý | vypnuté |
| Hibernácia | 2,5 µA | vypnutý | vypnuté |
Deep sleep — základné použitie
V deep sleep zostáva aktívny iba RTC controller, RTC pamäť a vybrané GPIO piny. Po prebudení sa ESP32 reštartuje od začiatku setup().
#include <Arduino.h>
#define uS_TO_S_FACTOR 1000000ULL
#define SLEEP_TIME_S 60 // zobudiť sa každých 60 sekúnd
void setup() {
Serial.begin(115200);
// Tu sprav čo potrebuješ — oderaj senzory, odošli dáta...
measureAndSend();
// Nastav budík a zaspí
esp_sleep_enable_timer_wakeup(SLEEP_TIME_S * uS_TO_S_FACTOR);
Serial.println("Idem spat na " + String(SLEEP_TIME_S) + " sekund");
Serial.flush();
esp_deep_sleep_start();
}
void loop() {
// loop sa nikdy nespustí — po deep sleep ide vždy setup()
}
RTC pamäť — prežitie dát cez sleep cyklus
Premenné uložené do RTC pamäte prežijú deep sleep. Používa sa na počítadlá cyklov, kalibračné hodnoty alebo cache posledného odosielaného stavu.
RTC_DATA_ATTR int bootCount = 0;
RTC_DATA_ATTR float lastTemp = 0.0;
void setup() {
bootCount++;
Serial.println("Boot cislo: " + String(bootCount));
Serial.println("Posledna teplota: " + String(lastTemp));
float temp = readSensor();
// Odošli len ak sa teplota zmenila o viac ako 0.5°C
if (abs(temp - lastTemp) > 0.5) {
sendToServer(temp);
lastTemp = temp;
}
esp_sleep_enable_timer_wakeup(60 * 1000000ULL);
esp_deep_sleep_start();
}
Wake-up zdroje
Timer wake-up
Najčastejší prípad — zobudiť sa každých N sekúnd, odmerať, odoslať, zaspať.
esp_sleep_enable_timer_wakeup(300 * 1000000ULL); // každých 5 minút
Ext0 — externý signál na jednom pine
Vhodné pre PIR senzory pohybu alebo tlačidlá. Pin musí byť RTC GPIO (GPIO 0, 2, 4, 12–15, 25–27, 32–39).
// Zobudiť sa keď GPIO 33 = HIGH (napr. PIR detekuje pohyb) esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 1); esp_deep_sleep_start();
Ext1 — viacero pinov naraz
// Zobudiť sa ak GPIO 32 alebo GPIO 33 = HIGH uint64_t pinMask = (1ULL << GPIO_NUM_32) | (1ULL << GPIO_NUM_33); esp_sleep_enable_ext1_wakeup(pinMask, ESP_EXT1_WAKEUP_ANY_HIGH); esp_deep_sleep_start();
Touch wake-up
touchSleepWakeUpEnable(T3, 40); // Touch pin T3, threshold 40 esp_deep_sleep_start();
Zistenie príčiny prebudenia
void printWakeupReason() {
esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause();
switch (cause) {
case ESP_SLEEP_WAKEUP_TIMER: Serial.println("Timer"); break;
case ESP_SLEEP_WAKEUP_EXT0: Serial.println("EXT0 pin"); break;
case ESP_SLEEP_WAKEUP_EXT1: Serial.println("EXT1 pin"); break;
case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println("Touch"); break;
default: Serial.println("Iny dovod (napr. reset)"); break;
}
}
Hibernácia — minimálna spotreba 2,5 µA
Hibernácia vypne aj RTC memory a periférie. Prežijú len ext0/ext1 wake-up zdroje. RTC_DATA_ATTR premenné sa stratia.
// Zapni hibernáciu namiesto deep sleep esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF); esp_deep_sleep_start();
Výpočet výdrže batérie
Vzorec: kapacita (mAh) / priemerný prúd (mA) = hodiny. Príklad — ESP32 meria každých 5 minút, WiFi pripojenie trvá 2 sekundy (200 mA), zvyšok deep sleep (0,1 mA):
Cyklus = 300 sekúnd Aktívny čas = 2 s @ 200 mA = 0,4 mAh/cyklus (= 200 * 2/3600) Sleep čas = 298 s @ 0,1 mA = 0,008 mAh/cyklus Priemerný prúd = (0,4 + 0,008) / (300/3600) = 4,9 mA Výdrž 2600 mAh / 4,9 mA ≈ 530 hodín ≈ 22 dní // Zníženie frekvencie na každých 15 minút: Výdrž ≈ 67 dní
Praktické tipy pre dlhú výdrž
- Použi statickú IP adresu — DHCP lease zaberá ~300 ms navyše
- Vypni Bluetooth ak ho nepoužívaš:
btStop(); - Zníž WiFi TX power:
WiFi.setTxPower(WIFI_POWER_8_5dBm); - Odpoč periférie pred sleep: DHT, I2C senzory majú vlastný standby mód
- ESP32-S3 má lepšiu spotrebu v deep sleep ako pôvodný ESP32
- Na ultra-low power použij ESP32-C3 (deep sleep ~5 µA)