Перейти к содержанию

Почему ESP32 не просыпается от кнопки?

Обновлено Редакция GAW

В глубоком сне у ESP32 работают только RTC-память и RTC-периферия. Обычный модуль GPIO выключен, поэтому кнопка на произвольном выводе контроллер не разбудит. Будить могут только выводы, у которых есть функция RTC GPIO, и только через специальные источники пробуждения ext0 и ext1.

Вывод ESP32Будит из Deep-sleepВстроенная подтяжкаЗамечание
GPIO0, 2, 4, 12–15, 25–27, 32, 33да (ext0, ext1)есть, около 45 кОмGPIO0, 2, 12, 15 — выводы обвязки загрузки
GPIO34–39да (ext0, ext1)нетнужен внешний резистор; на модуле WROOM-32E выведены только 34, 35, 36 и 39
Остальные GPIOнетестьбудят только из Light-sleep

Что проверить

  1. Вывод. Кнопка на одном из RTC GPIO из списка ESP-IDF: 0, 2, 4, 12–15, 25–27, 32–39.
  2. Источник. Для одной кнопки — esp_sleep_enable_ext0_wakeup(вывод, уровень), для нескольких — ext1 с маской.
  3. Подтяжка во сне. Для ext0 подтяжку включают функциями rtc_gpio_pullup_en() или rtc_gpio_pulldown_en() до входа в сон. У GPIO34–39 встроенных резисторов нет — по даташиту только внешний резистор. Для пробуждения низким уровнем ESP-IDF настоятельно рекомендует внешнюю подтяжку вверх.
  4. Выводы обвязки загрузки. Кнопка, нажатая при включении, на GPIO0, 2, 12 или 15 может изменить режим загрузки — их уровни разобраны на странице strapping-выводы ESP32.

После пробуждения

Глубокий сон заканчивается перезапуском программы с начала, а вывод, которым будили, остаётся в режиме RTC IO — перед обычным чтением его возвращают функцией rtc_gpio_deinit().

Режимы сна и ток потребления описаны на странице глубокий сон ESP32, общий обзор — в термине «режимы сна микроконтроллера», а нужен ли резистор кнопке в обычной работе — в ответе «Нужен ли резистор для кнопки на ESP32?».

Похожие вопросы

Можно ли разбудить ESP32 несколькими кнопками?

Да, через ext1 с маской выводов. Но у ESP32 условие общее: либо проснуться, когда любой из выбранных выводов в единице, либо когда все в нуле. Поэтому кнопки на ext1 обычно подключают к питанию с подтяжкой к земле и выбирают режим «любой в единице».

Почему после пробуждения кнопка перестала читаться через digitalRead?

После пробуждения через ext0 или ext1 вывод остаётся в режиме RTC IO. ESP-IDF требует вызвать rtc_gpio_deinit(), чтобы снова использовать его как обычный GPIO.

Можно ли разбудить ESP32 любым выводом?

Из лёгкого сна — да: функция gpio_wakeup_enable() работает с любым выводом. Из глубокого сна — только с выводами RTC GPIO через ext0 или ext1.

Источники

  1. Espressif. ESP-IDF Programming Guide v6.1, Sleep Modes (ESP32) — External Wakeup (ext0) — пробуждение одним выводом RTC GPIO по заданному уровню, RTC-периферия остаётся включённой, подтяжки включают rtc_gpio_pullup_en() и rtc_gpio_pulldown_en() до сна; ext1 — несколько выводов RTC GPIO, условия ESP_EXT1_WAKEUP_ANY_HIGH или ESP_EXT1_WAKEUP_ALL_LOW, при нескольких выводах уровень пробуждения один для всех; встроенные подтяжки не работают при выключенной RTC-периферии, если их не удержать функциями HOLD; после пробуждения вывод остаётся в режиме RTC IO, для работы как GPIO вызывают rtc_gpio_deinit(); выводы для ext1 у ESP32 — 0, 2, 4, 12–15, 25–27, 32–39; в лёгком сне будит любой вывод через gpio_wakeup_enable(); при пробуждении низким уровнем Espressif настоятельно рекомендует внешнюю подтяжку вверх
  2. Espressif. ESP32 Series Datasheet v5.3 — разд. 4.3.1 — в Deep-sleep включены только RTC-память и RTC-периферия; ток в Deep-sleep около 10 мкА; табл. 2-1 — номера RTC_GPIO у выводов; приложение A — GPIO34–39 только входы, без выходного драйвера и без встроенных подтяжек; табл. 5-3 — встроенная подтяжка около 45 кОм
  3. Espressif. ESP32-WROOM-32E & ESP32-WROOM-32UE Datasheet v2.1 — табл. назначения выводов модуля — SENSOR_VP (GPIO36), SENSOR_VN (GPIO39), IO34, IO35; GPIO37 и GPIO38 на выводы модуля не выведены

Нашли ошибку?