Как вернуть 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 после такого сна?

Спасибо

, 👍3


2 ответа


3

https://github.com/esp8266/Arduino/issues/3072#issuecomment-741524721

Это тоже работает, я протестировал его в декабре 2020 года. Спасибо Эрику Бакке за то, что нашел его. Это немного более чисто, чем при другой загрузке в режиме глубокого сна с включенным модемом. Мы с Игрром оба изо всех сил пытались найти способ разбудить модем, и Эрик смешал волшебный соус. Надеюсь, он все еще работает сегодня с изменениями в основных файлах Wi-Fi.

,

Это на самом деле не ответ..., @Coder9390

пожалуйста, добавьте информацию из ссылки к ответу, @Juraj


2

Да, вы правильно поняли; после использования 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 не инициализируется должным образом.

,