Настраиваем режим пониженного питания в микроконтроллере ESP8266, в среде программирования Arduino IDE.

Страница на этапе разработки

В данном уроке мы рассмотри 3 способа уменьшения потребления питания за счет разных режимов сна:

  1. Modem-sleep — когда мы отключаем только модем, все остальное остается работать. Данный режим подходит, когда модем не используется впринципе или когда необходимо отправлять данные в определенные промежутки времени.
  2. Light-sleep — кроме отключения модема, еще отключаются системные часы и приостанавливается работа CPU. Для пробуждения не нужно перезагружать микроконтроллер, но засыпание и пробуждение происходит по сигналу который подается на ножку которую мы выберем программно.
  3. Deep-sleep — выключено все кроме RTC. Для пробуждения микроконтроллера необходимо соединить выхода RST и GPIO16. После пробуждения программа начинается выполняться заново.

Для реализации режима сна Mode-Sleep нам необходимо на программном уровне включить/выключить модем, для этого пишем следующий текст:

WiFi.forceSleepBegin(); // Wifi off
// что то делаем
WiFi.forceSleepWake(); // Wifi on

Для реализации режима сна Light-sleep необходимо написать следующий текст который мы поместим в отдельную функцию:

void light_sleep(){
wifi_station_disconnect();
wifi_set_opmode_current(NULL_MODE);
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
wifi_fpm_open(); // Enables force sleep
gpio_pin_wakeup_enable(GPIO_ID_PIN(N*), GPIO_PIN_INTR_LOLEVEL);
wifi_fpm_do_sleep(0xFFFFFFF); // Sleep for longest possible time
}

N* — номер ножки которую мы выберем для засыпания/пробуждения микроконтроллера.

Для реализации режима сна Deep-sleep нам необходимо написать следующий текст:

 ESP.deepSleep (time);

Время измеряется в мкс, максимальное время может быть 4 294 967 295 мкс, это около 71 минуты. Из этого вытекает, что мы не можем заснуть дольше чем на 71 минуту.

Напишем программный код для проверки работы каждого из режима и зафиксируем ток потребления в каждом режиме.

Для проверки работы Modem-sleep режима, мы подключимся к Wi-Fi сети, выдадим сообщение, что подключение удалось, прейдем в режим Modem-sleep, поморгаем светодиодом который находиться на плате и перейдем в режим паузы, для фиксации тока потребления, после фиксации тока потребления, мы выйдем с режима сна и проверим наличии подключения к Wi-Fi, по отсутствию подключения и увеличения тока потребления мы сможем определить, что данный режим работает правильно.

Программный код

WiFi.disconnect();

Для проверки режима сна Light sleep, мы так же оставим два светодиода, только вместо отключения модема пропишем уже готовую функцию Light-sleep и назначим 14 вывод для засыпания и пробуждения:

#include
#define GPIO5 5
#define GPIO4 4

#define WAKE_UP_PIN 4

void light_sleep(){
wifi_station_disconnect();
wifi_set_opmode_current(NULL_MODE);
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
wifi_fpm_open(); // Enables force sleep
gpio_pin_wakeup_enable(GPIO_ID_PIN(14), GPIO_PIN_INTR_LOLEVEL);
wifi_fpm_do_sleep(0xFFFFFFF); // Sleep for longest possible time
}

void setup() {
// настраиваем ножки на выход
pinMode(GPIO5, OUTPUT);
pinMode(GPIO4, OUTPUT);
Serial.begin(115200);
}
void loop() {
digitalWrite(GPIO5, HIGH);
delay(500);
digitalWrite(GPIO5, LOW);
digitalWrite(GPIO4, HIGH);
delay(500);
digitalWrite(GPIO4, LOW);
Serial.println(«sleep»);
delay(200);
light_sleep();
delay(200);
Serial.println(«Wake up»);
}

Для проверки режима сна deep sleep, мы подключим только светодиод, который будет моргать до момента полного засыпания. По резкому уменьшению тока потребления микроконтроллера мы сможем понять, что глубокий режим сна наступил и все кроме системного таймера выключено.

программный код