Делюсь опытом ESP8266.Экономим энергию. Отключение WiFi.

nikolz

Well-known member
Большинство устройств на ESP используют режим deep-sleep для экономии питания.
При этом работа устройства как правило состоит из трех этапов.
На первом этапе ESP просыпается опрашивает датчики, выполняет вычисления.
На втором этапе ESP передает данные по WiFi,либо решает, что передача откладывается.
На третьем этапе переходит в режим глубокого сна.
-----------------
При этом, WiFi приемник включается в начале первого этапа и выключается лишь в конце третьего.
При этом ток потребления ESP8266 составляет 70 ма.
------------------
Если включить WiFi лишь в случае надобности передачи, то ток потребления без WiFi составит 11-15 ма
при активном процессоре и 2-3 ма , при реализации ожидания прерывания от GPIO или RTC.
Но к сожалению это не реализовано в SDK, поэтому ESP8266 всегда кушает в активном режиме 70 ма вместо 10 т е затраты энергии в 6 раз больше необходимого.
-----------------------
Решить задачу избирательного включения WiFi при необходимости можно простым костылем.
Для этого надо изменить имя функции call_user_start в библиотеке libmain.a на другое
например такое call2user_start и добавить в скетч такую функцию
void call_user_start()
{
// здесь работаем с датчиками и делаем вычисления
call2user_start(); //переходим в обычный режим с включением WIFI
}
 

nikolz

Well-known member
вот так можно уменьшить потребление:
желтым выделена область исполнения функции call_user_start до вызова call2user_start()
33 ma вместо 75 ма получится если сделать как указано выше.
upload_2019-5-25_9-41-40.png
 

Вложения

nikolz

Well-known member
изменить имя библиотечной функции можно различными способами
Простейший из них.
Делаем копию библиотеки на всякий случай.
Читаем библиотеку шестнадцатеричным редактором
ищем имя функции (в двух местах) и заменяем в нем байт "_" на код 32 - "2".
сохраняем библиотеку
 

Сергей_Ф

Moderator
Команда форума
Дожили. @nikolz занялся хаком SDK!

Николай, а
wifi_set_opmode(NULL_MODE);
вообще не помогает? Я не мерил, но 2 батарейки АА прекрасно живут год с esp без всяких преобразователей с пробуждением раз в 30 секунд и переодическим кручением моторчика (от 6 до 20 раз в сутки). И это скетч на АрдуиноИДЕ, правда вообще без wifi.
 

nikolz

Well-known member
Дожили. @nikolz занялся хаком SDK!

Николай, а
wifi_set_opmode(NULL_MODE);
вообще не помогает? Я не мерил, но 2 батарейки АА прекрасно живут год с esp без всяких преобразователей с пробуждением раз в 30 секунд и переодическим кручением моторчика (от 6 до 20 раз в сутки). И это скетч на АрдуиноИДЕ, правда вообще без wifi.
Если WiFi вообще не надо, то все просто выкидываете все настройки и убиваете нафиг wifi_set_opmode(NULL_MODE).
Но тогда зачем ESP ставить?
Берем STM8L и будет работать веками. Более того там и драйвер для дисплея уже есть и цена меньше.
-----------------------
А вот если не только управлять но и передавать сигналы бедствия , то за 5 лет в инете смогли сделать лишь
повторный перезапуск ESP т е сначала без WiFi потом если надо wifi его включаем но включится он лишь в новом просыпании
Как вам такие костыли?
------------------------
у меня решение простое . Поменял один байт в двух местах в одной библиотеке
можно сделать это и в make
---------------------------
при этом на включение WIFI не тратится доп время
------------------------
Можно иначе сделать например работать с датчиками в boot, я так тоже делал, но этот путь для профи.
Данный вариант для любителей и халявщиков.
 

Сергей_Ф

Moderator
Команда форума
вариант для любителей и халявщиков.
ок. Попробую. В какой отряд меня запишите? ;)
Хотя большой проблемы перезапустить esp не вижу, но ваш вариант явно удобнее.
Можете пояснить: в первом посте вы говорите о 10мА, а на графике все 30мА в этом режиме. С чем это связано?
 

nikolz

Well-known member
ок. Попробую. В какой отряд меня запишите? ;)
Хотя большой проблемы перезапустить esp не вижу, но ваш вариант явно удобнее.
Можете пояснить: в первом посте вы говорите о 10мА, а на графике все 30мА в этом режиме. С чем это связано?
график ниже
понижение потребления делается так:
------------------------------
void call_user_start()
{
// ток 33 ма
volatile uint32* rtc=((uint32 *)0x60000700); rtc[4]=0; // ток 15 ма
... здесь работаем с датчиками
call2user_start(); //переходим в обычный режим с включением WIFI
}
======================
-продвинутые пользователи могут реализовать ---------------------
ток 6 ма - задержка по таймеру RTC на интервалы от 1 мс
но мне не удалось задействовать колбек
----------------------
ток 2 ма - режим WAKE UP от GPIO
-------------------
возможно pvvx что-то еще подскажет.
 

nikolz

Well-known member
еще можно реализовать опрос готовности медленных датчиков
и вывод импульсов
с периодом не менее 6 ms
с током потребления не более 6 ма.
не знаю какой от этого может быть толк.
 

nikolz

Well-known member
если отключить синий диод, то ток уменьшается на 1.5ма
для CPU получаем 13.5ма
для RTC в режиме задержки 2.5 ма
для опроса медленных датчиков и формирования сигналов 4 ма
 

nikolz

Well-known member
для тех кто хочет, выкладываю исправленную библиотеку
ее над поместить в каталог lib в SDK вместо существующей
 

Вложения

pvvx

Активный участник сообщества
volatile uint32* rtc=((uint32 *)0x60000700); rtc[4]=0; // ток 15 ма
...

возможно pvvx что-то еще подскажет.
rtc[4]=0 и ничего работать не будет, т.к. тактирование отрублено со всех блоков (WiFi, SPI, ADC, I2S, ...), кроме CPU.
И SDK этот регистр не поправляет, а считает что всё изначально включено, с момента старта и во время boot.
Espressif - более сказать нечего :)
Дожили. @nikolz занялся хаком SDK!
Не "хаком" а изучением патчей SDK на основе "реверса" и правок выпущенных и отлаженных в первом-втором месяце 2015 года...
Ушло 5+ лет на изучение уже описанного...
 
Сверху Снизу