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žimSpotreba (typická)CPUWiFi/BT
Aktívny (WiFi TX)160–240 mAbežiaciaktívne
Modem sleep20–30 mAbežiacivypnuté
Light sleep0,8 mApozastavenývypnuté
Deep sleep10–150 µAvypnutývypnuté
Hibernácia2,5 µAvypnutý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ž