Почему 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 |
Что проверить
- Вывод. Кнопка на одном из RTC GPIO из списка ESP-IDF: 0, 2, 4, 12–15, 25–27, 32–39.
- Источник. Для одной кнопки —
esp_sleep_enable_ext0_wakeup(вывод, уровень), для нескольких — ext1 с маской. - Подтяжка во сне. Для ext0 подтяжку включают функциями
rtc_gpio_pullup_en()илиrtc_gpio_pulldown_en()до входа в сон. У GPIO34–39 встроенных резисторов нет — по даташиту только внешний резистор. Для пробуждения низким уровнем ESP-IDF настоятельно рекомендует внешнюю подтяжку вверх. - Выводы обвязки загрузки. Кнопка, нажатая при включении, на 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.
Источники
- 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 настоятельно рекомендует внешнюю подтяжку вверх
- 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 кОм
- Espressif. ESP32-WROOM-32E & ESP32-WROOM-32UE Datasheet v2.1 — табл. назначения выводов модуля — SENSOR_VP (GPIO36), SENSOR_VN (GPIO39), IO34, IO35; GPIO37 и GPIO38 на выводы модуля не выведены
Нашли ошибку?
Смотрите также
- Глубокий сон ESP32Режимы сна, токи, пробуждение по таймеру и выводам, RTC-память, расчёт батареи
- Режимы снаSleep mode: Idle, Power-down, пробуждение и ток
- Strapping-выводы ESP32Какие GPIO читаются при сбросе: загрузка, напряжение флеш-памяти, JTAG — для ESP32, S2, S3, C2, C3, C5, C6, H2, P4
- Нужен ли резистор для кнопки на ESP32?Обычно хватит встроенной подтяжки, кроме GPIO34–39