Плата:ESP32ESP32-S3ESP32-C3
GPIO плавает: ложные срабатывания входов на ESP32
Пин, который читается то HIGH, то LOW без видимой причины, почти всегда не имеет заданного pull-up/pull-down резистора — вход в таком состоянии подхватывает наводки как антенна.
Возможные причины
- Пин настроен как INPUT без внутреннего pull-up/pull-down (pinMode(pin, INPUT) без резистора)
- Используется strapping-пин (GPIO0, GPIO2, GPIO12, GPIO15), который имеет особое поведение при старте
- Длинный провод к кнопке или датчику без резистора работает как антенна для наводок
- На ESP32-C3/S3 некоторые GPIO по умолчанию имеют иной pull-статус после reset, чем ожидается
- Общая земля с шумной периферией (моторы, реле) создаёт помехи на соседних линиях
Что сделать
- Задайте явный pull-up или pull-down: pinMode(pin, INPUT_PULLUP) или INPUT_PULLDOWN вместо простого INPUT.
- Если внутреннего резистора недостаточно, добавьте внешний резистор 4.7–10 кОм между пином и VCC/GND.
- Проверьте, не используете ли вы strapping-пин (0, 2, 12, 15) — для входов лучше выбрать другой свободный GPIO.
- Укоротите провод до датчика/кнопки или экранируйте его; добавьте конденсатор 100 нФ для подавления дребезга и наводок.
- Разнесите провода питания моторов/реле подальше от сигнальных линий GPIO.
- Считайте пин несколько раз подряд с задержкой (программный debounce) прежде чем доверять единичному чтению.
Когда менять железо
GPIO меняют вместе с платой только при физическом повреждении дорожки; в 95% случаев проблема решается резистором или сменой пина.
Не официальная поддержка Espressif Systems. Проверяйте применимость к своей ревизии платы и версии ядра/IDF.