ESP8266:Примеры/Использование ESP8266 в режиме глубокого сна при помощи IDE Arduino: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
 
Строка 182: Строка 182:


=См.также=
=См.также=
{{Ali}}


=Внешние ссылки=
=Внешние ссылки=

Версия от 21:47, 18 июня 2019

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Использование ESP8266 в режиме глубокого сна при помощи IDE Arduino

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

Допустим, вы сделали проект на базе ESP8266, питаемый от батареи или подключили ESP NodeMCU к пауэрбанку.

Но спустя какое-то время вы понимаете, что заряд батареи/пауэрбанка расходуется очень быстро.

И как же в таком случае сэкономить электроэнергию? С помощью кода! Если использовать в скетче ESP8266-проекта функции режима сна, этот проект будет тянуть меньше электроэнергии, благодаря чему ваши батареи будут работать дольше. В этом руководстве мы как раз разберемся, как использовать режим сна ESP8266.

Необходимое оборудование

  • Плата ESP8266 - 1шт.;
  • Провод перемычка;

Справочная информация

Типы режима сна

Есть три типа режима сна: модемный, легкий и глубокий.

Все они используются для разных целей и потому предназначены для разных типов проектов.

Режим глубокого сна

Для нашего проекта нужно, чтобы все компоненты ESP8266 были выключены, за исключением часов реального времени (RTC), благодаря которым ESP8266 следит за временем.

В нашем проекте мы будем использовать режим глубокого сна – это самый энергоэффективный режим сна, в котором ESP8266 тянет лишь 20 мкА (но если к ESP8266 будут подключены другие устройства, то эта цифра будет выше).

Другие режимы сна

Другие режимы сна – вроде легкого и модемного – полезны, когда вам нужно сберечь заряд источника питания, но при этом сохранить некоторый функционал ESP8266 в рабочем состоянии, или когда вам просто нужны какие-то альтернативные режимы питания. Но если вам нужно, чтобы заряд батареи/пауэрбанка действительно держался долго, то режим глубокого сна – это вариант номер один.

При использовании режима глубокого сна работа проекта выглядит следующим образом:

  1. ESP8266 подключается к WiFi;
  2. ESP8266 выполняет действие (считывает данные от датчика, публикует MQTT-сообщение и т.д.);
  3. Переходит в режим сна и спит заданное количество микросекунд;
  4. Три стадии выше повторяются снова и снова;

Простой проект-пример с использованием режима глубокого сна

Давайте начнем с простого. Подключите друг к другу при помощи провода-перемычки контакты RST и GPIO16 (на плате он обозначен как D0) модуля NodeMCU. Это делается очень просто:

Если взглянуть на распиновку NodeMCU, то можно увидеть, что GPIO16 – это специальный контакт, оснащенный функцией WAKE (т.е. «пробуждение»).

Контакт RST модуля ESP8266 всегда находится в состоянии «HIGH» во время работы ESP8266. Однако если этот контакт получит сигнал «LOW», это выполняет сброс микроконтроллера.

Суть этого проекта-примера в том, что мы задаем таймер для ESP8266, а когда это время заканчивается, контакт GPIO16 отправляет контакту RST сигнал «LOW». Это значит, что контакт GPIO16, будучи подключенным к RST, будет пробуждать ESP8266 каждый раз, когда отсчет таймера будет подходить к концу.

Пишем скетч для ESP-12E

Ниже – код, который нужно будет загрузить на ESP8266:

/*
 * Скетч-пример, демонстрирующий,
 * как перевести ESP8266 в режим глубокого сна
 * Автор – Руи Сантос 
 * Более подробно о проекте на: http://randomnerdtutorials.com
 */
 
void setup() {
  Serial.begin(115200);
  Serial.setTimeout(2000);

  // Ждем инициализации последовательной коммуникации:
  while(!Serial) { }
  
  // Переводим ESP8266 в режим глубокого сна на 30 секунд;
  // ESP8266 будет пробуждать себя сама,
  // пока контакт GPIO16 (D0 на плате NodeMCU)
  // будет подключен к контакту RST:
  Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds");
             //  "Я проснулся, но перехожу 
             //   в режим глубокого сна на 30 секунд"
  ESP.deepSleep(30e6); 
  
  // Режим глубокого сна будет длиться, 
  // пока на контакт RST не будет подан сигнал «LOW»
  // (например, с помощью кнопки или геркона):
  //Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
               //  "Я проснулся, но перейду в режим глубокого сна,
               //   и буду там находиться,
               //   пока на контакт RST не будет подан сигнал «LOW»"
  //ESP.deepSleep(0); 
}

void loop() {
}

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

Обратите внимание, что время сна в методе deepSleep() указывается в микросекундах (мкс).

О модуле ESP-01

Если вы хотите собрать аналогичную цепь при помощи ESP-01, то вам нужно будет припаять провод как показано на схеме ниже, т.к. этот маленький контакт на чипе – это и есть GPIO16, и его нужно подключить к контакту RST.

Но эти контакты очень маленькие, и выполнить такую спайку будет довольно сложно...

Еще скетч

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

/*
 * Скетч-пример, демонстрирующий,
 * как перевести ESP8266 в режим глубокого сна.
 * Автор – Руи Сантос 
 * Более подробно о проекте на: http://randomnerdtutorials.com
 */
 
void setup() {
  Serial.begin(115200);
  Serial.setTimeout(2000);

  // Ждем инициализации последовательной коммуникации:
  while(!Serial) { }
  
  // Переводим ESP8266 в режим глубокого сна на 30 секунд;
  // ESP8266 будет пробуждать сама себя,
  // пока контакт GPIO16 (D0 на плате NodeMCU)
  // будет подключен к контакту RST:
  //Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds");
               //  "Я проснулся, но перехожу
               //   в режим глубокого сна на 30 секунд"
  //ESP.deepSleep(30e6); 
  
  // Режим глубокого сна будет длиться, 
  // пока на контакт RST будет подаваться сигнал «LOW»
  // (например, с помощью кнопки или геркона):
  Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
             //  "Я проснулся, но перейду в режим глубокого сна,
             //   и буду там находиться,
             //   пока на контакт RST не будет подан сигнал «LOW»"
  ESP.deepSleep(0); 
}

void loop() {
}

Как видите, параметром в методе deepSleep() в этот раз служит значение «0». Следовательно, ESP8266 будет пробуждаться только если что-то сбросит плату – это может быть, например, нажатие на кнопку, срабатывание геркона или что-то другое.

Вот так будет выглядеть вариант с кнопкой:

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

Измерение силы тока

Теперь давайте при помощи мультиметра измерим силу тока ESP8266 в режиме глубокого сна. На схеме ниже показано, в каких местах нужно разместить щупы мультиметра.

В режиме глубокого сна ESP-01 потребляет лишь 0.3 мА (300 мкА).

Теперь, когда я нажму на кнопку, ESP8266 выполнит запрограммированное действие – напечатает сообщение в монитор порта IDE Arduino – и через несколько миллисекунд перейдет в режим глубокого сна. При обычной эксплуатации с использованием WiFi модуль ESP8266 потребляет в диапазоне между 50 и 170 мА.

Итого

Итак, теперь вы знаете, как использовать режим глубокого сна, а следовательно – как сделать так, чтобы ваши батарейные ESP8266-проекты работали максимально долго.

См.также

Внешние ссылки