Уроки / Урок 13

Глубокий сон

Плата засыпает и просыпается по таймеру или от касания.

В глубоком сне 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, стабилизатор и красный светодиод питания, поэтому плата целиком тянет несколько миллиампер. Для работы от батарейки месяцами делают свою плату на голом модуле.