Почему аналоговый датчик на ESP32 сходит с ума при включении Wi-Fi

Если аналоговый датчик начинает выдавать бессмысленные значения сразу после запуска Wi-Fi, скорее всего, он подключен к выводу ADC2. Радиомодуль Wi-Fi в ESP32 монополизирует ADC2; переключение датчика на ADC1 моментально решает проблему.
Во время тестирования через последовательный порт USB аналоговый датчик выдает четкие и правдоподобные показания. Но как только код выполняет WiFi.begin() и плата устанавливает соединение, данные начинают хаотично скакать, замирают на отметке 4095 или падают до нуля. Датчик исправен, подтягивающий резистор на месте, и плата работает штатно. Дело в том, что вы подключили датчик к выводу ADC2.
Аппаратное ограничение чипа: ADC1 против ADC2
Кремниевый кристалл стандартного ESP32 содержит два независимых 12-битных периферийных модуля аналого-цифрового преобразователя (АЦП): ADC1 и ADC2. Вместе они обслуживают до 18 аналоговых входных выводов на самом чипе, хотя на платы разработки выводится лишь часть из них.
Модуль ADC1 работает независимо. А вот ADC2 делит внутренние аппаратные ресурсы с радиоподсистемой Wi-Fi и Bluetooth микроконтроллера ESP32. Когда активируется драйвер Wi-Fi — будь то сканирование эфира в поиске SSID, согласование DHCP или передача телеметрии по MQTT, — сетевой стек забирает монопольный доступ к ADC2 для калибровки радиочастотного тракта и измерения внутреннего питания.
Если во время работы драйвера Wi-Fi код вызывает функцию analogRead() на выводе ADC2, драйвер прерывает или блокирует чтение. В средах Arduino Core и MicroPython это проявляется одним из двух способов: функция чтения завершается с ошибкой и возвращает пустое или мусорное значение либо радиочастотный всплеск наводит мощные электрические помехи прямо на периферийный блок, из-за чего результат преобразования колеблется между насыщением (4095) и нулем (0).
Переназначение выводов: безопасные и небезопасные пины
Решение не требует никаких программных обходных путей: достаточно переключить сигнальный провод датчика с вывода ADC2 на вывод ADC1. Каналы ADC1 электрически не связаны с радиочастотным блоком Wi-Fi и стабильно выполняют преобразование независимо от сетевой активности.
| Блок АЦП | Номера GPIO | Безопасен с Wi-Fi? | Примечания для занятий |
|---|---|---|---|
| ADC1 | GPIO 32, 33, 34, 35, 36 (VP), 39 (VN) | Да | Безопасен для любых аналоговых датчиков во время передачи данных по Wi-Fi. Обратите внимание: GPIO 34, 35, 36 и 39 работают только на вход (у них нет внутренних подтягивающих резисторов к питанию или земле). |
| ADC2 | GPIO 0, 2, 4, 12, 13, 14, 15, 25, 26, 27 | Нет | Непригоден для аналоговых измерений после вызова WiFi.begin(). Многие из этих выводов также служат контактами начальной загрузки (bootstrapping pins). |
На распространенных 30- и 38-выводных платах ESP32 NodeMCU/DevKit контакты GPIO 36 и 39 часто обозначены как VP и VN. Именно они, наряду с GPIO 32, 33, 34 и 35, являются основными выводами для сбора аналоговых данных.
Практический пример распиновки
Рассмотрим стандартный школьный проект в сфере IoT: систему мониторинга растений с датчиком влажности почвы либо датчиком освещенности. Ученик подключает аналоговый щуп влажности почвы к GPIO 4 (канал 0 блока ADC2) просто потому, что тот удобно расположен рядом с выводом «земли» (GND). При автономном тестировании монитор порта выводит стабильные значения в диапазоне от 1500 до 2800. Но как только плата подключается к школьной точке доступа для отправки данных на дашборд, показания намертво зависают на 4095.
Как исправить ситуацию:
- Переставьте сигнальный провод с GPIO 4 на GPIO 34 (или 32, 33, 35).
- Обновите номер вывода в коде:
const int sensorPin = 34;. - Оставьте GPIO 4 для цифровых выходов — например, для управления модулем реле или транзистором, коммутирующим погружной насос на 5 В.
Если вы проектируете многодатчиковые метеостанции или комплексы экологического мониторинга, ознакомиться с учебным оборудованием и схемами подключения можно на странице Sheen IoT.
Второй фактор: просадка шины питания
Если вы уже переключили датчик на ADC1 (например, на GPIO 32), но во время передачи данных все равно наблюдаются небольшие резкие скачки, проблема кроется не в блокировке АЦП, а в стабильности питания. Когда ESP32 включает передатчик радиомодуля, потребление тока на несколько миллисекунд резко подскакивает с ~50 мА до более чем 300–400 мА.
Если плата питается от нестабильного порта USB на старой мобильной тележке с ноутбуками или подключена через тонкие макетные провода, шина 3,3 В кратковременно проседает. Поскольку аналого-цифровое преобразование измеряет напряжение относительно опорного напряжения шины питания, просадка шины приводит к кажущемуся резкому росту внешнего аналогового напряжения. Электролитический конденсатор емкостью 100 мкФ, установленный на макетной плате между выводами 3V3 и GND, полностью сглаживает такие импульсные радиопомехи.



