ESP8266 глубокий сон (Deep Sleep) с Arduino IDE (NodeMCU)
Это руководство показывает, как использовать режим глубокого сна (deep sleep) с ESP8266 (NodeMCU) используя Arduino IDE. Мы рассмотрим глубокий сон с пробуждением по таймеру и глубокий сон с внешним пробуждением через вывод сброса (RST).
Чтобы перевести ESP8266 в режим глубокого сна, используйте ESP.deepSleep(uS) и передайте в качестве аргумента время сна в микросекундах. GPIO 16 должен быть подключен к выводу сброса (RST), чтобы ESP8266 мог проснуться.
Чтобы перевести ESP8266 в режим глубокого сна на неопределенный период времени, используйте ESP.deepSleep(0). ESP8266 проснется, когда на вывод RST поступит сигнал LOW.
Видеоурок
Это руководство доступно в формате видео (смотрите ниже) и в текстовом формате (продолжайте чтение этой страницы).
Связанный материал: ESP32 Deep Sleep с Arduino IDE и источники пробуждения
Знакомство с режимом глубокого сна
Если вы создали проект на плате ESP8266, работающий от батареи, или просто подключили свою плату ESP8266 NodeMCU к повербанку. Поработав некоторое время, вы заметите, что батарея разряжается довольно быстро, особенно если вы используете Wi-Fi.
Если перевести ESP8266 в режим глубокого сна, энергопотребление снизится, и батареи прослужат дольше.
Перевод ESP8266 в режим глубокого сна означает отключение действий, потребляющих больше всего энергии при работе (например, Wi-Fi), но сохранение минимальной активности, достаточной для пробуждения процессора, когда происходит что-то интересное.
Типы режимов сна
Существует три различных типа режима сна: сон модема (modem sleep), легкий сон (light sleep) и глубокий сон (deep sleep). В таблице ниже показаны различия между каждым режимом (информация из даташита ESP8266).
Параметр |
Modem-sleep |
Light-sleep |
Deep-sleep |
|---|---|---|---|
Wi-Fi |
OFF |
OFF |
OFF |
Системные часы |
ON |
OFF |
OFF |
RTC |
ON |
ON |
ON |
CPU |
ON |
Pending |
OFF |
Ток подложки |
15 мА |
0,4 мА |
~20 мкА |
Средний ток (DTIM = 1) |
16,2 мА |
1,8 мА |
– |
Средний ток (DTIM = 3) |
15,4 мА |
0,9 мА |
– |
Средний ток (DTIM = 10) |
15,2 мА |
0,55 мА |
– |
Примечание: значения энергопотребления в таблице относятся к ESP8266 как отдельному чипу. Если вы используете плату разработки, она содержит пассивные компоненты, которые потребляют больше тока.
Все режимы имеют разное назначение и должны использоваться в различных приложениях.
В этой статье мы рассмотрим режим глубокого сна. В этом режиме всё всегда выключено, кроме часов реального времени (RTC), благодаря которым ESP8266 отслеживает время.
Это наиболее энергоэффективный вариант, и чип ESP потребляет всего около 20 мкА. Однако если вы используете полнофункциональную плату разработки со встроенным программатором, светодиодами и т.д., вы не сможете достичь такого низкого энергопотребления.
Скетч глубокого сна
При использовании глубокого сна пример приложения выглядит следующим образом:
ESP8266 подключается к Wi-Fi
ESP8266 выполняет задачу (считывает датчик, публикует MQTT-сообщение и т.д.)
Засыпает на заданный период времени
ESP8266 просыпается
Процесс повторяется снова и снова
Источники пробуждения
После перевода ESP8266 в режим глубокого сна существуют различные способы его пробуждения:
#1 пробуждение по таймеру: ESP8266 просыпается самостоятельно через заданный период времени
#2 внешнее пробуждение: ESP8266 просыпается при нажатии кнопки RST (ESP8266 перезагружается)
Для проектов с низким энергопотреблением вы можете рассмотреть использование платы ESP32, которая предлагает больше режимов глубокого сна и источников пробуждения.
#1 ESP8266 глубокий сон с пробуждением по таймеру
Чтобы использовать пробуждение по таймеру с ESP8266, необходимо подключить вывод RST к GPIO 16, который обозначен как D0 на плате NodeMCU. Просто следуйте следующей схеме подключения:
Подключайте вывод RST к GPIO 16 только после загрузки кода.
Если вы посмотрите на распиновку NodeMCU, вы увидите, что GPIO 16 — это специальный вывод, который имеет функцию WAKE (пробуждение).
Рекомендуем прочитать: Справочник по распиновке ESP8266
Вывод RST ESP8266 всегда находится в состоянии HIGH, пока ESP8266 работает. Однако когда на вывод RST поступает сигнал LOW, микроконтроллер перезагружается.
Если вы установите таймер глубокого сна на ESP8266, по окончании таймера GPIO 16 отправляет сигнал LOW. Это означает, что GPIO 16, будучи подключенным к выводу RST, может разбудить ESP8266 через заданный период времени.
Скетч пробуждения по таймеру ESP8266 NodeMCU
Установив дополнение ESP8266 для Arduino IDE (как установить плату ESP8266 в Arduino IDE), перейдите в Tools и выберите «NodeMCU (ESP-12E Module)». Вот код, который нужно загрузить в ваш ESP:
/*
* ESP8266 Deep sleep mode example
* Rui Santos
* Complete Project Details https://randomnerdtutorials.com
*/
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);
// Wait for serial to initialize.
while(!Serial) { }
// Deep sleep mode for 30 seconds, the ESP8266 wakes up by itself when GPIO 16 (D0 in NodeMCU board) is connected to the RESET pin
Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds");
ESP.deepSleep(30e6);
// Deep sleep mode until RESET pin is connected to a LOW signal (for example pushbutton or magnetic reed switch)
//Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
//ESP.deepSleep(0);
}
void loop() {
}
В этом примере мы выводим сообщение в монитор порта:
Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
После этого ESP8266 засыпает на 30 секунд.
ESP.deepSleep(30e6);
Чтобы перевести ESP8266 в режим глубокого сна, используйте ESP.deepsleep(uS) и передайте в качестве аргумента время сна в микросекундах.
В данном случае 30e6 соответствует 30 000 000 микросекунд, что равно 30 секундам.
После загрузки кода нажмите кнопку RST, чтобы начать выполнение кода, а затем подключите RST к GPIO 16. ESP8266 должен просыпаться каждые 30 секунд и выводить сообщение в мониторе порта, как показано ниже.
Этот пример просто выводит сообщение в монитор порта, но в реальном приложении вы будете выполнять полезную задачу, такую как отправка запроса, публикация показаний датчиков и т.д.
Схема пробуждения по таймеру для ESP-01
Если вы хотите сделать аналогичную настройку с платой ESP-01, вам нужно припаять провод, как показано ниже. Этот крошечный вывод — GPIO 16, и его нужно подключить к выводу RST.
Однако выводы настолько маленькие, что припаять провод к GPIO 16 на ESP-01 очень сложно… Поэтому для этого режима пробуждения лучше использовать плату NodeMCU или чистый чип ESP12-E.
Рекомендуем прочитать: Справочник по распиновке ESP8266
#2 ESP8266 глубокий сон с внешним пробуждением
Вы также можете разбудить ESP8266 внешним пробуждением, например, нажатием кнопки или герконом (reed switch). Вам просто нужно перевести ESP8266 в режим глубокого сна на неопределенный период времени, а затем подать на вывод RST сигнал LOW, чтобы разбудить его.
Чтобы протестировать эту настройку, подключите кнопку к вашей плате ESP8266, как показано на следующей схеме подключения. При нажатии кнопки на вывод RST поступает сигнал LOW.
Если вы используете ESP-01, следуйте этой схеме.
Скетч внешнего пробуждения ESP8266
Затем загрузите следующий код в вашу плату ESP8266.
/*
* ESP8266 Deep sleep mode example
* Rui Santos
* Complete Project Details https://randomnerdtutorials.com
*/
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);
// Wait for serial to initialize.
while(!Serial) { }
// Deep sleep mode for 30 seconds, the ESP8266 wakes up by itself when GPIO 16 (D0 in NodeMCU board) is connected to the RESET pin
//Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds");
//ESP.deepSleep(30e6);
// Deep sleep mode until RESET pin is connected to a LOW signal (for example pushbutton or magnetic reed switch)
Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
ESP.deepSleep(0);
}
void loop() {
}
Этот код переводит ESP8266 в режим глубокого сна на неопределенный период времени. Для этого нужно просто передать 0 в качестве аргумента функции deepSleep():
ESP.deepSleep(0);
ESP проснется только когда что-то сбросит плату. В данном случае это нажатие кнопки, которая подтягивает вывод RST к GND.
Когда вы нажимаете кнопку, ESP8266 просыпается, выполняет запрограммированную задачу и снова засыпает до тех пор, пока не произойдет новое событие сброса.
Измерение тока
Когда плата находится в режиме глубокого сна, измерьте потребление тока с помощью мультиметра, чтобы узнать, сколько энергии она потребляет.
Вот как нужно разместить щупы мультиметра.
Когда ESP-01 находится в режиме глубокого сна, он потребляет всего 0,3 мА, что составляет приблизительно 300 мкА.
Имейте в виду, что при обычном использовании с Wi-Fi ESP8266 может потреблять от 50 мА до 170 мА.
Заключение
Теперь, когда вы знаете, как использовать функцию deepSleep(), ваш проект, работающий от батареи, сможет проработать дольше.
Вам также могут быть интересны другие проекты ESP8266:
У нас есть другие руководства по глубокому сну, которые могут вас заинтересовать: