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

Вопрос Deep sleep с пробуждением по кнопке

Makc1806

New member
Это вы попутали. WiFi sleep и системный sleep моды... Это разные функции и включение их производиться по разному...
Понятно, спасибо!
Светодиод PWR отпаян, все отключено, голый модуль.
Попробовал такие варианты:
Код:
#include <ESP8266WiFi.h>
const char* WIFI_SSID = "Server";
const char* WIFI_PWD = "serverserver";
void setup() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PWD);
}
void loop() {
//do nothing there...
}
со стабильным ping -t берет 76,8мА;

Код:
#include <ESP8266WiFi.h>
void setup() {
    WiFi.disconnect();
    WiFi.mode(WIFI_OFF);
}
void loop() {
//do nothing there...
}
берет меньше, но 76,2мА;

Код:
#include <ESP8266WiFi.h>
void setup() {
   WiFi.mode(WIFI_OFF);
}
void loop() {
//do nothing there...
}
берет 76,5мА;

Код:
#include <ESP8266WiFi.h>
void setup() {
  WiFi.setSleepMode(WIFI_MODEM_SLEEP);
  WiFi.forceSleepBegin(); delay(1);
}
void loop() {
//do nothing there...
}
ожидаемо 21,2мА;

Код:
#include <ESP8266WiFi.h>
void setup() {
  WiFi.setSleepMode(WIFI_LIGHT_SLEEP);
  WiFi.forceSleepBegin(); delay(1);
}
void loop() {
//do nothing there...
}
берет все те же 21,2мА, что совсем не радует. И никакого тебе "простоя" и экономии. Так что с точки зрения простого пользователя - разницы никакой. И как остановить работу проца - даже не представляю.
 
Последнее редактирование:

Makc1806

New member
AP обязана следить за каналом и в соответствии с его загрузкой (вплоть до внешних BT устройств и прочих шумов) строить свой арбитраж, что, к примеру ESP8266 в SoftAP не умеет и не сертифицирован у альянса WiFi. В итоге даже специализированный AP на Cisco не помогает справиться с выходками ESP8266 на канале... И счас большинство устройств WiFi имеет HT40, а не HT20. ESP8266 не понимает HT40 - для него это шум. В режиме SoftAP+ST или SoftAP при рядом работающей другой AP он асинхронно вставляет свои beacon и мешает всем другим работать...
Использую esp-01 исключительно в режиме клиента и никак иначе, режим AP в ней исключительно для первичной настройки iot весчи. Так?

А вот что удивительно, и мне не понять, как(?), с данным кодом, позаимствованным с ESP8266 Weather Widget - All, с подключенным и работающим OLED:
/**The MIT License (MIT)

Copyright (c) 2016 by Daniel Eichhorn
/CUT/
See more at Squix - TechBlog
*/
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <JsonListener.h>
#include "SSD1306Wire.h"
#include "OLEDDisplayUi.h"
#include "Wire.h"
#include "WundergroundClient.h"
#include "WeatherStationFonts.h"
#include "WeatherStationImages.h"
#include "TimeClient.h"
#include "ThingspeakClient.h"

// WIFI
const char* WIFI_SSID = "Server";
const char* WIFI_PWD = "serverserver";

// Setup
const int UPDATE_INTERVAL_SECS = 20 * 60; // Update every 20 minutes

// Display Settings
const int I2C_DISPLAY_ADDRESS = 0x3c;
const int SDA_PIN = 0;
const int SDC_PIN = 2;

// TimeClient settings
const float UTC_OFFSET = 3;

// Wunderground Settings
const boolean IS_METRIC = true;
const String WUNDERGRROUND_API_KEY = "***YOUR_WU_API_KEY***";
const String WUNDERGRROUND_LANGUAGE = "EN";
const String WUNDERGROUND_COUNTRY = "UA";
const String WUNDERGROUND_CITY = "Dnipropetrovs'k";

//Thingspeak Settings
const String THINGSPEAK_CHANNEL_ID = "150258";
const String THINGSPEAK_API_READ_KEY = "***YOUR_THINGSPEAK_API_KEY***";

// Initialize the oled display for address 0x3c
// sda-pin=0 and sdc-pin=2
SSD1306Wire display(I2C_DISPLAY_ADDRESS, SDA_PIN, SDC_PIN);
OLEDDisplayUi ui( &display );

TimeClient timeClient(UTC_OFFSET);

// Set to false, if you prefere imperial/inches, Fahrenheit
WundergroundClient wunderground(IS_METRIC);

ThingspeakClient thingspeak;

// flag changed in the ticker function every 20 minutes
bool readyForWeatherUpdate = false;

String lastUpdate = "--";

Ticker ticker;

//declaring prototypes
void drawProgress(OLEDDisplay *display, int percentage, String label);
void updateData(OLEDDisplay *display);
void drawDateTime(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);
void drawCurrentWeather(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);
void drawForecastDay1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);
void drawForecastDay2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);
void drawForecastNight1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);
void drawForecastNight2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);
void drawForecastDetailDay(OLEDDisplay *display, int x, int y, int dayIndex);
void drawForecastDetailNight(OLEDDisplay *display, int x, int y, int dayIndex);
void drawThingspeak(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);
void drawAdditional(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);
void drawHeaderOverlay(OLEDDisplay *display, OLEDDisplayUiState* state);
void setReadyForWeatherUpdate();

// Add frames
// this array keeps function pointers to all frames
// frames are the single views that slide from right to left
FrameCallback frames[] = { drawDateTime, drawCurrentWeather, drawForecastDay1, drawForecastDay2,
drawForecastNight1, drawForecastNight2, drawThingspeak, drawAdditional };
int numberOfFrames = 8;

OverlayCallback overlays[] = { drawHeaderOverlay };
int numberOfOverlays = 1;

void setup() {
// Serial.begin(115200);

ui.setTargetFPS(30);
ui.setTimePerFrame(10000);
ui.setFrameAnimation(SLIDE_LEFT);
ui.setFrames(frames, numberOfFrames);
ui.setOverlays(overlays, numberOfOverlays);
ui.disableAllIndicators();
// Inital UI takes care of initalising the display too.
ui.init();

display.flipScreenVertically();
display.setContrast(0);

updateData(&display);

ticker.attach(UPDATE_INTERVAL_SECS, setReadyForWeatherUpdate);
}

void loop() {

if (readyForWeatherUpdate && ui.getUiState()->frameState == FIXED) {
updateData(&display);
}

int remainingTimeBudget = ui.update();

if (remainingTimeBudget > 0) {
// You can do some work here
// Don't do stuff if you are below your
// time budget.
delay(remainingTimeBudget);
}
}

/CUT/

void connectWI_FI(){
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_CENTER);
WiFi.forceSleepWake(); delay(1);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PWD);
int counter = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
display.clear();
display.drawString(64, 10, "Connecting to WiFi");
display.drawXbm(46, 30, 8, 8, counter % 3 == 0 ? activeSymbole : inactiveSymbole);
display.drawXbm(60, 30, 8, 8, counter % 3 == 1 ? activeSymbole : inactiveSymbole);
display.drawXbm(74, 30, 8, 8, counter % 3 == 2 ? activeSymbole : inactiveSymbole);
display.display();
counter++;
}
}

void updateData(OLEDDisplay *display) {
connectWI_FI();
drawProgress(display, 10, "Updating time...");
timeClient.updateTime();
drawProgress(display, 30, "Updating conditions...");
wunderground.updateConditions(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);
drawProgress(display, 50, "Updating forecasts...");
wunderground.updateForecast(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);
drawProgress(display, 80, "Updating thingspeak...");
thingspeak.getLastChannelItem(THINGSPEAK_CHANNEL_ID, THINGSPEAK_API_READ_KEY);
lastUpdate = timeClient.getFormattedTime();
readyForWeatherUpdate = false;
drawProgress(display, 100, "Done...");
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
WiFi.setSleepMode(WIFI_LIGHT_SLEEP);
WiFi.forceSleepBegin();
delay(500);
}

/CUT/

void drawThingspeak(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
float floatPressure;
char floatbufPressure[5];
thingspeak.getFieldValue(1).toCharArray(floatbufPressure,sizeof(floatbufPressure));
floatPressure = atof(floatbufPressure);
float Pressure = floatPressure * 0.750064;
String stringPressure = String( round(Pressure), DEC);
display->setFont(ArialMT_Plain_16);
display->setTextAlignment(TEXT_ALIGN_CENTER);
display->drawString(64 + x, 0 +y, thingspeak.getFieldValue(4));
display->drawString(64 + x, 17 + y, thingspeak.getFieldValue(0) + "°C, feels:" + thingspeak.getFieldValue(3) + "°C");
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->drawString(2 + x, 33 + y, thingspeak.getFieldValue(2) + "% ");
display->setTextAlignment(TEXT_ALIGN_RIGHT);
display->drawString(126 + x, 33 + y, stringPressure + "mmHg");
}

void drawAdditional(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
float floatPressure2;
char floatbufPressure2[5];
wunderground.getPressure().toCharArray(floatbufPressure2,sizeof(floatbufPressure2));
floatPressure2 = atof(floatbufPressure2);
float Pressure2 = floatPressure2 * 0.750064;
String stringPressure2 = String( round(Pressure2), DEC);
display->setFont(ArialMT_Plain_10);
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->drawString(0 + x, 1 +y, "Wind speed.............");
display->drawString(0 + x, 9 +y, "Wind direction.............");
display->drawString(0 + x, 17 +y, "Humidity......................");
display->drawString(0 + x, 25 +y, "Pressure.............");
display->drawString(0 + x, 33 +y, "Dew point.....................");
display->drawString(0 + x, 41 +y, "UV radiation.....................");
display->setTextAlignment(TEXT_ALIGN_RIGHT);
display->drawString(128 + x, 1 +y, wunderground.getWindSpeed() + "km/h");
display->drawString(128 + x, 9 +y, wunderground.getWindDir());
display->drawString(128 + x, 17 +y, wunderground.getHumidity());
display->drawString(128 + x, 25 +y, stringPressure2 + "mmHg");
display->drawString(128 + x, 33 +y, wunderground.getDewPoint() + "°C");
display->drawString(128 + x, 41 +y, wunderground.getUV());
}

void drawHeaderOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) {
display->setColor(WHITE);
display->setFont(ArialMT_Plain_10);
String time = timeClient.getFormattedTime().substring(0, 8);
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->drawString(0, 53, time);
display->setTextAlignment(TEXT_ALIGN_RIGHT);
String temp = "Feels like:" + wunderground.getFeelsLike() + "°C";
display->drawString(128, 53, temp);
display->drawHorizontalLine(0, 53, 128);
}

void setReadyForWeatherUpdate() {
// Serial.println("Setting readyForUpdate to true");
readyForWeatherUpdate = true;
}
в демо режиме (после того как получил инфу) модуль потребляет 20,2-21,4мА, 20,2мА, Карл!. И только при смене экранов 22,3мА. Т.е. меньше чем, если проц в Light_sleep без задач. А здесь работает счетчик тактов ui.display. Без дисплея вообще 18мА! Хотя это и можно списать на погрешность измерений. Но что-то я упустил...

возможно Вас устроит режим Light-sleep
Не вижу его, блин, и эта красивая картинка...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Использую esp-01 исключительно в режиме клиента и никак иначе, режим AP в ней исключительно для первичной настройки iot весчи. Так?
.......
в демо режиме (после того как получил инфу) модуль потребляет 20,2-21,4мА, 20,2мА, Карл!. И только при смене экранов 22,3мА. Т.е. меньше чем, если проц в Light_sleep без задач. А здесь работает счетчик тактов ui.display. Без дисплея вообще 18мА! Хотя это и можно списать на погрешность измерений. Но что-то я упустил...
Ничего не знаю, что там у вас :)
Включил в меню LIGH и режим Station:
Снимок1364.gif
, включил тестер и по IRDA он передал:
Код:
No    Time    DC/AC    Value    Unit    AUTO
1    0:04:28        00.000    mA    AUTO
2    0:04:29        00.000    mA    AUTO
3    0:04:30        00.000    mA    AUTO
4    0:04:31        081.37    mA    AUTO
5    0:04:32        071.47    mA    AUTO
6    0:04:33        077.30    mA    AUTO
7    0:04:34        072.35    mA    AUTO
8    0:04:34        072.31    mA    AUTO
9    0:04:36        072.28    mA    AUTO
10    0:04:36        101.99    mA    AUTO
11    0:04:38        072.29    mA    AUTO
12    0:04:38        072.22    mA    AUTO
13    0:04:40        072.28    mA    AUTO
14    0:04:40        072.27    mA    AUTO
15    0:04:42        072.31    mA    AUTO
16    0:04:42        072.33    mA    AUTO
17    0:04:44        03.289    mA    AUTO
18    0:04:45        00.279    mA    AUTO
19    0:04:46        02.722    mA    AUTO
20    0:04:47        02.675    mA    AUTO
21    0:04:48        00.281    mA    AUTO
22    0:04:49        071.85    mA    AUTO
23    0:04:50        071.69    mA    AUTO
24    0:04:51        02.770    mA    AUTO
25    0:04:52        00.283    mA    AUTO
26    0:04:53        0.L    mA    AUTO
27    0:04:54        02.722    mA    AUTO
28    0:04:55        02.691    mA    AUTO
29    0:04:56        071.51    mA    AUTO
30    0:04:57        071.71    mA    AUTO
31    0:04:58        071.77    mA    AUTO
32    0:04:59        071.51    mA    AUTO
33    0:05:00        071.26    mA    AUTO
34    0:05:01        02.766    mA    AUTO
35    0:05:02        01.301    mA    AUTO
36    0:05:03        0.L    mA    AUTO
37    0:05:04        03.198    mA    AUTO
38    0:05:05        071.83    mA    AUTO
39    0:05:06        071.90    mA    AUTO
40    0:05:07        071.90    mA    AUTO
41    0:05:08        00.281    mA    AUTO
42    0:05:09        00.380    mA    AUTO
43    0:05:10        02.772    mA    AUTO
44    0:05:11        00.275    mA    AUTO
45    0:05:12        00.285    mA    AUTO
46    0:05:14        03.017    mA    AUTO
47    0:05:14        02.663    mA    AUTO
48    0:05:16        071.43    mA    AUTO
49    0:05:16        071.33    mA    AUTO
50    0:05:17        0.L    mA    AUTO
51    0:05:18        02.760    mA    AUTO
52    0:05:19        02.720    mA    AUTO
53    0:05:20        03.351    mA    AUTO
54    0:05:21        02.842    mA    AUTO
55    0:05:22        0.L    mA    AUTO
56    0:05:24        02.971    mA    AUTO
57    0:05:24        09.391    mA    AUTO
На 4-ой секунде воткнул в тестер щуп и модуль ESP-01 стартанул....
Снимок1365.gif
Какие 20.2 мА? :rolleyes:
Пик тама - соединился с AP. Далее модуль подождал и врубил работу Sleep WiFi... Но тишины в эфире нема и тыркается...
Подробнее, с усреднением и замерами специальным сдвоенным 24-х битным ADC графики указаны ранее... Потребление в LIGH WiFi зависит от погоды.... В лесу наверно будет средних несколько мА, в городе - от 15 с показом времени суток :)
 
Последнее редактирование:

Makc1806

New member
Далее модуль подождал и врубил работу Sleep WiFi... Но тишины в эфире нема и тыркается...
Подробнее, с усреднением и замерами специальным сдвоенным 24-х битным ADC графики указаны ранее... Потребление в LIGH WiFi зависит от погоды.... В лесу наверно будет средних несколько мА, в городе - от 15 с показом времени суток :)
Спасибо, разжевали "в кашицу". Теперь понятно, графики все ставят на свои места. Понимаю так: Wi-Fi полностью отключить нельзя. Так, что-бы esp работал только как голый контроллер? Т.е. он всегда поддерживает работу радио и только в Deep sleep его отключает?
 

pvvx

Активный участник сообщества
Спасибо, разжевали "в кашицу". Теперь понятно, графики все ставят на свои места. Понимаю так: Wi-Fi полностью отключить нельзя. Так, что-бы esp работал только как голый контроллер? Т.е. он всегда поддерживает работу радио и только в Deep sleep его отключает?
Нет. Опять путаете. WiFi отключается переводом в режим ноль.
А sleep-ы есть разных типов:
Для WiFi station режима (SoftAP выключена) - MODEM и LIGHT.
Код:
wifi_set_sleep_type(mode);
Для системы в целом, когда WiFi отключена.
Код:
Вход в sleep системы:
    wifi_set_opmode_current(NULL_MODE);
    wifi_fpm_set_sleep_type(mode);
    wifi_fpm_open();
    wifi_fpm_do_sleep(time_us);
Выход из sleep:
        wifi_fpm_do_wakeup();
        wifi_fpm_close();
        wifi_set_opmode_current(oldmode);
Понимаю так: Wi-Fi полностью отключить нельзя. Так, что-бы esp работал только как голый контроллер? Т.е. он всегда поддерживает работу радио и только в Deep sleep его отключает?
Нет - при загрузке без SDK, в регистр по адресу 0x60000710 пишете нуль и WiFi блок отключен, как и другое оборудование.
К примеру, в данном регистре:
bit31 =1 источник тактирования для I2S, ... = PLL (80MHz)
bit25,26 =1 источник тактирования для SAR ... = PLL (80MHz)
ROM-BIOS по старту включает WiFi (т.е. во время загрузки SDK WiFi точит батарейку, и пока не дойдет до инициализации WiFi, WiFi включен на неверной частоте. SDK не включает сама WiFi, если вы его выключили в регистре 0x60000710. Китайцы считают, что лишнее потребление в 1,5 раза при загрузке - это хорошо).
По сигналу RESET WiFi не отключается и работает на неправильной частоте, глуша всех окружающих, если его прервали на передаче, даже если вы перезагрузили модуль в режим программирования. Очень хорошая глушилка.
Проверяется тестером. Включается модуль и через время нажимается и удерживается RESET. При этом, с нажатым RESET, ток потребления будет разный - в зависимости на какой функции прервали работу блока WiFi... :) Один из сотен багов чипа ESP8266.
Когда батарейка у вас сядет, то по старту, он провалит питание и при последующем плавном повышении питания модуль с ESP8266 превращается в глушилку WiFi. Есть и такая фича :)
А так - "за то дешево и иногда работает". Но вот дешево уже не сказать, если нужен запуск по кнопке, автономное питание и ... Для этих случаев есть замена, которая работает и стоит на 40 руб в пределе дороже... А тот-же RTL8711AM может просыпаться и по назначенному уровню в ADC, NFC и ещё куче всяких вариантов...
 
Последнее редактирование:

nikolz

Well-known member
Провел такой эксперимент.
Алгоритм -включили режим станции
подключились
установили таймер на 5 минут
В колбеке таймера проверяем соединение и если есть отсылаем на комп текст по UDP
комп принимает печатает отсылает ответ
ESP принимает ответ
----------------------------------------
Далее измерял потребление.
без режима легкого сна ток не менее 20 ма
включаю режим легкого сна в user_init
командой wifi_set_sleep_type(LIGHT_SLEEP_T);
остальное без изменения.
ток потребления 5 ма (ESP-12 диод мигает)
Считаем , что ожидаем.
На осциллографе видно включение приемника каждые 100 мс на 6 ms При этом ток 75 ма
Считаем среднюю 75*6/100=4.5 ma.
------------------------------------------
Усе нормально, шеф!!
 

Makc1806

New member
Усе нормально, шеф!!
Таки, да!
Спасибо всем!
#include <ESP8266WiFi.h>
extern "C" {
#include "gpio.h"
}
extern "C" {
#include "user_interface.h"
}
const char* ssid = "SSID";
const char* password = "PASS";
void setup() {
Serial.begin(115200);
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
}
void loop() {
// Здесь то что вам нужно сделать.
Serial.println("Working...");
delay(1000);
sleep();
delay(100);
Serial.println("Wake up!");
}
void sleep()
{
Serial.println("Good night!");
gpio_pin_wakeup_enable(GPIO_ID_PIN(2), GPIO_PIN_INTR_LOLEVEL); // Кнопка на GPIO2
wifi_fpm_open();
wifi_fpm_do_sleep(0xFFFFFFF);
}
Работает великолепно со старта уходит в light sleep и потребляет 4,8мА! Просыпается по кнопке с 73мА, печатает "Working..." и ходит в 2,7мА.

Пожалуйста скажите, как написать, что-бы он выходил из sleep режима через, например 10 сек. И можно-ли выходить из LIGHT_SLEEP в MODEM_SLEEP, с расчетом сэкономить мА, кода не нужна работа Wi-Fi (с примером кода)?
Спасибо!
 

nikolz

Well-known member
Таки, да!
Пожалуйста скажите, как написать, что-бы он выходил из sleep режима через, например 10 сек. И можно-ли выходить из LIGHT_SLEEP в MODEM_SLEEP, с расчетом сэкономить мА, кода не нужна работа Wi-Fi (с примером кода)?
Спасибо!
Можно написать, но мне это пока не требуется.
Поэтому изучайте документацию и дописывайте сами.
Будут ошибки спрашивайте.
 

pvvx

Активный участник сообщества
Считаем среднюю 75*6/100=4.5 ma.
Вам везет - вы живете в лесу и в эфире WiFi чисто. У меня, в городе, менее 15 mA в данном режиме не выходит. Норма в нем 35 мА.
Только кратковременно бывают паузы потребления с менее 4 мА на пару секунд.
Что-то у вас не правильно сосчитано. При просыпании на окно приема каждого beacon выходит менее 3 мА, но приходящие другие пакеты и само приложение взывают очень частые отключения этого режима на время обработки и получаются пропуски входа в sleep и общее потребление стремиться за 35 мА. Режим LIGHT плохо реализован в ESP8266...
 
Последнее редактирование:

Makc1806

New member
Провел такой эксперимент.
Алгоритм -включили режим станции
подключились
установили таймер на 5 минут
В колбеке таймера проверяем соединение и если есть отсылаем на комп текст по UDP
комп принимает печатает отсылает ответ
ESP принимает ответ
Дайте пожалуйста, если не сложно, код Вашего примера. Спасибо большое, так, я пока не могу разобраться с КБ строками функций. Ничего хорошего по потреблению тока в режиме конечного времени включения не получается, только с 0хFFFFFFF приемлемо, но такое никак не годится для достижения цели :(
 

nikolz

Well-known member
Дайте пожалуйста, если не сложно, код Вашего примера. Спасибо большое, так, я пока не могу разобраться с КБ строками функций. Ничего хорошего по потреблению тока в режиме конечного времени включения не получается, только с 0хFFFFFFF приемлемо, но такое никак не годится для достижения цели :(
У меня нет простого примера. Я использую свой рабочий вариант работы ESP с датчиками.
Разница лишь в том, что отключаю deepsleep.
Если в любую прогу с работой по таймеру добавите
wifi_set_sleep_type(LIGHT_SLEEP_T);
то ESP будет через некоторое время работы автоматом выключать процессор если он не используется.
При этом ток потребления будет больше чем 5 ма, так как кроме слушания эфира 6 мс с периодом 100 мс есть еще и основная работа ESP.
--------------------------------------
В варианте который Вы использовали задается режим LIGHT_SLEEP_T который будет после выхода из сна по кнопке.
--------------------------------
Изменение режима на другой происходит лишь после нового засыпания.
Т е если Вы вышли в Ligth и хотите сменить режим то надо установить режим заснуть по таймеру и проснуться в новом режиме. ( По крайней мере так написано в документации)
Поэтому нарисуйте сначала алгоритм, как и когда в какие режимы вы хотите переходить и потом его программируйте.
 

nikolz

Well-known member
Измерил средний ток режим LIGHT_SLEEP_T при таймере 6 секунд и отсутствии ответа компа
картинка такая
upload_2017-4-15_23-40-2.png
средний ток 18 ма.
-------------------
Если ESP будет просыпаться каждые 6 секунд отсылать данные и снова спать (активный режим у меня получился 0.47-0.54 сек) то средний ток 7 ма.
 

nikolz

Well-known member
После добавления медианного фильтра в алгоритм АЦП ESP (использую в качестве осциилографа и измерителя напряжения и тока) и устранения систематического смещения средний ток составил 14 ma (таймер 5 сек на рис).
upload_2017-4-16_12-54-24.png
----------------------
 

Вложения

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

nikolz

Well-known member
Как время таймер в режиме LIGHT_SLEEP_T задать?
включение этого режима не связано с таймером.
Таймер устанавливаем как обычно.
Например, при использовании микросекундного таймера :
os_timer_arm_us(&timer,6000*1000,1); //6 секунд
------------------------
таймер задает интервал опроса датчиков и отправки сообщений .
 

nikolz

Well-known member
А это тоже, но с deepsleep на 5 секунд. средний ток 9.5 ma.
upload_2017-4-16_13-7-1.png
-------------------------
Теперь можно посчитать средний ток и сравнить результат:
1) синхронизация работы WIF у меня происходит 6 ms каждые 100 (в документации указано 3 ms)
Поэтому средний ток потребления приемника составляет как считал ранее
75*6/100=4.5 ма.
В режиме deep sleep фактически имеем средний ток активности процессора и передатчика 5 секунд что составило 9.5 ма

В режиме Ligth средний ток равен сумме тока синхронизации и активности deep sleep т е 9.5+4.5 = 14 ма
--------------------------------------------
Вывод:
Если увеличивать время сна,что равно времени таймера в режиме Ligth, то средний
ток будет отличаться на величину в моем случае на 4.5 ма ( по документации в два раза меньше)
 
Последнее редактирование:

pvvx

Активный участник сообщества
После добавления медианного фильтра в алгоритм АЦП ESP (использую в качестве осциилографа и измерителя напряжения и тока) и устранения систематического смещения средний ток составил 14 ma (таймер 5 сек на рис).
Посмотреть вложение 3950
----------------------
Сложно среднее подсчитать? Видимо замер идет не непрерывный, а с "дырками" и не синхронно (пиковые разрозненные значения)? Нафиг такие измерения.
Ставьте нормальный ADC с фильтрами и внутренней децимацией... Выйдет то что и писал - от 15 мА...
 
Последнее редактирование:

nikolz

Well-known member
Вам везет - вы живете в лесу и в эфире WiFi чисто. У меня, в городе, менее 15 mA в данном режиме не выходит. Норма в нем 35 мА.
Только кратковременно бывают паузы потребления с менее 4 мА на пару секунд.
Что-то у вас не правильно сосчитано. При просыпании на окно приема каждого beacon выходит менее 3 мА, но приходящие другие пакеты и само приложение взывают очень частые отключения этого режима на время обработки и получаются пропуски входа в sleep и общее потребление стремиться за 35 мА. Режим LIGHT плохо реализован в ESP8266...
Может определитесь сколько же у Вас получается 15,35 или 4 ?
 

pvvx

Активный участник сообщества
Может определитесь сколько же у Вас получается 15,35 или 4 ?
При WiFi LIGHT (соединен с AP) - от 15 мА до 70. Зависит от погоды на Марсе (времени суток и активности устройств в WiFi диапазоне).
В лесу, если настроить роутер с AP, то возможно получу к 4 мА.
Но смысла маяться и ехать в лес не вижу. Проще поставить RTL модуль и свести потребление к 4 мА в ждущих режимах или менее, если использовать deep_sleep с просыпанием по событиям: NFC, пины I/O, уровень ADC,...

PS: Что там с режимами ожидания и поддержки просыпаний от событий у ESP-32S? Чип вроде новее и должно что-то быть... Писатели esp-idf обещали сделать ускоренный старт и уже починили (частично) стартовый ток (был средний более 0.5A) - опустили стартовую частоту CPU. Пока не проверял.
 
Последнее редактирование:

nikolz

Well-known member
При WiFi LIGHT (соединен с AP) - от 15 мА до 70. Зависит от погоды на Марсе (времени суток и активности устройств в WiFi диапазоне).
В лесу, если настроить роутер с AP, то возможно получу к 4 мА.
Но смысла маяться и ехать в лес не вижу. Проще поставить RTL модуль и свести потребление к 4 мА в ждущих режимах или менее, если использовать deep_sleep с просыпанием по событиям: NFC, пины I/O, уровень ADC,...

PS: Что там с режимами ожидания и поддержки просыпаний от событий у ESP-32S? Чип вроде новее и должно что-то быть... Писатели esp-idf обещали сделать ускоренный старт и уже починили (частично) стартовый ток (был средний более 0.5A) - опустили стартовую частоту CPU. Пока не проверял.
Провел эксперимент, который объясняет почему получается 14 ма а не 4.
У меня получилось, что даже если не ставить таймер вообще то ESP каждые 20 секунд делает связь с роутером, т е включает активный режим процессора и передатчика в результате к 4 добавляется 10.
 
Сверху Снизу