Load Загрузка

ESP8266 режимы сна, энергосбережение

В этом руководстве я покажу как организовать три режима сна на плате ESP8266. Отправляя микроконтроллер в сон мы тем самым экономим энергию, это важно, когда устройство питается от аккумулятора и работает круглосуточно.

Самое популярное устройство на ESP это уличный термометр, данные с датчика отправляются на сервер с неким интервалом, обычно один раз в 5 - 10 минут. Замер температуры и отправка данных занимают несколько секунд, всё остальное время микроконтроллер бездействует, потребляя энергию. Чтобы сохранить заряд аккумулятора можно погрузить ESP  в сон.

Примерный режим работы микроконтроллера:

ESP8266 подключается к WiFi
ESP8266 выполняет задачу (проверяет датчики, отправляет данные)
ESP8266 засыпает на определённый период времени
ESP8266 просыпается
Процесс повторяется, подключение к WiFi, считывание данных, обработка, сон...

Существует три типа спящего режима:

Модем-сон - выключен только WiFi. Ток потребления 15 mA.

Лёгкий сон - всё выключено, кроме часов реального времени (RTC), процессор в режиме ожидания. Ток потребления 0.4 mA.

Глубокий сон - всё выключено, работают только часы реального времени (RTC). Ток потребления 20 uA.

Таблица сравнения режимов сна для ESP8266:

Item Modem-sleep Light-sleep Deep-sleep
Wi-Fi OFF OFF OFF
System clock ON OFF OFF
RTC ON ON ON
CPU ON Pending OFF
Ток потребления 15 mA 0.4 mA ~20 uA
Average current (DTIM = 1) 16.2 mA 1.8 mA
Average current (DTIM = 3) 15.4 mA 0.9 mA
Average current (DTIM = 10) 15.2 mA 0.55 mA

Я попробовал все три режима сна и расскажу вам что у меня получилось. Тестировал  на платах ESP-01 и WeMos D1 mini. Во всех трёх случаях нужно заново подключаться к WiFi.

Модем-сон / Modem-sleep

В этом режиме микроконтроллер не спит, но потребляет минимум энергии, всего 15 mA, это примерно как 2-3 ярких светодиода. При питании устройства от сети этим потреблением энергии можно принебречь, а вот аккумулятора хватит не на долго. Этот режим сна самый простой в реализации, достаточно в прошивке написать пару строк:

WiFi.forceSleepBegin(); // Wifi off
// тут код основной программы
WiFi.forceSleepWake(); // Wifi on
delay(15000); // сон 15 сек

В тестах этот режим работал без проблем.

Лёгкий сон / Light-sleep

Всё выключено, кроме часов реального времени (RTC), процессор в режиме ожидания. Ток потребления в этом режиме 0.4 mA. С таким энергопотреблением аккумулятор проработает достаточно долго.

После пробуждения нужно заново подключаться к WiFi. С помощью кнопки можно разбудить микроконтроллер, для этого GPIO2 нужно замкнуть на минусовой вывод.

Чтобы запустить режим сна, используйте слудующий код:

void light_sleep()
{
  //wifi_station_disconnect(); //not needed
  uint32_t sleep_time_in_ms = 15000; // sleep time ms
  wifi_set_opmode(NULL_MODE);
  wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
  wifi_fpm_open();
  wifi_fpm_set_wakeup_cb(callback);
  wifi_fpm_do_sleep(sleep_time_in_ms * 1000);
  delay(sleep_time_in_ms + 1);
}

void callback()
{
  Serial1.println("Callback");
  Serial.flush();
}

Здесь две функции, когда нужно заснуть в коде вызываем функцию light_sleep(). В примере установлено время сна 15 сек, но можно усыпить насовсем или пока не будет нажата кнопка, для этого замените строку на эту:

wifi_fpm_do_sleep(0xFFFFFFF); // заснуть и не просыпаться

Режим лёгкого сна оказался самым непонятным и капризным. Во-первых много кода и на разных сайтах авторы используются разные подходы к его написанию. Во-вторых этот сон у меня исправно работает до одной минуты, если больше, то микроконтроллер самостоятельно не выходит из сна. Пробуйте, может у вас будет работать иначе или вам удастся написать код иначе, чтобы сон работал как надо.

Глубокий сон / Deep-sleep

Это наиболее энергоэффективный вариант, микросхема ESP8266 потребляет всего 20 мкА. Оратите внимание, что ток может быть выше, если у вас в схеме есть другие потребители, например светодиоды, стабилизаторы напряжения, датчики.

Этот режим перезагружает микроконтроллер, поэтому после просыпания он будет заново подключаться к WiFi. Т.е. в этом режиме виртуально нажимается кнопка reset и программа начинает работать с начала.

Чтобы перевести ESP8266 в режим глубокого сна, нужно написать всего одну строку:

ESP.deepSleep(15e6); // сон  (5 минут = 300e6) или 0 - чтобы не просыпаться самостоятельно

Чтобы вручную разбудить, нужно на вывод RST подать сигнал LOW.

Чтобы микросхема могла самостоятельно выйти из глубокого сна нужно сделать перемычку RST на GPIO 16, который помечен как D0. Если посмотрите на распиновку, увидите, что GPIO 16 имеет функцию WAKE

NodeMCU ESP8266 распиновка

Припаяйте перемычку как нарисовано ниже для платы NodeMCU:

Перемычка для платы NodeMCU

Перемычка  для платы WeMos D1 mini:

Перемычка  для платы WeMos D1 mini

Сложнее всего перемычку припаять на плате ESP-01, тут еле заметные контакты и пайка потребует от вас мастерства. Если не уверены в себе, то лучше не паяйте, возьмите другую плату, например WeMos D1 mini.

Перемычка для ESP-01

На новых версиях этой платы рядом с контактом, к которому надо припаять перемычку стоят SMD-детали, что ещё больше усложнит процесс пайки, можно просто испортить плату. Ниже на фото старая версия платы и новая. На старую плату я припаял одножильный проводок, прижал его к контакту и сверху погрел паяльником. Также на старой плате нужна перемычка между плюсовым выводом и Ch_PD, иначе плата не будет прошиваться. Чтобы добиться максимального энергосбережения на старой плате придётся удалить красный светодиод.

image

Распиновка микроконтроллера ESP8266


shadow
Дмитрий ДА Опубликовал статью: Дмитрий ДА
Дата: 09.07.2022


shadow




НАПИСАТЬ КОММЕНТАРИЙ

Ваше имя

Ваш e-mail



Shadow

Вверх ⇒