Всем привет! Искала разную информацию по настройке спящего режима ESP32 с примерами по одному из них. Например, по таймеру или пину сенсора (типа как прерывание). По отдельности все прекрасно работает. Но мне в проекте нужно объединить оба условия: пользователь ничего не делает – просыпаемся по таймеру, меряем, что-то передаем, засыпаем. Если сработал сенсор – входим в режим отображения и настройки, потом опять спим. Таких примеров с двумя условиями не видела. Попробовала объединить два стандартных примера, описав условия пробуждения:
1 2 |
esp_sleep_enable_touchpad_wakeup(); esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); |
С этим кодом по таймеру все ок, просыпается, но на сенсор не реагирует. Кто-нибудь знает решение?
Проблема может быть в том, что вы используете две разные функции для включения режима сна – esp_sleep_enable_touchpad_wakeup()
и esp_sleep_enable_timer_wakeup()
. Когда вы вызываете обе функции, ESP32 будет ждать либо касания сенсора, либо истечения таймера, чтобы проснуться, но не одновременно.
Вам нужно использовать одну функцию для настройки пробуждения от двух условий. Для этого можно воспользоваться функцией esp_sleep_enable_ext0_wakeup()
, которая позволяет настроить пробуждение по изменению состояния внешнего пина (в вашем случае – сенсора) и таймера одновременно.
Пример кода для вашего случая:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#define TOUCH_PIN T1 // замените на пин вашего сенсора #define TIME_TO_SLEEP 60 // замените на время сна в секундах void setup() { // Настройте пин сенсора как вход pinMode(TOUCH_PIN, INPUT); // Включите пробуждение по касанию сенсора и таймеру esp_sleep_enable_ext0_wakeup(TOUCH_PIN, HIGH); esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); } void loop() { // Здесь вы можете реализовать логику вашего проекта // ... // Засыпайте esp_deep_sleep_start(); } |
В этом коде мы использовали функцию esp_sleep_enable_ext0_wakeup()
, чтобы включить пробуждение по изменению состояния пина TOUCH_PIN с высокого на низкий уровень. При этом мы также включили таймеровое пробуждение с помощью esp_sleep_enable_timer_wakeup()
. Оба условия будут работать одновременно, и ESP32 проснется, когда одно из них будет выполнено.
Убедитесь, что вы подключили ваш сенсор к правильному пину и настроили его правильно в соответствии с документацией ESP32.