Обнаружение разницы между сигналом пробуждения в глубоком сне и нажатием кнопки пробуждения вручную

Когда мой ESP8266 выходит из спящего режима (т. е. D0 отправляет сигнал пробуждения), я хочу, чтобы он делал что-то другое, чем когда я вручную пробуждаю устройство с помощью кнопки сброса.

Я подключил контакты RST и D0, чтобы устройство могло выйти из спящего режима. У меня также есть кнопка, подключенная к RST, которая при нажатии замыкается на землю, так что я могу разбудить устройство вручную по требованию.

Как отличить пробуждение устройства само по себе или вручную нажатием кнопки?

Я пытался использовать system_get_rst_info/getResetInfoPtr, чтобы определить, какое действие вывело устройство из спящего режима, но кажется, что если я перезагружу вручную после того, как устройство перешло в спящий режим, REASON_DEEP_SLEEP_AWAKE возвращается причина, поскольку это значение основано на том, как устройство перешло в спящий режим/сброс, а не на том, как оно проснулось.

Отказ от ответственности: я уже нашел решение (ответ ниже), но оно сложнее, чем мне хотелось, поэтому я публикую этот вопрос, чтобы узнать, может ли кто-нибудь еще придумать более простое решение.

, 👍2

Обсуждение

если вы используете ntp, вы можете кэшировать ожидаемое время пробуждения в rtc ram или даже spiffs и сравнивать сохраненное значение с установленным временем при перезагрузке. Если вам случится сбросить вручную точно по расписанию, это приведет к неправильному отчету, но это должно быть редко, и у вас есть обходной путь, если такая точность необходима., @dandavis

О, это хорошая идея!, @Nick Bolton

думал; если вы вычтете millis() из сетевого времени при перезагрузке, вы можете получить действительно хорошее представление о времени сброса utc, исключив время подключения к Wi-Fi. С ведением журнала вы также можете понять, что для сброса требуется, скажем, 10 мс, и добавьте это в свою формулу, чтобы сделать ее еще более точной / точной., @dandavis


1 ответ


Лучший ответ:

0

Я придумал два решения (3, если считать комбинацию), оба предполагают подключение кнопки ручного сброса к другому контакту на микроконтроллере (чтобы я мог проверить, нажата ли она еще при запуске).

Решение 1. Создайте импульс сброса

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

Чтобы решить эту проблему, я использовал моностабильную схему положительного фронта для подачи импульса на вывод RST при нажатии кнопки ручного сброса.

Таким образом, я могу удерживать кнопку нажатой, и устройство запустится. В функции setup() я могу проверить, нажата ли кнопка.

Решение 2. Используйте RC-цепочку задержки

Я также подумал, что могу просто разбудить устройство при отпускании кнопки и использовать защитный колпачок (очень медленный разряд), чтобы увидеть, была ли кнопка нажата в последнюю секунду (проверив контакт на MCU, к которому заряжен крышка подключена).

Решение 3. Комбинация 1 & 2

Объединение 1 и 2 позволило мне вывести устройство из спящего режима при нажатии кнопки и использовать заглушку для предотвращения дребезга, чтобы увидеть, была ли кнопка нажата недавно (в последнюю секунду).

Сброс схемы кнопки

,