RisalDash RisalDash

Гайд · Энергосбережение · Батарея

ESP32-датчик на год от одной батарейки

ESP32 с включённым Wi-Fi тянет ~160–260 мА и сажает LiPo за часы. Но батарейному датчику не нужно бодрствовать — он просыпается, читает, отправляет и снова засыпает. В глубоком сне тот же чип тянет около 10 мкА. Это разница между часами и годом.

Deep sleepЭнергосбережениеБатареяESP32ULP18650
ESP32 на аккумуляторе 18650, дашборд показывает 10 мкА во сне
10 мкА во сне — 18650 живёт годы, а не дни.

Режимы сна, в токах

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.

Что может его разбудить

Расчёт времени от батареи

Важен средний ток. Пусть просыпаешься на 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, впустую жрёт и батарею во сне.

Выжать ещё

Deep sleep превращает ESP32 из настольной платы «от USB» в настоящий беспроводной датчик, который можно прилепить на стену и забыть на сезон.

Батарея садится за дни, а не месяцы? Обычно виноваты стабилизатор и LED.