Энергопотребление ESP(итоги)

nikolz

Well-known member
Излагаю итоговые данные по энергопотреблению ESP-12.
На картинке работа по WIFI по протоколу UDP с подтверждением от сервера. Максимальное быстродействие, которое мне удалось достигнуть.
алгоритм такой: ESP просыпается проверяет связь посылает пакет типа
test;65072;8;70753;2;211324;0;3105
сервер его принимает , отвечает, ESP принимает ответ и уходит в deep-sleep.
В режиме deep-sleep ток потребления 20 мка.

upload_2017-12-10_14-24-7.png

Длительность активного режима 295 мс.
из них начальный старт 125 мс
работа передатчика WIFI 25 мс
-------------------------
Затраты энергии на различных участках следующие:
Всего : 0.052 дж
из них на старт 0.013 дж или 25%
на работу в режиме передачи 0.0074 дж или 14%.
ток потребления в режиме deep-sleep 20 мка.
----------------------------
Эти данные позволяют примерно рассчитать время работы от батарейки.

Например, от одной батарейки можно забрать энергии не менее 4000 дж.
Предположим что устройство будет выходить на связь каждые 10 минут.
Энергия на сон в течении часа составит
20мка*3.3в*3600c=0.2376 дж.
тогда потребляемая энергия от батарейки за 1 час составит
0.052*6+0.2376=0.55 дж
Следовательно, максимальное время , которое проработает ESp12 от такой батарейки составит 4000/0.55=7272 часов или 303 дня.
-----------------------
 
Последнее редактирование:

nikolz

Well-known member
измерил ток потребления ESP-12 в режиме deep-sleep.
ток равен 20 мка.
 

DeGlucker

New member
Интересно, как Вам удалось получить такое быстродействие, у меня после WiFi.begin() подключение к роутеру происходит минимум за 2.5 сек. не из спячки.
Хотелось бы посмотреть Ваш скетч.
 

nikolz

Well-known member
Интересно, как Вам удалось получить такое быстродействие, у меня после WiFi.begin() подключение к роутеру происходит минимум за 2.5 сек. не из спячки.
Хотелось бы посмотреть Ваш скетч.
У меня нет скетчей, так как я пишу на СИ.
Для тех кто пишит на дурине я выкладывал ссылку как можно ускорить подключение.
поищите на форуме или в инете (у меня не сохранилась ссылка)
 

DeGlucker

New member
Ну а "дурина" не си чтоли. Библиотека вайфай может и кривоватая. Придется разбираться а апи.
Поищу Вашу статью. И на том спасибс.
 

nikolz

Well-known member
Ну а "дурина" не си чтоли. Библиотека вайфай может и кривоватая. Придется разбираться а апи.
Поищу Вашу статью. И на том спасибс.
Что ли не СИ. Если хотите это нечто аля С++.
Но в нем все функции из SDK вызываются через обертки.
Для ясности - пишу на СИ с использованием прямого вызова функций из SDK
Примеры есть в UDK.
UDK есть на этом форуме.
-----------------------
статья не моя. я давал лишь ссылку на англ яз статью
там товарищ подробно все рассказал как делать на дурине.
Результат хуже чем мой, но существенно меньше 3 секунд.
-------------------
еще есть рекомендации на сайте разработчика.
-----------------------------
Ищущий да обрящет.
 

pvvx

Активный участник сообщества
Интересно, как Вам удалось получить такое быстродействие, у меня после WiFi.begin() подключение к роутеру происходит минимум за 2.5 сек. не из спячки.
Это норма для стандартного подключения к AP, а если получаете IP по DHCP и при старте производите поиск AP по всем каналам и делаете минимальную передачу, хотя-бы 1 пакет UDP, затем производите отключение, то соединение затягивается до 3.5 и более сек.
Если всё синхронизировалось с becon-ами AP вовремя и чтобы не было задержек на расчет ключей WPA, то может соединиться с соблюдением норм WiFi и выдачей IP примерно за 2 сек +-0,5 от старта. Зависит от скорости работы модуля и роутера с AP, но у ESP8266 нет аппаратного шифрования и много лишних задержек, по тому она не попадает в стандартный шаг beacon-ов и прочего арбитража WiFi у роутеров...
Время входа в deep-sleep в SDK тоже от 100 мс, но его nicolz вырезал + нестандартное подключение на глюках его роутера (он не разрывает соединение и использует старое) - так что можете не искать такой "скеч", т.к. он не будет работать на разных роутерах и при включенном шифровании :)
Если хотите сделать ещё быстрее, то используйте в качестве AP вторую ESP, с Open AP (без паролей) и покрутите в ней клоки таймеров :)
 

nikolz

Well-known member
Это норма для стандартного подключения к AP, а если получаете IP по DHCP и при старте производите поиск AP по всем каналам и делаете минимальную передачу, хотя-бы 1 пакет UDP, затем производите отключение, то соединение затягивается до 3.5 и более сек.
Если всё синхронизировалось с becon-ами AP вовремя и чтобы не было задержек на расчет ключей WPA, то может соединиться с соблюдением норм WiFi и выдачей IP примерно за 2 сек +-0,5 от старта. Зависит от скорости работы модуля и роутера с AP, но у ESP8266 нет аппаратного шифрования и много лишних задержек, по тому она не попадает в стандартный шаг beacon-ов и прочего арбитража WiFi у роутеров...
Время входа в deep-sleep в SDK тоже от 100 мс, но его nicolz вырезал + нестандартное подключение на глюках его роутера (он не разрывает соединение и использует старое) - так что можете не искать такой "скеч", т.к. он не будет работать на разных роутерах и при включенном шифровании :)
Если хотите сделать ещё быстрее, то используйте в качестве AP вторую ESP, с Open AP (без паролей) и покрутите в ней клоки таймеров :)
--------------------------
и Остапа понесло!!!
-----------------------------
Ну ву каком бреду Вы увидели про нестандартное подключение роутера если у меня стоят заводские настройки.
Но вам можно у вас опять недержание..
 

pvvx

Активный участник сообщества
--------------------------
и Остапа понесло!!!
-----------------------------
Ну ву каком бреду Вы увидели про нестандартное подключение роутера если у меня стоят заводские настройки.
Но вам можно у вас опять недержание..
Это всё видно по вашему графику. Начните хотя-бы с конца - где там задержка в 100 мс на таймере в процедуре вызова deep-sleep? :)
Если не имеете отладчика и не умеете дизассемблировать, то прочтите хотя-бы мануал на вашу версию SDK esp8266_non_os_sdk_api_reference_en_vxxx.pdf

3.3.9. system_deep_sleep
Note: After configuration, the chip will not enter Deep-sleep mode immediately, but will wait for a while till the Wi-Fi core is closed safely.
Это выполнено в виде установке таймера на 100 мс и подачи команды закрытия соединений, потом отключения WiFi. Если за 100 мс не вырубится или вырубится WiFi, то всё равно таймер вызовет реальный deep_sleep не ранее этих 100 мс, а там ещё процедуры включения в сон Flash и прочих подготовок в RTC, коих так-же нет на вашем графике...
Про соединение с AP и согласование пароля на вашем графике явно видно, что его не было, как и запроса AP в начале для поиска... :p
По этой причине исходники вы и не можете дать - выйдет совсем другая картинка при использовании функций SDK.
 
Последнее редактирование:

pvvx

Активный участник сообщества

DeGlucker

New member
Большое спасибо за обсуждение. Вопрос был чисто теоретический, 3-5 сек. меня вполне устраивает.
 

pvvx

Активный участник сообщества
Большое спасибо за обсуждение. Вопрос был чисто теоретический, 3-5 сек. меня вполне устраивает.
Я вам наклякал пример скетча...
Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
extern "C" {
#include "user_interface.h"
}

#include <myAP.h>
#ifndef _MYAPCFG_H_
char ssid[] = "yourNetwork"; //  your network SSID (name)
char pass[] = "password";    // your network password (use for WPA, or use as key for WEP)
#endif //_MYAPCFG_H_
//char bssid[6]; // = {0x11,0x22,0x33,0x44,0x55,066};

IPAddress srvip = IPAddress(192, 168, 1, 2);
uint16_t  srvport = 12345;
WiFiUDP Udp;
char chbuf[512];

struct {
  byte mac[6];
  byte mode;
  byte chl;
  IPAddress ip;
  IPAddress gw;
  IPAddress msk;
  IPAddress dns;
  uint32_t chk;
} cfgbuf;

uint32_t StartTimeMs, SetupTime;

uint32_t readcfg(void)
{
  int ret = 0, i;
  uint32_t x = 0;
  uint32_t * p = (uint32_t *)cfgbuf.mac;
  ESP.rtcUserMemoryRead(0, p, sizeof(cfgbuf));
  for (i = 0; i < sizeof(cfgbuf) / 4; i++ ) x += p[i];
  if (x || cfgbuf.mode > 2) {
    for (i = 0; i < 6; i++ ) cfgbuf.mac[i] = 0xff;
    cfgbuf.mode = 0; // chk err, reconfig
    cfgbuf.chl = 1;
    cfgbuf.ip = IPAddress(192, 168, 1, 111);
    cfgbuf.gw = IPAddress(192, 168, 1, 1);
    cfgbuf.msk = IPAddress(255, 255, 255, 0);
    cfgbuf.dns = IPAddress(192, 168, 1, 1);
    x = 1;
  }
  else cfgbuf.mode++; // 1,2,3
  return x;
}

void writecfg(void)
{
  int i, x = 0;
  static struct station_config conf;
  wifi_station_get_config(&conf);
  for (i = 0; i < sizeof(conf.bssid); i++ ) cfgbuf.mac[i] = conf.bssid[i];
  cfgbuf.chl = wifi_get_channel();
  uint32_t * p = (uint32_t *)cfgbuf.mac;
  for (i = 0; i < sizeof(cfgbuf) / 4 - 1; i++ ) x += p[i];
  cfgbuf.chk = -x;
  ESP.rtcUserMemoryWrite(0, p, sizeof(cfgbuf));
}

void setup() {
  StartTimeMs = millis();
  readcfg();
  switch (cfgbuf.mode) {
    case 0:
      WiFi.begin(ssid, pass);
      break;
    case 2:
      WiFi.config(cfgbuf.ip, cfgbuf.gw, cfgbuf.msk, cfgbuf.dns);
      WiFi.begin(ssid, pass, cfgbuf.chl, cfgbuf.mac);
      break;
    case 3:
      WiFi.config(cfgbuf.ip, cfgbuf.gw, cfgbuf.msk, cfgbuf.dns);
      break;
    default:
      cfgbuf.mode = 1;
      WiFi.config(cfgbuf.ip, cfgbuf.gw, cfgbuf.msk, cfgbuf.dns);
      WiFi.begin(ssid, pass);
  }
  while (WiFi.status() != WL_CONNECTED) delay(1);
  SetupTime = millis() - StartTimeMs;
  Serial.begin(115200);
  sprintf(chbuf, "\n\nSDK ver:%s\nMode:%d\nSetupTime %u ms\nFullTime %u ms\n", system_get_sdk_version(), cfgbuf.mode, SetupTime, millis());
  printf(chbuf);
}

void loop() {
  Udp.beginPacket(srvip, srvport);
  Udp.write(chbuf);
  Udp.endPacket();
  writecfg();
  delay(22);
  // WAKE_RF_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL, WAKE_RF_DISABLED
  ESP.deepSleep(8e6, WAKE_NO_RFCAL); // Deep-Sleep 8 sec
}
Измерять потребление нет времени. Само выводит в UDP и logUART время коннекта "SetupTime xxx ms" и время активности с инициализации до запуска [inline]ESP.deepSleep(8e6, WAKE_NO_RFCAL); // Deep-Sleep 8 sec[/inline] "FullTime xxx ms".
К числу "FullTime xxx ms" надо прибавить время старта CPU (выход кварца на режим + мелочи ~10..20 мс) , старт ROM с выводом кракозяб и загрузку boot (от 100 мс для Arduino), начальную инициализацию SDK (~10 мс, если не сбилась запись конфигов WiFi) и время выхода в deep-sleep() (от 100 мс).
Получиться общее время активности с +- 10 мс со средним потреблением ~80 мА, если правильно всё учтете :)
Замер сделан для четырех режимов (выводит Mode:X, где X):
0 - Получение IP по DHCP и запоминание IP и прочего...
1 - Соединение с минимальной объявой (только ssid и password), остальное берется из запомненного в Flash.
2 - Задание фиксированных IP + п.п. 1
3 - Задание фиксированных IP и всех возможных параметров, и вообще нет вызова [inline]WiFi.begin(ssid, pass)[/inline]

Mode:3 должно быть самым быстрым, но что-то опять не сварили в Arduino.
Использовал (не лучший вариант):
arduino-ver-test.gif
arduino-cfg-test.gif
Народ давно жалуется, что ESP.deepSleep(xxx, WAKE_NO_RFCAL) не работает на новых SDK и всё не так, как бывало с другими версиями Arduino + SDK. Ну у ESP всегда нелады, особенно в Arduino. У меня нет времени тестить данный глюковый WiFi-SoC, т.к. это беспертивняк полный.
Лог с китай программы с кракозябами приложен.
Итоговая табличка и осреднение по разным режимах (как есть, с выпадениями - UDP она такая :)):
log-spd-deep-test.gif
Connect - время, затраченное на соединение с AP.
Full - общее зафиксированное программно время работы процедур SDK и пользователя.
Activ - время активности ESP8266 по питанию (расчетное).

Итог плачевен - RTL побеждают даже при использовании только стандартных обращений и примеров в их SDK...
Средний, сам коннект на ESP8266 в Arduino при фиксированных данных, занимает 340 мс, а не описанные бредни у других в виде 3 сек... Но и этого много для победы над другими, более современными WiFi-SoC.
 

Вложения

Последнее редактирование:

pvvx

Активный участник сообщества
А nikolz выпендривается примерно таким:
Код:
void setup() {
  delay(2);   
  wifi_set_opmode(STATION_MODE);
  delay(2);
  wifi_promiscuous_enable(1);
  delay(2);
  system_phy_set_max_tpw(20);
  delay(2);
}
void loop() {

wifi_set_channel(1);
    delay(2);    
    wifi_send_pkt_freedom(packet, xx, x);
     ....packet[x] = xxx;
    delay(10);    
    wifi_send_pkt_freedom(packet, xx, x);
     ....packet[x] = xxx;
    delay(10);    
...
Что не являетcя кодом для соединения со штатными WiFi AP и прочими сетями...
 

nikolz

Well-known member
Для примера , вот логи работы ESP с deep-sleep 10 секунд.
Схема такая ESP-роутер -кабель-комп(сервер)
Работает устойчиво без сбоев сколь угодно долго
Лог принимается и сохраняется на сервере(компе)
сообщение ESP
test; и далее последовательность : время в мкс; код прерывания колбека WIFI
--------------------
Например 1 строка - это включение ESP
12/16/17 09:28:08 - сегодня почти сейчас
test;
4492498;8; - 4.4 секунды код=8
4498087;2;
4636673;0;
2764 -- напряжение питания измеренное внутренним ацп
--------------------------
вторая и все последующие строки
test;
64365;8; - 64 мс
70040;2;
210225;0; 210 мс
2800
-------------------------------
как видим, время сеанса активности составляет 210 мс к которым надо добавить время старта, так как оно не учитывается RTC.
На графике это все есть итого время менее 0.3 сек ( а не как у pvvx)
=========================
дата и время приема сообщение
12/16/17 09:28:08 test;4492498;8;4498087;2;4636673;0;2764
12/16/17 09:28:18 test;64365;8;70040;2;210225;0;2800
12/16/17 09:28:28 test;64584;8;70311;2;212037;0;2800
12/16/17 09:28:42 test;64331;8;70017;2;212853;0;2782
12/16/17 09:28:52 test;64584;8;70345;2;213606;0;2853
12/16/17 09:28:55 test;64072;8;148942;2;210369;0;2770
12/16/17 09:28:55 test;63980;8;69661;2;210530;0;2781
12/16/17 09:29:05 test;64699;8;70426;2;212341;0;2788
12/16/17 09:29:15 test;64808;8;70535;2;230891;0;2854
12/16/17 09:29:25 test;64848;8;70587;2;212474;0;2853
12/16/17 09:29:35 test;64911;8;70656;2;213710;0;2810
12/16/17 09:29:45 test;64963;8;70759;2;215285;0;2854
12/16/17 09:29:59 test;64538;8;70253;2;212382;0;2796
12/16/17 09:30:13 test;64354;8;70046;2;210197;0;2853
12/16/17 09:30:27 test;64221;8;69925;2;210260;0;2788
12/16/17 09:30:41 test;64147;8;69793;2;209535;0;2781
12/16/17 09:30:51 test;64388;8;70138;2;210415;0;2775
12/16/17 09:31:01 test;64515;8;70236;2;211289;0;2773
12/16/17 09:31:11 test;64618;8;70391;2;228142;0;2796
12/16/17 09:31:25 test;64233;8;69879;2;209800;0;2849
12/16/17 09:31:35 test;64486;8;70224;2;210996;0;2774
12/16/17 09:31:49 test;64198;8;69868;2;211715;0;2854
12/16/17 09:32:02 test;64124;8;69816;2;211542;0;2807
-------------------------
всем успехов.
 

pvvx

Активный участник сообщества
как видим, время сеанса активности составляет 210 мс к которым надо добавить время старта, так как оно не учитывается RTC.
На графике это все есть итого время менее 0.3 сек ( а не как у pvvx)
Логи и графики к чему? К запуску и неизвестной программы?
Примерный вид вашей программы дан постом ранее.
Можно ещё укоротить, и между deep-sleep просто выводить циферки :)
Вам ссылки дать, где разные люди вячисляют время входа в deep-sleep у ESP?
У одного вышло 98 мс. Это самое короткое, обычно дольше :)
И этого нет у вас на графике и в логах. А подача команды deep-sleep без паузы в 20 мс после команды отсылки UDP или ещё чего, обрывает эту отсылку (deep-sleep первым делом закрывает все соединения и буфера WiFi). Это обозначает, что вы вручную прерываете цикл отключения питанием и deep-sleep у вас не используется.
Вам настолько завидно, что у других быстрее, что занялись подлогом? :) :) :)
---------
Вчера, пытаясь накидать простенький "скеч" для теста, нарвался на пачку неработающих функций, и в очередной раз убедился, что ESP8266 уже не поддерживается никем, а лепят новое кое-как.
Вот как раз про режимы deep-sleep в Arduino...
Как итог - ничего практического, без добавки внешних и обходных "костылей" и громадных затрат времени на исправления на ESP8266 не сделать, особенно в Arduino.
И это полностью опровергает сказку о упрощении и ускорению решения задач при использовании Arduino. Типовые и отлаженные решения есть в готовых прошивках и для этого “начинающим” не нужна Arduino, а нужен всего программатор.

Ждем от nikolz хотя-бы бинарную прошивку, раз он боится описать части свое кода (которого видимо просто нет, а замер сделан какой чужой прошивки с коммутацией питания руками и выдумыванием логов :)). Тогда можно будет хоть что-то измерить, а не читать сотни постов nikolz с выдуманными графиками и логами, написанными от руки в блокноте :)
Роутеров и модулей ESP у меня пачка почти всех видов - имя и пароль могу поставить любой для тестов - это к тому, что для теста пойдет любая прошивка и переделывать ничего не надо, если конечно она есть у nicolz. Такие сомнения вызваны тем, что за всю историю его писаний на данном сайте им не было показано ничего, кроме выдумок и всегда были выявлены ошибки в самой основе его предложений, до стирания им-же созданных тем. :) От этого ему и присвоили звание "Гуру" из Боруйска.
 
Последнее редактирование:

Evgeny D

Member
nikolz, подскажите, а какая точно маркировка на ESP8266 и какая прошивка внутри?Я
Я пробую на ESP8266MOD Ai-Thinker (ESP-12F QIO L4 на обороте), прошитой NodeMCU Flasher (nodemcu_integer_0.9.5_20150318.bin)
и получаю 500мкА после
Код:
ESP.deepSleep( 0, RF_DEFAULT );
:(
 

nikolz

Well-known member
nikolz, подскажите, а какая точно маркировка на ESP8266 и какая прошивка внутри?Я
Я пробую на ESP8266MOD Ai-Thinker (ESP-12F QIO L4 на обороте), прошитой NodeMCU Flasher (nodemcu_integer_0.9.5_20150318.bin)
и получаю 500мкА после
Код:
ESP.deepSleep( 0, RF_DEFAULT );
:(
ESP-1F QIO L4 .
system_deep_sleep_instant(Time1*1000);
system_deep_sleep(Time1*1000);
ток в deep-sleep не более 18 мка (замерил сейчас специально для Вас)
 
Последнее редактирование:

pvvx

Активный участник сообщества
nikolz, подскажите, а какая точно маркировка на ESP8266 и какая прошивка внутри?Я
Я пробую на ESP8266MOD Ai-Thinker (ESP-12F QIO L4 на обороте), прошитой NodeMCU Flasher (nodemcu_integer_0.9.5_20150318.bin)
и получаю 500мкА после
Код:
ESP.deepSleep( 0, RF_DEFAULT );
:(
Режим deep_sleep у ESP8266 единственный и не имеет модификаций. Т.е. от типов вызова процедуры не зависит - в данном режиме процессор и все GPIO отключены, кроме GPIO16.
0.5 мА - это 6.6 кОм в питание 3.3В.
У вас или где-то стоит постоянно подключенный примерно такой резистор или измеряете ток вместе со стабилизатором 5->3.3В.
20 мкА потребления у модуля Espressif предполагает в случае, если к модулю подводится только питание менее 2.5В (и по умолчанию при +25 С) и на нем правильно установлены подтягивающие резисторы, а не в случае когда подключены TX и RX и прочие сигналы и температура не +25С. Модуль может запросто питаться от этих внешних сигналов и может показать и отрицательный ток потребления по шине питания. Как у nikolz < 18 мкА :)

https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf
Страница 18, дополнение 3. И это замер только чипа ESP8266, без Flash и прочих элементов.
В документации до 2016.11 V5.1 значилось 10 мкА, но это не выполнилось, как и многое другое. Ещё не всё исправлено и в текущей версии документации.
 
Последнее редактирование:
Сверху Снизу