Обнаружение разницы между сигналом пробуждения в глубоком сне и нажатием кнопки пробуждения вручную
Когда мой ESP8266 выходит из спящего режима (т. е. D0 отправляет сигнал пробуждения), я хочу, чтобы он делал что-то другое, чем когда я вручную пробуждаю устройство с помощью кнопки сброса.
Я подключил контакты RST и D0, чтобы устройство могло выйти из спящего режима. У меня также есть кнопка, подключенная к RST, которая при нажатии замыкается на землю, так что я могу разбудить устройство вручную по требованию.
Как отличить пробуждение устройства само по себе или вручную нажатием кнопки?
Я пытался использовать system_get_rst_info
/getResetInfoPtr
, чтобы определить, какое действие вывело устройство из спящего режима, но кажется, что если я перезагружу вручную после того, как устройство перешло в спящий режим, REASON_DEEP_SLEEP_AWAKE
возвращается причина, поскольку это значение основано на том, как устройство перешло в спящий режим/сброс, а не на том, как оно проснулось.
Отказ от ответственности: я уже нашел решение (ответ ниже), но оно сложнее, чем мне хотелось, поэтому я публикую этот вопрос, чтобы узнать, может ли кто-нибудь еще придумать более простое решение.
@Nick Bolton, 👍2
Обсуждение1 ответ
Лучший ответ:
Я придумал два решения (3, если считать комбинацию), оба предполагают подключение кнопки ручного сброса к другому контакту на микроконтроллере (чтобы я мог проверить, нажата ли она еще при запуске).
Решение 1. Создайте импульс сброса
Проблема с кнопкой ручного сброса заключается в том, что она сбрасывается только при отпускании, поскольку, пока на выводе RST удерживается низкий уровень, MCU не запускается.
Чтобы решить эту проблему, я использовал моностабильную схему положительного фронта для подачи импульса на вывод RST при нажатии кнопки ручного сброса.
Таким образом, я могу удерживать кнопку нажатой, и устройство запустится. В функции setup()
я могу проверить, нажата ли кнопка.
Решение 2. Используйте RC-цепочку задержки
Я также подумал, что могу просто разбудить устройство при отпускании кнопки и использовать защитный колпачок (очень медленный разряд), чтобы увидеть, была ли кнопка нажата в последнюю секунду (проверив контакт на MCU, к которому заряжен крышка подключена).
Решение 3. Комбинация 1 & 2
Объединение 1 и 2 позволило мне вывести устройство из спящего режима при нажатии кнопки и использовать заглушку для предотвращения дребезга, чтобы увидеть, была ли кнопка нажата недавно (в последнюю секунду).
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ESP8266 не подключается к Wi-Fi
- AT-команда не отвечает на последовательный монитор
- Разница между этими двумя платами NodeMCU?
если вы используете ntp, вы можете кэшировать ожидаемое время пробуждения в rtc ram или даже spiffs и сравнивать сохраненное значение с установленным временем при перезагрузке. Если вам случится сбросить вручную точно по расписанию, это приведет к неправильному отчету, но это должно быть редко, и у вас есть обходной путь, если такая точность необходима., @dandavis
О, это хорошая идея!, @Nick Bolton
думал; если вы вычтете millis() из сетевого времени при перезагрузке, вы можете получить действительно хорошее представление о времени сброса utc, исключив время подключения к Wi-Fi. С ведением журнала вы также можете понять, что для сброса требуется, скажем, 10 мс, и добавьте это в свою формулу, чтобы сделать ее еще более точной / точной., @dandavis