ESP8266 пробуждение от глубокого сна: Как по таймеру, так и по кнопке?
В проекте, работающем на батарейках, ESP8266 должен надолго погрузиться в глубокий сон, отключив радиочастотный сигнал. После некоторого количества циклов сна он перезапускается с включенным RF, синхронизирует время через NTP и снова переходит в спящий режим. Думаю, это может сработать со счетчиком, сохраненным в памяти RTC или SPIFF.
Кроме того, s.o. должен иметь возможность просыпаться с помощью кнопки (в любое время), что должно привести к другому поведению (запуск как точка доступа Wi-Fi, позволяющая настроить новые учетные данные Wi-Fi).
Возникает вопрос: можно ли узнать, что именно разбудило ESP (таймер или кнопку)?
Правка: Используя внешнюю схему, это может быть возможно. Чтобы избежать этого, мы переключаемся на ESP32, что является излишеством для проекта, но легко узнать источник пробуждения (и с возможностью использования сенсорных датчиков). Кроме того, ESP32 позволяет легко использовать "Предпочтения" в NVR и переменные в памяти RTC (при использовании Arduino IDE), которые переживут глубокий сон (RTC) и даже сброс/потерю питания (NVR).
@ridgy, 👍2
Обсуждение3 ответа
Поместите конденсатор со стороны ESP кнопки на одну или другую силовую рейку (я предпочитаю заземляться, но оба варианта должны работать), и процедура setup() считывает состояние кнопочного переключателя, как это первая инструкция. Вероятно, вам даже не нужен конденсатор, но если у вас его нет, вам придется несколько раз считывать состояние переключателя, чтобы учесть возможный отскок контактов.
Если ESP просыпается из-за таймера, на линии PB не будет активности; если он просыпается из-за нажатия кнопки PB, активность на линии PB будет сохраняться в течение нескольких 10 миллисекунд независимо от того, как быстро он нажат и отпущен.
Единственная кнопка, которую я знаю, чтобы разбудить ESP8266, - это кнопка сброса, и она также должна использоваться таймером. Или я ошибаюсь?, @ridgy
Ах, я думал, что операция имела в виду внешнюю кнопку. Это решение все еще может сработать, если состояние кнопки сброса можно прочитать программно во время установки()., @user3765883
Решение с конденсатором работает, но я хотел бы подробнее рассказать, что именно я сделал и почему я нашел это полезным. Вот моя схема:
При пробуждении первое, что я делаю, это читаю D1. После этого я установил D1 на выход и установил высокий уровень, чтобы конденсатор оставался заряженным. Это предотвращает сброс ESP при втором нажатии кнопки.
Затем, перед сном, я устанавливаю на выводе низкий уровень на несколько мс, чтобы разрядить конденсатор.
Я выбрал конденсатор самого маленького размера, потому что в быстрой зарядке нет недостатков.
Обратите внимание, что ESP сбрасывается при нажатии кнопки - вывод переходит в низкий уровень, а вскоре после этого переходит в высокий уровень по мере зарядки конденсатора, и все это до того, как кнопка будет отпущена. Это идеальный вариант в тех случаях, когда вы хотите, чтобы нажатие кнопки вызывало пробуждение, а не отпускание.
Если D0 положительный, а D1 отрицательный, вы замыкаете питание, ПЛОХО.... Это приведет к сбросу чипа, но он сгорит... Я бы просто использовал логический элемент «и»; например MC74VHC1G08... Я не пробовал вашу идею, но соединение двух выходов микросхемы вместе - не лучшая идея...
это просто ТТЛ. Так работает TTL., @Juraj
- ESP8266 глубокий сон и MQTT
- Вывод ESP8266 из deepSleep с помощью кнопки
- PIR движение выводит ESP8266 из глубокого сна
- Память ESP8266 RTC (для загрузки)
- Легкий сон ESP8266 — не могу проснуться
- NodeMCU 12E V2 Энергосбережение
- Как предотвратить мерцание реле при пробуждении от глубокого сна с помощью платы ESP01?
- Материнская плата WeMos D1 ESP-Wroom-02 ESP8266 — где контакт сброса для глубокого сна
Это ответ на ваш вопрос? Пробуждение ESP8266 от глубокого сна с button, @Juraj
Ну, не совсем. Сброс ESP с помощью кнопки не является проблемой; в обоих случаях /by button/by timer ESP будет сброшен, выполнив код setup (). Но как узнать, почему он был сброшен? Я читал что-то о
rtc_get_reset_reason()
иESP.getResetReason()
; попробую это и сообщу об успехе., @ridgyВ случае пробуждения от глубокого сна,
rtc_get_reset_reason()
всегда отвечает "пробуждение от глубокого сна" - это правильно, но не помогает здесь., @ridgyэто тот же сброс с кнопкой и с io 16. программное обеспечение не может его различить. сброс с io 16 является обходным путем для ошибки в коде ПЗУ esp8266, @Juraj