Вот уже более пяти лет WiFi модули на основе SOC ESP8266(ESP8285) успешно используются в автономных устройствах для измерения различных параметров объектов и окружающей среды с передачей по WiFi полученных данных.
В заметке «Как уменьшить потребление wifi модулей в десять и более раз» рассказывал о некоторых способах уменьшения времени активности WiFI сеанса таких модулей, что позволяет существенно сократить потребление энергии во время передачи данных. При этом типовое время сеанса передачи короткого сообщения удается уменьшить с 1-4 секунд до 0.12-0.3 секунды.
Однако в устройствах с медленными датчиками или с большим их количеством существенно возрастает время получения информации от датчиков. В этом случае потребление энергии при опросе датчиков становится соизмеримым с затратами энергии на передачу данных по WiFi.
В то же время, если контролируемые датчиками параметры существенно не изменились, либо результаты измерений можно использовать автономно, то необходимость передачи данных по WiFi отпадает. Например, если измеряемая температура объекта осталась прежней, то передавать ее значение не обязательно, что позволяет экономить энергию на WiFi сеансе.
Более того, модуль измерения температуры на основе ESP8266 может периодически переключаться в режим глубокого сна, при котором ток потребления составляет менее 20 мкА. Просыпаясь, модуль читает показания датчика, сравнивает эти показания с предыдущими данными. Если показания изменились незначительно или находятся в допустимом интервале рабочих температур, то модуль вновь переключается в режим сна без сеанса связи.
Если показания датчика заметно изменились или вышли за пределы допустимого интервала, то модуль передает данные и / или сигнал тревоги по WiFi и переключается в режим глубокого сна.
В простейшем варианте, который часто встречается у большинства пользователей, модуль просыпается с включенным WiFi модемом. В таком случае ток потребления модуля во время опроса датчиков составит 70 мА. Если по итогам опроса передавать ничего не требуется, то затраты энергии на бездействующий WiFi модем будут избыточными.
Можно сделать иначе: При выходе модуля из режима сна отключить WiFi модем на время опроса датчиков, тогда ток потребления составит 15мА, что обеспечит экономию энергии во время работы с датчиками примерно в 5 раз.
Но есть одна проблема и она состоит в том, что отключение WiFi модуля существующими средствами SDK приведет к необходимости полностью восстанавливать соединение с точкой доступа, когда потребуется передать данные. В типовом варианте это увеличит время соединения до 1 секунды и более, вместо 0.3 секунды и менее. Таким образом, уменьшение потребления энергии путем отключения WiFi модема во время опроса датчиков будет перекрыто дополнительным расходом энергии при восстановлении WiFi соединения для передачи данных.
В качестве решения указанной проблемы предлагаю следующий способ отключения и включения WiFi модема. Этот способ не вносит изменений в параметры модема, что, в частности, позволяет сохранить параметры подключения к точке доступа.
В данном способе, в начале тела функции void user_pre_init(void), которая является обязательной для NONOS SDK, начиная с версии 3.0, необходимо сохранить в рабочую переменную значение из ячейки с адресом 0x60000704 и очистить ее. В результате этого действия WiFi модем отключится, а ток потребления модуля составит не более 15 мА.
Затем в тело этой функции помещаем код, который выполняет опрос датчиков и принимает решение о необходимости передачи данных по WiFi.
Если передача данных необходима, то сохраненное ранее значение восстанавливается в ячейке 0x60000704. После этого выполняются типовые действия для передачи данных, которые исполнялись бы и без отключения WiFi модема.
В отличие от типового способа по отключению WiFi модема с помощью функции SDK wifi_get_opmode(), предлагаемый способ отключения / включения не увеличивает время сеанса передачи данных. Таким образом, время передачи данных остается неизменным, как и в случае работы WiFi модема без отключения.
Фрагмент данной функции будет таким:
uint32 *RT= (uint32_t *)0x60000700;
void user_pre_init(void)
{
uint32 xRT=RT[4]; RT[4]=0;
// опрос датчиков и принятие решения о необходимости передачи данных
…
// если передача необходима, то восстанавливаем ячейку:
RT[4]=xRT;
}
Пример работы данного способа:
На картинке четыре интервала выхода модуля из режима сна.
В первых трех интервалах нет надобности в WiFi сеансе.
В четвертом интервале модуль передает данные по протоколу UDP.
Продолжение следует...
В следующей заметке расскажу, как организовать работу модулей ESP8266 с датчиками в режиме ожидания прерываний от таймера или GPIO, но с током потребления 2 мА вместо 15 мА при отключенном WiFi модеме (или вместо 70 мА при включенном). В итоге уменьшаем потребление ESP8266 при работе с датчиками в 10 и более раз.
YouHim
А если модуль не вышел на связь из-за севшей батарейки, или, допустим, поломки?
dmitryrf
Передавать допустимые значения с максимальным приемлемым интервалом.