ПинЛог

Плата: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, чем ожидается
  • Общая земля с шумной периферией (моторы, реле) создаёт помехи на соседних линиях

Что сделать

  1. Задайте явный pull-up или pull-down: pinMode(pin, INPUT_PULLUP) или INPUT_PULLDOWN вместо простого INPUT.
  2. Если внутреннего резистора недостаточно, добавьте внешний резистор 4.7–10 кОм между пином и VCC/GND.
  3. Проверьте, не используете ли вы strapping-пин (0, 2, 12, 15) — для входов лучше выбрать другой свободный GPIO.
  4. Укоротите провод до датчика/кнопки или экранируйте его; добавьте конденсатор 100 нФ для подавления дребезга и наводок.
  5. Разнесите провода питания моторов/реле подальше от сигнальных линий GPIO.
  6. Считайте пин несколько раз подряд с задержкой (программный debounce) прежде чем доверять единичному чтению.

Когда менять железо

GPIO меняют вместе с платой только при физическом повреждении дорожки; в 95% случаев проблема решается резистором или сменой пина.

Не официальная поддержка Espressif Systems. Проверяйте применимость к своей ревизии платы и версии ядра/IDF.

Связанные материалы