• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом ESP8266. Уменьшение тока потребления.

nikolz

Well-known member
Добрый день,Всем
Есть простой способ уменьшить потребляемый ток ESP без существенного изменения софта.
Можно сделать например так:
upload_2018-3-14_13-37-14.png
На картинках выполнение программы:
старт, цикл 1 секунда передача данных на сервер.
-------------------------------
Первая картинка( режим 1 ) - это стандартное исполнение цикла в функции user_init
то потребления не менее 75 ма
-----------------------------
Вторая картинка(режим 2) - исполнение цикла внутри функции call_user_start ток потребления в цикле 45 ма
-----------------------
Третья картинка (режим 3) - как вторая но с отключением WIFI ток потребления внутри функции call_user_start 26 ма.
===================================
Рассказываю как это сделать.
режим 2 :
Для этого надо переименовать функцию call_user_start в билиотеке libmain
например в acll_user_start
и написать свою функцию:
-------------------
void call_user_start(void) {
// здесь исполняем программы из памяти с током потребления 45 ма вместо 75
...
acll_user_start(); //делаем вызов стандартной функции
}
-----------------------------
выкладываю библиотеку с переименованной функцией
 

Вложения

pvvx

Активный участник сообщества
Зачем это всё? Очередное изобретение велосипеда?
Давно, годы, все стартовые функции SDK развернуты в pvvx/MinEspSDKLib и прочих проектах
И на базе это сделан SuperHouse/esp-open-rtos
Вставляете любой свой код в любое место.
Для этого надо переименовать функцию call_user_start в билиотеке libmain
Для этого у компилятора GCC есть опции (-wrap) по замещению функций и обычно патчить ничего не требуется (кроме сложных случаев и исправления мелких ошибок в бинарных закрытых либах).
 
Последнее редактирование:

nikolz

Well-known member
Зачем это всё? Очередное изобретение велосипеда?
Давно, годы, все стартовые функции SDK развернуты в pvvx/MinEspSDKLib и прочих проектах
И на базе это сделан SuperHouse/esp-open-rtos
Вставляете любой свой код в любое место.
Для этого у компилятора GCC есть опции (-wrap) по замещению функций и обычно патчить ничего не требуется (кроме сложных случаев и исправления мелких ошибок в бинарных закрытых либах).
Поясняю специально для Вас
Ваша поделка pvvx/MinEspSDKLib давно устарела сейчас уже SDK 2.2.0
когда Вы ее начинали лепить я Вам говорил, что главное не слепить свалку а сопровождать ее.
Поэтому мне Ваша свалка не нравиться я использую стандартное SDK.
относительно второго замечания
Вы опять не поняли я не заменяю функцию а лишь изменил ее имя (это исправление в библиотеки 8 байт (можно исправить лишь 4)
Как изменять имена с помощью GCC я не знаю, знаете - скажите.
 

pvvx

Активный участник сообщества
Поясняю специально для Вас
Ваша поделка pvvx/MinEspSDKLib давно устарела сейчас уже SDK 2.2.0
когда Вы ее начинали лепить я Вам говорил, что главное не слепить свалку а сопровождать ее.
Поэтому мне Ваша свалка не нравиться я использую стандартное SDK.
Из неё вам сделали стандартный открытый SDK другие.
Не моё это дело сопровождать и ублажать телепузиков. Вас достаточно за глаза.
относительно второго замечания
Вы опять не поняли я не заменяю функцию а лишь изменил ее имя (это исправление в библиотеки 8 байт (можно исправить лишь 4)
Как изменять имена с помощью GCC я не знаю, знаете - скажите.
Указано - кодовое слово "wrap" и далее читайте инструкцию к GCC.
Некоторые вопросы как обойти другие ограничения указаны в первой строке google поиска на "wrap gcc" -> GNU gcc/ld - wrapping a call to symbol with caller and callee defined in the same object file
 
Последнее редактирование:

nikolz

Well-known member
Из неё вам сделали стандартный открытый SDK другие.
Не моё это дело сопровождать и ублажать телепузиков. Вас достаточно за глаза.
Указано - кодовое слово "wrap" и далее читайте инструкцию к GCC.
еще замечу что предложенное мною решение позволяет легко включить его в дурину
и не надо ничего городить или переделывать.
второй вариант у меня с nboot тоже решает эту задачу
-----------------------
Вообще-то, желающие могут сами выбрать один из трех вариантов
1) Ваш SDK (Пишите для телепузиков так чтобы они ничего не понимали, прикольно)
2) изменить имя и стандартное любое SDK
3) изучить rboot и включить в него свое плюс стандартное SDK
Я использую 2 и 3. Меня устраивает.
 

pvvx

Активный участник сообщества
еще замечу что предложенное мною решение позволяет легко включить его в дурину
и не надо ничего городить или переделывать.
второй вариант у меня с nboot тоже решает эту задачу
-----------------------
Вообще-то, желающие могут сами выбрать один из трех вариантов
1) Ваш SDK (Пишите для телепузиков так чтобы они ничего не понимали, прикольно)
2) изменить имя и стандартное любое SDK
3) изучить rboot и включить в него свое плюс стандартное SDK
Я использую 2 и 3. Меня устраивает.
Какую задачу он решает?
Уменьшения потребления при старте?
Не решает. Его решает rapid-loader и потомки.
rboot не работает с новым SDK и только увеличивает время загрузки и потребление. Его писатель до этого не дошел и видимо не хотел. У него были другие цели - исключительно пиар.
Видимо как и у вас - основная задача не решение её, а пиар.

Уменьшение потребления я включил и в esptool pvvx/esp8266web при программировании. Зачем лишний жор?
Всё это было актуально в 2015 году, а счас уже никому не интересна Arduino на ESP8266, кроме как побаловаться.

Хотите нормально решить тему минимального потребления - подготовьте для телепузиков уже проработанный вариант https://esp8266.ru/forum/threads/ehnergopotreblenie-esp-itogi.3001/page-2#post-48643
С потреблением для ESP8266 по графику, в зависимости от частоты передач значений:
https://esp8266.ru/forum/attachments/snimok5-gif.5851/
Где взять исходники указано, поменять посылку на "probe request" принимаемую любым модулем WiFi сможете сами.
При этом, в место вашего "примера", при те-же временах передачи (2 сек) получаем среднее потребление 1.5..1.7 мА.
 
Последнее редактирование:

pvvx

Активный участник сообщества
В стандартном NON_OS_SDK есть функция user_rf_pre_init().
Она описывается пользователем и вызывается при старте, когда система уже очистила bss, поменяла вектора прерываний, включила мнеджер памяти и т.д.
Т.е. в ней можно использовать стандартные СИ описания своих функций, к примеру, работы с датчиками, и решать - запускать или нет следующие части SDK.
При переименовании стартовой процедуры call_user_start() вам придется писать очень сложный код и учитывать, что ничего не проинициализировано для работы даже простого СИ, с чем у телепузиков будут БОЛЬШИЕ сложности.
 

nikolz

Well-known member
В стандартном NON_OS_SDK есть функция user_rf_pre_init().
Она описывается пользователем и вызывается при старте, когда система уже очистила bss, поменяла вектора прерываний, включила мнеджер памяти и т.д.
Т.е. в ней можно использовать стандартные СИ описания своих функций, к примеру, работы с датчиками, и решать - запускать или нет следующие части SDK.
При переименовании стартовой процедуры call_user_start() вам придется писать очень сложный код и учитывать, что ничего не проинициализировано для работы даже простого СИ, с чем у телепузиков будут БОЛЬШИЕ сложности.
Ну если все можно,
то сделайте так на стандартном SDK
т е старт обычным загрузчиком
переход на ток 11 ма
работа CPU таймера UART 1.5 сек
включение WIFI и передача данных 170 мс.
upload_2018-3-14_22-12-25.png
 

pvvx

Активный участник сообщества
Ну если все можно,
то сделайте так на стандартном SDK
т е старт обычным загрузчиком
переход на ток 11 ма
работа CPU таймера UART 1.5 сек
включение WIFI и передача данных 170 мс.
Посмотреть вложение 5982
А смысл такого? Выжрать батарейку?
Вам сделали всё в 80 мс.
 

nikolz

Well-known member
А смысл такого? Выжрать батарейку?
Вам сделали всё в 80 мс.
Смысл в том чтобы реально работать с датчиками а не рассказывать сказки про то что в 80 мс Вы все сделали при готовности датчика через 100 мс и старте ESP 120 мс.
Не вижу смысла с Вами о чем-то говорить.
просьба не лезьте в мои темы.
Я делюсь своим опытом с теми кому это интересно.
Вы же лезете во все дырки лишь бы пропиариться.
 

pvvx

Активный участник сообщества
Смысл в том чтобы реально работать с датчиками а не рассказывать сказки про то что в 80 мс Вы все сделали при готовности датчика через 100 мс и старте ESP 120 мс.
Зачем вы опять выдумываете какие-то 120 мс?
У других вышло 100 мс, далее я задержку в 20 мс убрал и выходит 80. Есть ещё задержка на 10..20 мс, которую тоже можно выкинуть если не требуется подстройка RC таймера на температуру. Она не дает ничего нужного в данном исполнении. Выйдет 60..70 мс :p
 

Andynvkz

New member
режим 2 :
Для этого надо переименовать функцию call_user_start в билиотеке libmain
например в acll_user_start
и написать свою функцию:
-------------------
void call_user_start(void) {
// здесь исполняем программы из памяти с током потребления 45 ма вместо 75
...
acll_user_start(); //делаем вызов стандартной функции
}
-----------------------------
выкладываю библиотеку с переименованной функцией
вообще не проходит, при вставки данной фунции в проект все компилится и даже не ругается на конфликт одинаковых имен, может я чего не понял, а вот при переименовки в библиотеке валят сплошные ошибки, rapid_loader тоже не работает (((
 

Andynvkz

New member
еще у Вас есть статья на habr про уменьшение потребления модулей, везде указываете про отключение DHCP, но как это сделать ? wifi_softap_dhcps_stop(); не работает, единственно что получилось это WiFi.softAPConfig (IPAddress {0,0,0,0},IPAddress {0,0,0,0},IPAddress {0,0,0,0}); видимо нули не дают запустить DHCP Server и теперь мой модуль работает более 3х часов, вместо 2х и опять же это сработало с SDK 2.2.1 , а вот с SDK 3.0.5 уже не канает он запускает с дефолтными адресами
 

nikolz

Well-known member
еще у Вас есть статья на habr про уменьшение потребления модулей, везде указываете про отключение DHCP, но как это сделать ? wifi_softap_dhcps_stop(); не работает, единственно что получилось это WiFi.softAPConfig (IPAddress {0,0,0,0},IPAddress {0,0,0,0},IPAddress {0,0,0,0}); видимо нули не дают запустить DHCP Server и теперь мой модуль работает более 3х часов, вместо 2х и опять же это сработало с SDK 2.2.1 , а вот с SDK 3.0.5 уже не канает он запускает с дефолтными адресами
давно уже не занимался энергосбережением на ESP.
--------------------------
Последнее SDK было вроде бы 3.0.5 использую, но энергосбережением на нем не занимался.В нем исправлено много ошибок.
-----------------------------
Но ускорение соединения путем отключения DHCP и восстановлением параметров из памяти RTC, это не ошибка, а особенность алгоритма установления связи WIFI.
---------------------------
В тех задачах, которые решаю сейчас мне этого не требуется, так как ESP работает не как WiFi а как 32 разрядный вычислитель.
------------------------------
Wifi отключаю и потребление в пределах 20 мА при 160 мГц это вполне устраивает.
----------------------------
Если будет у меня надобность в WiFi тогда снова займусь.
Но в конечном решении у меня будут стоять чипы Telink , если хватит памяти.
Они хотя и медленнее но потребление у них меньше в 2 раза, а передавать мне надо данные на расстояние 2 метра поэтому и BLE.
 

pvvx

Активный участник сообщества
Они хотя и медленнее но потребление у них меньше в 2 раза, а передавать мне надо данные на расстояние 2 метра поэтому и BLE.
BLE давно, в режиме Long Range, имеет дальность больше чем WiFi. WiFi для бытовухи требуется только при передаче видеопотока и не где более.
ESP32-C3 как-то работает с LE Long Range, но жрет...
 

nikolz

Well-known member
BLE давно, в режиме Long Range, имеет дальность больше чем WiFi. WiFi для бытовухи требуется только при передаче видеопотока и не где более.
ESP32-C3 как-то работает с LE Long Range, но жрет...
если о дальности, то лучше lora. Для дронов делают Lora+ESP8265 (до 100 км )
если надо сеть то поверх Lora делают MiWi
------------------
Мне надо передать данные с задержкой между пакетами не более 2ms. Ну и как BLE эту задачу решит?
 

enjoynering

Well-known member
Я просто оставлю это здесь

Если современные Wi-Fi-роутеры способны фильтровать нежелательные пакеты, то большинство адаптеров Bluetooth, мягко говоря, туповаты. Им по большому счету безразлично, какой пакет и какого объема, а уж тем более сколько этих пакетов ты пришлешь. Поэтому нам не составляет абсолютно никакого труда увеличить в Linux информационный объем пакета ping до огромного значения, а потом отослать этих пакетов на девайс с Bluetooth, скажем, 1000 штук.
И Bluetooth превратился в тыкву
 

pvvx

Активный участник сообщества
Я просто оставлю это здесь
Если современные Wi-Fi-роутеры способны фильтровать нежелательные пакеты, то большинство адаптеров Bluetooth, мягко говоря, туповаты. Им по большому счету безразлично, какой пакет и какого объема, а уж тем более сколько этих пакетов ты пришлешь. Поэтому нам не составляет абсолютно никакого труда увеличить в Linux информационный объем пакета ping до огромного значения, а потом отослать этих пакетов на девайс с Bluetooth, скажем, 1000 штук.
И Bluetooth превратился в тыкву
Кто-то очень некомпетентный изрек вам полнейшую глупость.
Фильтрация есть в любом адаптере BT-BLE и она не только по MAC и заголовкам.
ping пакетов не бывает, как нет никакой физической возможности послать тысячу пакетов рекламы в секунду.
Далее всё ещё сложнее и проще в плане фильтрации и разноса по каналам... Но раз вы читаете и копируете такой бред, то смысла описывать что то подробнее нет никакого.
А вот классический Bluetooth давно превратился в тыкву. И это действительность, включая и передачу звука.
 

pvvx

Активный участник сообщества
enjoynering - ESP32-C3 в режиме BLE жрет значительно меньше, чем любые ухищрения с ESP8266 в WiFi.
BLE покрывает все бытовые нужды, когда у вас поток не более нескольких байт в секунду и иногда надо передать сотню килобайт.
По экономичности BLE имеет первое место, затем идет ZigBee, далее BLE-MESH, Lora, NB-Iot, а самый последний - WiFi.
Никакие ESP-NOW не могут сравниться с BLE. Для той-же дальности для WiFi требуется в десятки раз большая мощность передатчика и хуже уровень приема относительно общего шума. Такова модуляция и в ней нет восстановления ошибок...
Да и протоколы у BLE прямо в имени описывают специализацию - LE. Под это годами и разрабатывались фичи в чипах, да сами протоколы - ныне уже повсеместно BT5.3
BLE выключатели уже общаются со спутниками, а WiFi... :)
 
Сверху Снизу