Гайд · Энергосбережение · Батарея
ESP32-датчик на год от одной батарейки
ESP32 с включённым Wi-Fi тянет ~160–260 мА и сажает LiPo за часы. Но батарейному датчику не нужно бодрствовать — он просыпается, читает, отправляет и снова засыпает. В глубоком сне тот же чип тянет около 10 мкА. Это разница между часами и годом.
Режимы сна, в токах
- Active + Wi-Fi — ~160–260 мА (всплески выше на передаче).
- Modem sleep — CPU включён, радио выключено — десятки мА.
- Light sleep — ~0,8 мА, RAM и состояние сохраняются, быстрое пробуждение.
- Deep sleep — ~10 мкА, живёт только RTC.
- Hibernation — ~5 мкА, выключено почти всё.
Deep sleep — золотая середина для батарейных датчиков: микроамперы и пробуждение по таймеру или пину.
Паттерн «проснулся–поработал–уснул»
Глубокий сон — не пауза, а по сути перезагрузка. CPU останавливается, RAM теряется, при пробуждении
скетч снова стартует с setup(). Поэтому работу кладёшь в setup(), а потом
засыпаешь:
#include "esp_sleep.h"
#define uS_PER_S 1000000ULL
RTC_DATA_ATTR int bootCount = 0; // переживает сон в RTC-памяти
void setup() {
Serial.begin(115200);
bootCount++; // deep sleep = свежая загрузка, setup идёт заново
// ... подключить Wi-Fi, прочитать датчик, отправить данные ...
esp_sleep_enable_timer_wakeup(10 * 60 * uS_PER_S); // проснуться через 10 мин
// esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 0); // ...или по пину (PIR, геркон)
esp_deep_sleep_start(); // всё, что ниже, уже не выполнится
}
void loop() {} // не используется — работа живёт в setup() Немного RTC-памяти (RTC_DATA_ATTR) переживает сон, так что счётчик или
последнее состояние можно держать между пробуждениями без обращения к flash.
Что может его разбудить
- Таймер — рабочая лошадка: просыпаться каждые N минут, снять и отправить.
- Пин (ext0 / ext1) — PIR, геркон или кнопка будят по событию.
- Тач — ёмкостная площадка.
- Сопроцессор ULP — крошечное всегда-включённое ядро, которое следит за датчиком и будит основной CPU только при срабатывании порога — для минимального среднего тока.
Расчёт времени от батареи
Важен средний ток. Пусть просыпаешься на 2 с при 150 мА каждые 10 мин
и спишь при 10 мкА всё остальное время. Доля бодрствования — 2 с / 600 с ≈ 0,33%, значит средний ток
примерно 0.0033 × 150 мА + 10 мкА ≈ 0,5 мА. Тогда 18650 на 2000 мА·ч проживёт
~4000 часов — около пяти месяцев, а сокращение времени бодрствования или более редкая
отправка уводят за год.
Ловушка №1: твоя dev-плата никогда не дойдёт до 10 мкА
На это попадаются все. Голый модуль ESP32 спит при ~10 мкА — но у dev-платы ещё есть всегда-горящий LED питания, USB-serial чип (CH340/CP2102) и стабилизатор AMS1117, каждый жрёт миллиамперы круглосуточно. Плата «спит» при 5–20 мА, и батарея умирает за дни. Что делать: снять LED питания, взять плату под low-power или голый модуль с эффективным стабилизатором. См. гайд про питание и стабилизаторы — тот же AMS1117, что просаживается под Wi-Fi, впустую жрёт и батарею во сне.
Выжать ещё
- Сократи время бодрствования — переподключение Wi-Fi самое дорогое. Статический IP и сохранённый канал AP срезают его с секунд до менее секунды.
- Отправляй реже — каждое удвоение интервала почти удваивает время работы.
- Храни состояние в RTC-памяти, а не переподключайся и не перечитывай конфиг каждый раз.
- Возьми низкопотребляющий чип — S2 или C3 в простое ниже классического ESP32; см. гид по чипам.
Deep sleep превращает ESP32 из настольной платы «от USB» в настоящий беспроводной датчик, который можно прилепить на стену и забыть на сезон.
Батарея садится за дни, а не месяцы? Обычно виноваты стабилизатор и LED.