ESP8266 пробуждение от глубокого сна: Как по таймеру, так и по кнопке?

В проекте, работающем на батарейках, ESP8266 должен надолго погрузиться в глубокий сон, отключив радиочастотный сигнал. После некоторого количества циклов сна он перезапускается с включенным RF, синхронизирует время через NTP и снова переходит в спящий режим. Думаю, это может сработать со счетчиком, сохраненным в памяти RTC или SPIFF.

Кроме того, s.o. должен иметь возможность просыпаться с помощью кнопки (в любое время), что должно привести к другому поведению (запуск как точка доступа Wi-Fi, позволяющая настроить новые учетные данные Wi-Fi).

Возникает вопрос: можно ли узнать, что именно разбудило ESP (таймер или кнопку)?

Правка: Используя внешнюю схему, это может быть возможно. Чтобы избежать этого, мы переключаемся на ESP32, что является излишеством для проекта, но легко узнать источник пробуждения (и с возможностью использования сенсорных датчиков). Кроме того, ESP32 позволяет легко использовать "Предпочтения" в NVR и переменные в памяти RTC (при использовании Arduino IDE), которые переживут глубокий сон (RTC) и даже сброс/потерю питания (NVR).

, 👍2

Обсуждение

Это ответ на ваш вопрос? Пробуждение 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


3 ответа


1

Поместите конденсатор со стороны ESP кнопки на одну или другую силовую рейку (я предпочитаю заземляться, но оба варианта должны работать), и процедура setup() считывает состояние кнопочного переключателя, как это первая инструкция. Вероятно, вам даже не нужен конденсатор, но если у вас его нет, вам придется несколько раз считывать состояние переключателя, чтобы учесть возможный отскок контактов.

Если ESP просыпается из-за таймера, на линии PB не будет активности; если он просыпается из-за нажатия кнопки PB, активность на линии PB будет сохраняться в течение нескольких 10 миллисекунд независимо от того, как быстро он нажат и отпущен.

,

Единственная кнопка, которую я знаю, чтобы разбудить ESP8266, - это кнопка сброса, и она также должна использоваться таймером. Или я ошибаюсь?, @ridgy

Ах, я думал, что операция имела в виду внешнюю кнопку. Это решение все еще может сработать, если состояние кнопки сброса можно прочитать программно во время установки()., @user3765883


0

Решение с конденсатором работает, но я хотел бы подробнее рассказать, что именно я сделал и почему я нашел это полезным. Вот моя схема:

При пробуждении первое, что я делаю, это читаю D1. После этого я установил D1 на выход и установил высокий уровень, чтобы конденсатор оставался заряженным. Это предотвращает сброс ESP при втором нажатии кнопки.

Затем, перед сном, я устанавливаю на выводе низкий уровень на несколько мс, чтобы разрядить конденсатор.

Я выбрал конденсатор самого маленького размера, потому что в быстрой зарядке нет недостатков.

Обратите внимание, что ESP сбрасывается при нажатии кнопки - вывод переходит в низкий уровень, а вскоре после этого переходит в высокий уровень по мере зарядки конденсатора, и все это до того, как кнопка будет отпущена. Это идеальный вариант в тех случаях, когда вы хотите, чтобы нажатие кнопки вызывало пробуждение, а не отпускание.

,

0

Если D0 положительный, а D1 отрицательный, вы замыкаете питание, ПЛОХО.... Это приведет к сбросу чипа, но он сгорит... Я бы просто использовал логический элемент «и»; например MC74VHC1G08... Я не пробовал вашу идею, но соединение двух выходов микросхемы вместе - не лучшая идея...

,

это просто ТТЛ. Так работает TTL., @Juraj