Как вернуть Wi-Fi обратно, если его разбудили из глубокого сна(WAKE_RF_DISABLED)
Я пытаюсь создать датчик, который должен обновлять брокер MQTT только в том случае, если что-то меняется. Поэтому каждые несколько секунд он должен просыпаться ровно настолько, чтобы проверить несколько входных данных, сравнить их с последним пробуждением, и только в случае каких-либо изменений он должен подключаться к брокеру и записывать обновления. Я не ожидаю много обновлений в день, но если я сплю больше 10 секунд, то могу их пропустить.
Я использую WiFi.forceSleepBegin()
и WiFi.forceSleepWake()
, в основном основанные на этих статьях. Но есть и такой заманчивый вариант, как ESP.DeepSleep(n, WAKE_RF_DISABLED).
В API, который я нашел, упоминается только следующее:
Если вы реализуете глубокий сон с помощью WAKE_RF_DISABLED и требуете функции Wi-Fi при пробуждении, вам нужно будет реализовать дополнительный WAKE_RF_DEFAULT, прежде чем функция Wi-Fi станет доступной.
Правильно ли я читаю это, если понимаю, что мне нужно будет сделать еще один глубокий сон
, чтобы снова проснуться с включенным Wi-Fi? Или есть более простой способ загрузить Wi-Fi после такого сна?
Спасибо
@chw21, 👍3
2 ответа
https://github.com/esp8266/Arduino/issues/3072#issuecomment-741524721
Это тоже работает, я протестировал его в декабре 2020 года. Спасибо Эрику Бакке за то, что нашел его. Это немного более чисто, чем при другой загрузке в режиме глубокого сна с включенным модемом. Мы с Игрром оба изо всех сил пытались найти способ разбудить модем, и Эрик смешал волшебный соус. Надеюсь, он все еще работает сегодня с изменениями в основных файлах Wi-Fi.
Да, вы правильно поняли; после использования ESP.deepSleep(n, WAKE_RF_DISABLED)
для отключения Wi-Fi наиболее надежный способ его повторного включения — вызвать ESP.deepSleep(1, WAKE_RF_DEFAULT)
. Затем подключитесь к WiFi при следующем пробуждении (которое должно произойти через 1 секунду). Очевидно, WAKE_RFCAL
и WAKE_NO_RFCAL
также приводят к WiFi работает.
Дешевый способ приблизиться к этому — обычно спать с WAKE_RF_DISABLED
, но когда ваше WiFi-соединение терпит неудачу, спать с WAKE_RF_DEFAULT
, чтобы повысить вероятность успешного следующего подключения. .
Если вам нужно более элегантное, но немного более сложное решение, вы можете использовать память RTC (эй, это похоже на то, что мы пытаемся сделать) для сохранения известного состояния WiFi, когда вы спите; поэтому, когда вы спите с WAKE_RF_DISABLED
, вы будете знать, что вам придется выполнить сброс с помощью WAKE_RF_DEFAULT
, прежде чем пытаться подключиться. И когда вы снова проснетесь, вы будете знать, что Wi-Fi включен.
Как упоминалось в другом ответе, вы можете вызвать WiFi.forceSleepBegin()
и WiFi.forceSleepWake()
, чтобы попытаться восстановить Wi-Fi без сброса, и хотя я действительно обнаружил, что это работает, к сожалению, это кажется ненадежным. Кажется, что он может работать при питании от USB, но при переключении на другой источник питания он перестает работать. Я не уверен, почему. При использовании этого подхода иногда MCU потребляет всего 40 мА, когда он должен потреблять 70 мА при включенном Wi-Fi, поэтому это говорит мне о том, что WiFi не инициализируется должным образом.
- Как читать и записывать 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?
Это на самом деле не ответ..., @Coder9390
пожалуйста, добавьте информацию из ссылки к ответу, @Juraj