Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Железные вопросы по esp8266", создана пользователем nikolz, 10 дек 2017.

  1. nikolz

    nikolz Гуру

    Сообщения:
    5.131
    Симпатии:
    465
    Излагаю итоговые данные по энергопотреблению 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 дня.
    -----------------------
     
    Последнее редактирование: 13 дек 2017
  2. nikolz

    nikolz Гуру

    Сообщения:
    5.131
    Симпатии:
    465
    измерил ток потребления ESP-12 в режиме deep-sleep.
    ток равен 20 мка.
     
  3. DeGlucker

    DeGlucker Новичок

    Сообщения:
    16
    Симпатии:
    1
    Интересно, как Вам удалось получить такое быстродействие, у меня после WiFi.begin() подключение к роутеру происходит минимум за 2.5 сек. не из спячки.
    Хотелось бы посмотреть Ваш скетч.
     
  4. shuraf

    shuraf Читатель

    Сообщения:
    132
    Симпатии:
    6
    Осмелюсь предположить, что это не скетч ардуиновский, а sdk
     
  5. nikolz

    nikolz Гуру

    Сообщения:
    5.131
    Симпатии:
    465
    У меня нет скетчей, так как я пишу на СИ.
    Для тех кто пишит на дурине я выкладывал ссылку как можно ускорить подключение.
    поищите на форуме или в инете (у меня не сохранилась ссылка)
     
  6. DeGlucker

    DeGlucker Новичок

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

    nikolz Гуру

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

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

    Сообщения:
    9.441
    Симпатии:
    1.320
    Это норма для стандартного подключения к 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 (без паролей) и покрутите в ней клоки таймеров :)
     
  9. nikolz

    nikolz Гуру

    Сообщения:
    5.131
    Симпатии:
    465
    --------------------------
    и Остапа понесло!!!
    -----------------------------
    Ну ву каком бреду Вы увидели про нестандартное подключение роутера если у меня стоят заводские настройки.
    Но вам можно у вас опять недержание..
     
  10. pvvx

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

    Сообщения:
    9.441
    Симпатии:
    1.320
    Это всё видно по вашему графику. Начните хотя-бы с конца - где там задержка в 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.
     
    Последнее редактирование: 15 дек 2017
  11. pvvx

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

    Сообщения:
    9.441
    Симпатии:
    1.320
    Разговор был об этом "скече":
    Reducing WiFi power consumption on ESP8266, part 3 – OppoverBakke
    4.7 секунды :)
     
  12. DeGlucker

    DeGlucker Новичок

    Сообщения:
    16
    Симпатии:
    1
    Большое спасибо за обсуждение. Вопрос был чисто теоретический, 3-5 сек. меня вполне устраивает.
     
  13. pvvx

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

    Сообщения:
    9.441
    Симпатии:
    1.320
    Я вам наклякал пример скетча...
    Код (C):
    1. #include <ESP8266WiFi.h>
    2. #include <WiFiUdp.h>
    3. extern "C" {
    4. #include "user_interface.h"
    5. }
    6.  
    7. #include <myAP.h>
    8. #ifndef _MYAPCFG_H_
    9. char ssid[] = "yourNetwork"; //  your network SSID (name)
    10. char pass[] = "password";    // your network password (use for WPA, or use as key for WEP)
    11. #endif //_MYAPCFG_H_
    12. //char bssid[6]; // = {0x11,0x22,0x33,0x44,0x55,066};
    13.  
    14. IPAddress srvip = IPAddress(192, 168, 1, 2);
    15. uint16_t  srvport = 12345;
    16. WiFiUDP Udp;
    17. char chbuf[512];
    18.  
    19. struct {
    20.   byte mac[6];
    21.   byte mode;
    22.   byte chl;
    23.   IPAddress ip;
    24.   IPAddress gw;
    25.   IPAddress msk;
    26.   IPAddress dns;
    27.   uint32_t chk;
    28. } cfgbuf;
    29.  
    30. uint32_t StartTimeMs, SetupTime;
    31.  
    32. uint32_t readcfg(void)
    33. {
    34.   int ret = 0, i;
    35.   uint32_t x = 0;
    36.   uint32_t * p = (uint32_t *)cfgbuf.mac;
    37.   ESP.rtcUserMemoryRead(0, p, sizeof(cfgbuf));
    38.   for (i = 0; i < sizeof(cfgbuf) / 4; i++ ) x += p[i];
    39.   if (x || cfgbuf.mode > 2) {
    40.     for (i = 0; i < 6; i++ ) cfgbuf.mac[i] = 0xff;
    41.     cfgbuf.mode = 0; // chk err, reconfig
    42.     cfgbuf.chl = 1;
    43.     cfgbuf.ip = IPAddress(192, 168, 1, 111);
    44.     cfgbuf.gw = IPAddress(192, 168, 1, 1);
    45.     cfgbuf.msk = IPAddress(255, 255, 255, 0);
    46.     cfgbuf.dns = IPAddress(192, 168, 1, 1);
    47.     x = 1;
    48.   }
    49.   else cfgbuf.mode++; // 1,2,3
    50.   return x;
    51. }
    52.  
    53. void writecfg(void)
    54. {
    55.   int i, x = 0;
    56.   static struct station_config conf;
    57.   wifi_station_get_config(&conf);
    58.   for (i = 0; i < sizeof(conf.bssid); i++ ) cfgbuf.mac[i] = conf.bssid[i];
    59.   cfgbuf.chl = wifi_get_channel();
    60.   uint32_t * p = (uint32_t *)cfgbuf.mac;
    61.   for (i = 0; i < sizeof(cfgbuf) / 4 - 1; i++ ) x += p[i];
    62.   cfgbuf.chk = -x;
    63.   ESP.rtcUserMemoryWrite(0, p, sizeof(cfgbuf));
    64. }
    65.  
    66. void setup() {
    67.   StartTimeMs = millis();
    68.   readcfg();
    69.   switch (cfgbuf.mode) {
    70.     case 0:
    71.       WiFi.begin(ssid, pass);
    72.       break;
    73.     case 2:
    74.       WiFi.config(cfgbuf.ip, cfgbuf.gw, cfgbuf.msk, cfgbuf.dns);
    75.       WiFi.begin(ssid, pass, cfgbuf.chl, cfgbuf.mac);
    76.       break;
    77.     case 3:
    78.       WiFi.config(cfgbuf.ip, cfgbuf.gw, cfgbuf.msk, cfgbuf.dns);
    79.       break;
    80.     default:
    81.       cfgbuf.mode = 1;
    82.       WiFi.config(cfgbuf.ip, cfgbuf.gw, cfgbuf.msk, cfgbuf.dns);
    83.       WiFi.begin(ssid, pass);
    84.   }
    85.   while (WiFi.status() != WL_CONNECTED) delay(1);
    86.   SetupTime = millis() - StartTimeMs;
    87.   Serial.begin(115200);
    88.   sprintf(chbuf, "\n\nSDK ver:%s\nMode:%d\nSetupTime %u ms\nFullTime %u ms\n", system_get_sdk_version(), cfgbuf.mode, SetupTime, millis());
    89.   printf(chbuf);
    90. }
    91.  
    92. void loop() {
    93.   Udp.beginPacket(srvip, srvport);
    94.   Udp.write(chbuf);
    95.   Udp.endPacket();
    96.   writecfg();
    97.   delay(22);
    98.   // WAKE_RF_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL, WAKE_RF_DISABLED
    99.   ESP.deepSleep(8e6, WAKE_NO_RFCAL); // Deep-Sleep 8 sec
    100. }
    Измерять потребление нет времени. Само выводит в UDP и logUART время коннекта "SetupTime xxx ms" и время активности с инициализации до запуска ESP.deepSleep(8e6, WAKE_NO_RFCAL); // Deep-Sleep 8 sec "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 и всех возможных параметров, и вообще нет вызова WiFi.begin(ssid, pass)

    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.
     

    Вложения:

    Последнее редактирование: 24 мар 2018
  14. pvvx

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

    Сообщения:
    9.441
    Симпатии:
    1.320
    А nikolz выпендривается примерно таким:
    Код (C):
    1.  
    2. void setup() {
    3.   delay(2);  
    4.   wifi_set_opmode(STATION_MODE);
    5.   delay(2);
    6.   wifi_promiscuous_enable(1);
    7.   delay(2);
    8.   system_phy_set_max_tpw(20);
    9.   delay(2);
    10. }
    11. void loop() {
    12.  
    13. wifi_set_channel(1);
    14.     delay(2);    
    15.     wifi_send_pkt_freedom(packet, xx, x);
    16.      ....packet[x] = xxx;
    17.     delay(10);    
    18.     wifi_send_pkt_freedom(packet, xx, x);
    19.      ....packet[x] = xxx;
    20.     delay(10);    
    21. ...
    22.  
    Что не являетcя кодом для соединения со штатными WiFi AP и прочими сетями...
     
  15. nikolz

    nikolz Гуру

    Сообщения:
    5.131
    Симпатии:
    465
    Для примера , вот логи работы 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
    -------------------------
    всем успехов.
     
  16. pvvx

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

    Сообщения:
    9.441
    Симпатии:
    1.320
    Логи и графики к чему? К запуску и неизвестной программы?
    Примерный вид вашей программы дан постом ранее.
    Можно ещё укоротить, и между 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. Такие сомнения вызваны тем, что за всю историю его писаний на данном сайте им не было показано ничего, кроме выдумок и всегда были выявлены ошибки в самой основе его предложений, до стирания им-же созданных тем. :) От этого ему и присвоили звание "Гуру" из Боруйска.
     
    Последнее редактирование: 16 дек 2017
  17. Evgeny D

    Evgeny D Новичок

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

    nikolz Гуру

    Сообщения:
    5.131
    Симпатии:
    465
    ESP-1F QIO L4 .
    system_deep_sleep_instant(Time1*1000);
    system_deep_sleep(Time1*1000);
    ток в deep-sleep не более 18 мка (замерил сейчас специально для Вас)
     
    Последнее редактирование: 23 фев 2018
  19. Evgeny D

    Evgeny D Новичок

    Сообщения:
    72
    Симпатии:
    0
    А какая прошивка? ссылка было бы вообще шикарно!

    p. s. с праздником!
     
  20. pvvx

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

    Сообщения:
    9.441
    Симпатии:
    1.320
    Режим 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 мкА, но это не выполнилось, как и многое другое. Ещё не всё исправлено и в текущей версии документации.
     
    Последнее редактирование: 23 фев 2018

Поделиться этой страницей