• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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... :)
 
Сверху Снизу