Табло с расписанием в прихожей — та же ESP32 DevKit, что час назад спокойно шилась от порта ноутбука. Подключаю к зарядке на 1 А, и при старте WiFi плата уходит в цикл: две секунды работы — сброс, ещё две секунды — снова сброс. В мониторе между рестартами мелькает Brownout detector triggered. Скетч один и тот же, виноватых в коде нет — виноват источник. После перепутанных Tx/Rx это самая частая железная грабля ESP32, и почти всегда она лечится не прошивкой, а кабелем за двести рублей.
Разбираем питание с конца: откуда берутся пики в сотни миллиампер при скромном среднем токе, куда утекают вольты на кабелях и разъёмах, чем линейный стабилизатор отличается от buck именно в этой задаче, зачем на шине 3V3 электролит на 470 мкФ и почему повербанк — самый капризный сосед из всех. Ток движок симулятора не измеряет, поэтому sim-блок рисует модель: передачи по расписанию, вспышки нагрузки и сброс по «просевшему» кабелю — всё с честной пометкой модели.
Откуда берутся пики 350-500 мА
WiFi-передатчик ест рывками. Даташит чипа называет средние 80-130 мА при активной передаче и пики до 240 мА; на плате к чипу добавляются мост USB, стабилизатор с его потерями и мигающий LED — и USB-тестер на DevKit показывает броски 350-500 мА длительностью от единиц до десятков миллисекунд на каждый кадр. Средний ток за минуту может оставаться скромным, но источник, кабель и стабилизатор видят именно пики: у них нет усреднителя.
Дальше арифметика мелочей, и она безжалостна. Дешёвый micro-USB кабель с тонкими жилами — порядка 0,2 Ом на метр туда и столько же обратно; при пике 0,4 А полутораметровый кабель съедает около 0,24 В. Порт, отдающий 4,75 В вместо честных пяти, плюс падение AMS1117 около 1,1 В — и на шине 3V3 в момент передачи остаются 2,8-2,9 В. Порог детектора brownout в ядре по умолчанию около 2,8 В — плата уходит в сброс не потому, что сломалась, а потому что честно сообщает: питание вне допуска. У меня при плохом кабеле тестер на 3V3 показывал 3,1 В в покое и 2,9 В ровно в момент подключения WiFi — те же цифры я потом видел в чужих замерах на форумах.
Распознать это без тестера можно по почерку: сброс случается не когда попало, а в моменты передачи — при begin(), первом кадре, серии HTTP-запросов. В покое плата работает часами без единого рестарта. Если к этой картине добавляется мелькающий Brownout detector triggered, диагноз готов: просадка под пиком, а не слетевшая прошивка и не роутер. Какие пины при этом не стоит трогать, чтобы не добавить себе проблем, — в разборе распиновки DevKit.
Про измерение — отдельное слово, потому что мультиметр тут лжёт. Обычный прибор интегрирует показания за сотни миллисекунд и ваши пики на 20 мс просто не увидит: покажет 90 мА среднего и успокоит. Нужен USB-тестер с выборкой по максимуму — он ловит бросок целиком, а для просадки на 3V3 хватит и вольтметра, если смотреть на него ровно в момент begin(). Осциллограф с шунтом — роскошь, я обошёлся тестером за сотню с копейками и парой замеров в нужный момент.
У детектора есть и обратная сторона. Порог зашит в eFuse и по умолчанию стоит около 2,8 В, и я встречал платы, которые честно сбрасывались при 2,75 В под нагрузкой — питание вроде живое, а чип уже нервничает. Задрать или опустить порог можно прожигом eFuse через esptool, но это одноразовая операция, и я её не советую, пока не перепробуете кабель, конденсатор и блок. Отключать детектор вовсе — путь к порче флеша: запись при просевшем питании портит секторы молча, и вы узнаете об этом по исчезнувшим настройкам через неделю.
Лечение: кабель, конденсатор, другой стабилизатор
Начинаю снизу. Кабель — короткий и толстый, порт — не хаб, зарядка с честным ампером. Затем конденсатор: электролит 470 мкФ плюс керамика 100 нФ между 3V3 и GND прямо у платы. На форумах советуют от 100 до 470 мкФ; я остановился на 470, потому что электролит отдаёт рывок кадра, а керамика гасит высокочастотный звон, который электролиту не по зубам. Полярность соблюдать, место на DevKit рядом с разъёмом есть. Эти две меры закрывают девять моих случаев из десяти; про фильтрующие ёмкости подробнее — в уроке про конденсатор фильтра питания.
Проверьте и верхнюю ступень — линию 5 В. На DevKit входной путь один из двух: USB-разъём или пин VIN/5V, дальше общий стабилизатор. Если плата питается от внешнего источника на VIN, просадка считается на всём пути: тонкие перемычки макетки добавляют свои доли Ома, и пики в 400 мА на них роняют вход стабилизатора раньше, чем это видно на 3V3. У меня случай с зарядкой вылечился заменой двух перемычек на провод потолще — без единого конденсатора, хотя конденсатор всё равно остался.
Про электролит добавлю физику, чтобы 470 мкФ не выглядели магией. Заряд равен ёмкости, умноженной на просадку: при 470 мкФ и дельте 0,2 В конденсатор отдаёт около 94 мкКл, что при пике 0,4 А растягивается на 235 микросекунд — короткую вспышку кадра он глотает целиком, а секундные броски уже не по зубам. Отсюда правило места: чем длиннее провод от конденсатора до потребителя, тем больше добавленная индуктивность и тем позже помощь. И ещё: электролиты дешёвых партий теряют ёмкость за год вдвое, поэтому раз в сезон стоит померить, жив ли ваш сглаживающий кадр.
Со стабилизаторами поинтереснее. AMS1117-3.3 на DevKit — линейный: вход должен быть выше выхода примерно на 1,1 В, разницу он греет сам собой, а собственное потребление около 5 мА не выключается никогда, даже во сне. Для банки 18650, которая к вечеру проседает до 3,5-3,3 В, этого запаса уже не остаётся — buck-преобразователь (MP1584, mini560) с КПД за 90 % и падением в сотые доли вольта снимает сразу обе беды: и нагрев, и «банка ещё жива, а плата уже перезагружается». Для совсем сонных проектов берут HT7333: его собственное потребление — единицы мкА против пяти миллиампер AMS1117, и для батареечного сна это половина всей еды. Механику этих микросхем разбирали в уроке про AMS1117.
#include <WiFi.h>#include "esp_system.h" // esp_reset_reason() const char* SSID_NAME = "HomeNet";const char* PASS = "12345678"; void setup() { Serial.begin(115200); delay(300); // дать источнику выдохнуть после старта if (esp_reset_reason() == ESP_RST_BROWNOUT) { Serial.println("прошлый сброс: просадка питания"); delay(10000); // пауза вместо немедленной атаки на сеть } Serial.println("поднимаю WiFi..."); WiFi.begin(SSID_NAME, PASS); while (WiFi.status() != WL_CONNECTED && millis() < 20000) delay(250); Serial.print("IP: "); Serial.println(WiFi.localIP());} void loop() { delay(1000); }Разбор. esp_reset_reason() после загрузки говорит, почему плата стартовала: ESP_RST_BROWNOUT — прошлый сброс был по питанию. На такой случай перед WiFi.begin() стоит пауза в десять секунд: дать источнику выдохнуть, а не атаковать сеть сразу после рестарта — без паузы плата иногда ходит в цикле «сброс-передача», пока её не выключишь. Первые 300 мс после подачи питания я тоже молчу: на старте у стабилизатора и конденсаторов свои дела, и им не нужен одновременный старт Serial и радио.
Повербанк: сосед, который засыпает первым
Повербанк на 10000 мА·ч обязан кормить датчик месяц — по бумагам. В жизни он выключался через минуту после того, как плата засыпала: почти все банки следят за током нагрузки и гасят выход, когда он падает ниже порога автостопа — обычно 50-100 мА — на минуту-другую. Глубокий сон DevKit (10-20 мА) попадает в эту зону с запасом. Рабочие пути: банка с режимом малого тока (у части моделей — двойное нажатие кнопки), light sleep вместо глубокого, чтобы держать ток над порогом, периодический пинок нагрузки или честная банка 18650 с buck — без электроники, которая решает за вас. Проверить порог просто: воткните в банк зарядку от наушников — если банк выключается и от неё, для сна он не годится. Сам бюджет на батарее я уже считал в уроке про 18650, оттуда же цифры саморазряда.
Порядок диагностики, который экономит вечер: кабель, порт, конденсатор, стабилизатор, источник целиком. Каждый шаг проверяется под нагрузкой, а не на глазок: тестер в разрыве — на пики, щупы на 3V3 — в момент подключения WiFi. Скетч из урока помогает превращать цикл перезагрузок в журнал: пауза перед begin() и сообщение о причине прошлого сброса дают картину, а не кашу из строк. Про варианты питания вообще без USB — в заметке про батарейки из раздела про среду. И не проверяйте питание на глаз по яркости LED: светодиод светит и при 2,9 В — цифры даёт только тестер.
| Источник | Запас на пик 400 мА | Ток DevKit во сне | Грабля |
|---|---|---|---|
| USB-порт ноутбука | 500 мА по спецификации — впритык | 10-20 мА | хаб делит порт между устройствами |
| Зарядка 5 В / 1 А | запас 2,5 раза | 10-20 мА | дешёвый кабель съедает вольты |
| Повербанк 10000 мА·ч | хватает надолго | 10-20 мА — ниже порога автостопа | гасит выход во время сна |
| 18650 + buck MP1584 | зависит от банки | 1-2 мА buck плюс обвязка модуля | нужна защита от переразряда |
- 1. В мониторе мелькает Brownout detector triggered, плата циклично перезагружается при старте WiFi. Что это?
- 2. Какая обвязка гасит просадку при пиках передачи?
- 3. Почему повербанк выключается, пока плата спит?
- 4. Почему AMS1117 плохо дружит с банкой 18650?
- 5. Какой ток показывает DevKit в пиках передачи WiFi?
- Пики WiFi на DevKit — 350-500 мА на миллисекунды; источник, кабель и стабилизатор видят пики, а не средний ток.
- «Brownout detector triggered» — питание просело ниже ~2,8 В: ищите в порядке кабель, порт, конденсатор, стабилизатор.
- Электролит 470 мкФ плюс керамика 100 нФ прямо у платы закрывают большинство случаев просадки.
- AMS1117: падение ~1,1 В и 5 мА собственных; buck (MP1584) и HT7333 — для банок и сна.
- Повербанк выключается при токе ниже ~50-100 мА: глубокий сон DevKit попадает в эту зону.
Частые вопросы по теме урока
- В мониторе мелькает Brownout detector triggered, плата циклично перезагружается при старте WiFi. Что это?
- Детектор brownout следит за напряжением чипа и честно уводит плату в сброс при просадке. Ищите слабое место в цепи питания, а не в скетче. Питание просело ниже порога около 2,8 В, ядро ушло в защиту
- Какая обвязка гасит просадку при пиках передачи?
- Электролит отдаёт рывок кадра, керамика гасит высокочастотный звон. На форумах сходятся на 100-470 мкФ; чем ближе ёмкость к плате, тем лучше. Электролит 470 мкФ плюс керамика 100 нФ у платы
- Почему повербанк выключается, пока плата спит?
- Глубокий сон DevKit — 10-20 мА, это ниже типового порога. Спасают режим малого тока, light sleep или банка 18650 с buck. Ток нагрузки упал ниже порога автостопа, обычно 50-100 мА
- Почему AMS1117 плохо дружит с банкой 18650?
- Линейному стабилизатору нужен запас сверху. К вечеру банка отдаёт 3,5-3,3 В — запаса нет, и плата перезагружается. Buck снимает и падение, и нагрев. Ему нужно входное на ~1,1 В выше выхода, а просевшая банка этого не даёт
- Какой ток показывает DevKit в пиках передачи WiFi?
- Даташит чипа даёт пики до 240 мА, на плате с обвязкой тестер видит 350-500 мА на каждый кадр. Средний ток при этом может оставаться скромным. 350-500 мА длительностью единицы-десятки мс