Дозатор воды на балконе прожил от повербанка ровно сорок минут. ESP32 шлёт показания раз в час, всё остальное время спит глубоким сном — на бумаге повербанка на 10000 мА·ч хватит на годы. По факту банк молча выключился: средний ток оказался ниже его порога отсечки, электроника решила, что нагрузку сняли, и ушла в защиту AUTO_OFF. Батарея полная, проект исправный, а устройства нет — классический конфликт «умного» источника с бережливым потребителем.
Тема распадается на три числа, которые нужно понимать до покупки. Чип ESP32 в глубоком сне ест 10-150 мкА, но DevKit в сборе — уже 1-5 мА: CP2102, стабилизатор и светодиод питания спят хуже кристалла. Активный WiFi — это 160-260 мА в среднем и до 500 мА в пиках передачи. Повербанк держит нагрузку, только пока видит ток выше своих 50-100 мА, иначе запускает таймер отключения. Дальше — как засыпать и просыпаться по RTC-таймеру, как считать средний ток и чем честно обманывать повербанк, если он всё равно засыпает.
Глубокий сон, средний ток и терпение банка
Механика сна на Arduino-ядерном ESP32 укладывается в три вызова: esp_sleep_enable_timer_wakeup(микросекунды) заводит будильник RTC, esp_deep_sleep_start() выключает всё, кроме RTC-домена, а переменная, помеченная RTC_DATA_ATTR, переживает сон в памяти RTC и служит счётчиком пробуждений. После пробуждения скетч стартует с setup() как после ресета, поэтому loop() остаётся пустым. Засыпание блокирующее — код после esp_deep_sleep_start() никогда не выполняется. Замеры среднего тока я делаю в разрыв питания мультиметром с шунтом: ожидание «банк разряжен» обычно означает «банк отключился», и вот тут пригодится бюджет тока проекта, чтобы посчитать честную цифру.
С повербанком есть два приёма. Первый — спать короткими отрезками: если просыпаться каждые 20-30 минут и на пару секунд включать WiFi с передачей, средний ток всё равно сотни микроампер — банка хватит надолго, но таймер отсечки банка за это время не сработает, если банк требует 50 мА непрерывно... а он требует. Отсюда второй приём — импульсный обман: раз в 20-25 минут на 100-200 мс включается нагрузочный резистор 100 Ом на 5 В (50 мА) или мигает мощный LED. Я обычно вешаю резистор на свободный GPIO через транзистор — это дёшево, и банк живёт месяцами. Общую землю двух источников и то, почему «висящая» земля вызывает глюки, разобрал в уроке про GND.
// Цикл: короткая фаза работы - глубокий сон по RTC-таймеру.// RTC_DATA_ATTR переживает глубокий сон (память RTC-домена).RTC_DATA_ATTR int boots = 0; const uint64_t SLEEP_US = 20ULL * 60ULL * 1000000ULL; // 20 минутconst int PIN_LED = 2; // встроенный LED DevKit V1 void setup() { Serial.begin(115200); delay(500); // Serial поднимается boots++; Serial.print("probuzhdenie #"); Serial.println(boots); digitalWrite(PIN_LED, HIGH); // ... здесь опрос датчиков и WiFi-передача (2-3 секунды) ... delay(2000); // "Пульс" для повербанка: нагрузочный резистор 100 Ом на GPIO13 pinMode(13, OUTPUT); // 5В/100Ом = 50 мА на 200 мс digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); Serial.println("uhodim v glubokij son"); Serial.flush(); // дождаться отправки лога! esp_sleep_enable_timer_wakeup(SLEEP_US); esp_deep_sleep_start(); // дальше код не дойдёт} void loop() { // сюда не попадаем никогда: после сна стартует setup()}Ключевые детали. boots++ в setup() — счётчик пробуждений, который доживает до следующего раза благодаря RTC_DATA_ATTR: без этой пометки переменная обнулялась бы при каждом просыпании. Serial.flush() перед засыпанием обязателен — иначе строка «uhodim v glubokij son» обрывается на половине, потому что UART не успевает выплюнуть буфер. Пульс на GPIO13 — тот самый резистор 100 Ом: 200 миллисекунд 50-миллиамперной нагрузки раз в 20 минут сбрасывают таймер отсечки повербанка, а средний ток от этого почти не растёт (50 мА × 0,2 с / 1200 с ≈ 8 мкА).
Числа для планирования: сон 10-150 мкА на чистом модуле и 1-5 мА на DevKit (CP2102 + стабилизатор + LED питания), активная фаза с WiFi 160-260 мА на 2-3 секунды раз в 20 минут, плюс пульс 8 мкА в пересчёте на средний. Банк 10000 мА·ч с учётом КПД и саморазряда отдаёт реально 60-70% — по моим замерам, такой цикл живёт от одного банка около четырёх-шести месяцев.
| Режим | Ток чипа | DevKit V1 в сборе | Что происходит |
|---|---|---|---|
| Активный, WiFi передача | 160-260 мА, пики до 500 | 180-280 мА | радио + CPU на полную |
| Активный, без WiFi | 30-70 мА | 40-80 мА | CPU работает, радио спит |
| Modem sleep | 18-20 мА | 25-30 мА | WiFi держится, CPU дремлет |
| Light sleep | около 0,8 мА | 1-6 мА | RAM жива, просыпается по GPIO/таймеру |
| Deep sleep (чип) | 10-150 мкА | — | только RTC-домен |
| Deep sleep (DevKit) | — | 1-5 мА | CP2102, AMS1117 и LED не спят |
- 1. Сколько реально ест DevKit V1 в глубоком сне?
- 2. Почему повербанк отключает спящий ESP32, хотя батарея полная?
- deep sleep: esp_sleep_enable_timer_wakeup + esp_deep_sleep_start, loop() пустой
- RTC_DATA_ATTR переживает сон — там счётчик пробуждений
- DevKit в сне 1-5 мА, WiFi-пики до 500 мА — считай средний ток по фазам
- повербанк отключается ниже 50-100 мА: спасает импульс нагрузки 50 мА раз в 20 минут
Частые вопросы по теме урока
- Сколько реально ест DevKit V1 в глубоком сне?
- 10-150 мкА — это голый кристалл или модуль без обвязки. На DevKit V1 мост CP2102, стабилизатор AMS1117 и светодиод питания добавляют миллиамперы, и честная цифра для всей платы — 1-5 мА. 1-5 мА: CP2102, стабилизатор и LED не спят
- Почему повербанк отключает спящий ESP32, хотя батарея полная?
- Электроника банка следит за током нагрузки: если он держится ниже её порога (обычно 50-100 мА) дольше таймаута, банк уходит в защиту AUTO_OFF. Лечится короткими импульсами нагрузки — тем самым резистором 100 Ом. средний ток ниже порога AUTO_OFF — банк считает нагрузку снятой