Глубокий сон
Плата засыпает и просыпается по таймеру или от касания.
В глубоком сне ESP32 выключает процессор, Wi-Fi и почти всю память. Остаются работать только часы реального времени и небольшая RTC-память. Проснуться плата может по таймеру, от касания сенсора или от уровня на выводе. После пробуждения программа начинается заново с setup().
const int LED = 2;
RTC_DATA_ATTR int bootCount = 0; // переменная в RTC-памяти переживает сон
void setup() {
Serial.begin(115200);
pinMode(LED, OUTPUT);
bootCount++;
switch (esp_sleep_get_wakeup_cause()) {
case ESP_SLEEP_WAKEUP_TIMER: Serial.println("Проснулась по таймеру"); break;
case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println("Проснулась от касания"); break;
default: Serial.println("Обычное включение");
}
Serial.printf("Запуск номер %d\n", bootCount);
// немного поработаем: мигнём светодиодом
for (int i = 0; i < 3; i++) { digitalWrite(LED, HIGH); delay(150); digitalWrite(LED, LOW); delay(150); }
esp_sleep_enable_timer_wakeup(20ULL * 1000000); // через 20 секунд (в микросекундах)
touchSleepWakeUpEnable(T0, 40); // или при касании GPIO4
Serial.println("Сплю...");
Serial.flush();
esp_deep_sleep_start();
}
void loop() {
// сюда программа никогда не попадает
}Что здесь важно
RTC_DATA_ATTR— переменная хранится в RTC-памяти и не сбрасывается во сне. Обычные переменные после пробуждения начинают с нуля.esp_sleep_get_wakeup_cause()сообщает, что разбудило плату.- Порог касания
40подходит для провода средней длины. Если плата просыпается сама — уменьшите его, если не просыпается от касания — увеличьте (смотрите числаtouchRead(4)из урока 5).
Пока плата спит, загрузить новый скетч не получится: порт не отвечает. Зажмите BOOT, нажмите и отпустите EN, отпустите BOOT — и загружайте.
Сам чип ESP32 во сне потребляет около 10 мкА. Но на плате DevKit продолжают работать CH340, стабилизатор и красный светодиод питания, поэтому плата целиком тянет несколько миллиампер. Для работы от батарейки месяцами делают свою плату на голом модуле.