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