В настоящее время сфера интернета вещей (IoT) развивается семимильными шагами и количество устройств IoT увеличивается в экспоненциальной прогрессии. Единственной проблемой, которая немного замедляет быстрый рост количества подобных устройств, является их энергопотребление. Поскольку чем больше устройств мы используем, тем больше их суммарное энергопотребление. В связи с этим остро встает проблема их энергосбережения.
В данной статье мы рассмотрим использование энергосберегающих режимов в модуле ESP8266. С помощью него мы будем загружать данные температуры, считываемые с датчика LM35, на сервер ThingSpeak с 15-секундным интервалом и в течение этих 15-секундных интервалов модуль ESP8266 будет находиться в режиме глубокого сна (DeepSleep mode) для сбережения электроэнергии.
Также на нашем сайте вы можете посмотреть все проекты, в которых использовался сервис ThingSpeak.
Методы минимизации энергопотребления
Существует несколько методов оптимизации энергопотребления во встраиваемых системах и устройствах интернета вещей. Эта оптимизация может быть осуществлена программным или аппаратным способом. Иногда методы аппаратной оптимизации энергопотребления могут быть нам недоступны, но методы программной оптимизации энергопотребления можно использовать практически всегда. Еще один способ уменьшения энергопотребления – это уменьшение тактовой частоты работы используемых устройств.
Мы можем написать прошивку (программное обеспечение) для микроконтроллера, которая будет автоматически переводить его в спящий режим когда он не выполняет никаких задач. В спящем режиме энергопотребление микроконтроллера значительно уменьшится и поэтому от батарейки он сможет работать гораздо дольше чем обычно.
Модули ESP8266 находят широкое применение в различных проектах из сферы интернета вещей и в них имеется поддержка спящих режимов, использовать которые можно при внесении небольших модификаций в аппаратное и программное обеспечение проекта.
В данной статье мы рассмотрим различные спящие режимы, доступные в модуле ESP8266 и продемонстрируем их использование на примере передачи данных температуры на сервер Thingspeak через регулярные интервалы времени, между которыми модуль ESP8266 будет находиться в режиме глубокого сна (deep sleep mode).
Также на нашем сайте вы можете посмотреть статью про использование спящих режимов в плате Arduino.
Необходимые компоненты
- Модуль NodeMCU ESP8266 (купить на AliExpress).
- Датчик температуры LM35 (купить на AliExpress).
- Соединительные провода.
Типы спящих режимов в модуле ESP8266
Модуль ESP8266 может работать в следующих режимах:
1. Активный режим (Active mode): в этом режиме на весь модуль подается питание, модуль может передавать и принимать данные. Очевидно, что в этом режиме энергопотребление модуля максимально.
2. Режим спящего модема (Modem-sleep mode): в этом режиме центральный процессор модуля находится во включенном состоянии, а приемопередатчик Wi-Fi отключен. Данный режим может быть использован в приложениях, которым необходима только деятельность процессора модуля, например, для управления какими либо устройствами с помощью ШИМ (широтно-импульсной модуляции).
3. Режим легкого сна (Light-sleep mode): в этом режиме процессор и все периферийные устройства модуля поставлены на паузу. «Разбудить» чип из этого режима может внешнее прерывание. Если отсутствует передача данных, то Wi-Fi модем может быть выключен, а процессор приостановлен.
4. Режим глубокого сна (Deep-sleep mode): в этом режиме у модуля функционируют только часы реального времени (Real-Time Clock, RTC), все остальные компоненты модуля выключены. Этот режим полезен когда передачу данных необходимо осуществлять через продолжительные интервалы времени, а в течение этих интервалов больше никаких действий делать не нужно.
Технические характеристики модуля ESP8266 в рассмотренных спящих режимах представлены в следующей таблице.
Режим глубокого сна в модуле ESP8266
Режим спящего модема (Modem-sleep mode) и режим легкого сна (Light-sleep mode) будут полезны когда вы хотите чтобы некоторые компоненты модуля были отключены, а другие продолжали функционировать. Но если вам необходим «серьезный» контроль над энергопотреблением модуля, то в этом случае вам подойдет режим глубокого сна (Deep-sleep mode). В этом режиме общее потребление тока модулем меньше чем 1mA. А при питающем напряжении 2.5V потребление тока вообще ограничено величиной 20 μA.
Для использования режима глубокого сна в модуле ESP8266 необходимо выполнить следующие действия:
- Подключите модуль к точке доступа Wi-Fi.
- Начните выполнять какую-нибудь задачу, например, считывание значений с датчика, передача MQTT сообщений и т.п.
- Переведите модуль в режим сна на определенное число микросекунд.
- Повторите описанный процесс снова.
Время сна для модуля задается в микросекундах. В соответствии с ESP8266 SDK максимальное время, на которое вы можете погрузить модуль в сон, составляет 4,294,967,295 µs, что равно примерно 71 минуте.
Схема проекта
Схема для тестирования режима глубокого сна в модуле ESP8266 представлена на следующем рисунке.
Датчик температуры LM35 подключите к контакту A0 NodeMCU.
Когда у модуля ESP8266 будет уровень HIGH на контакте RST, он будет в рабочем состоянии. Как только на его контакте RST будет появляться уровень LOW, модуль ESP8266 будет перезагружаться.
Для использования режима глубокого сна мы будем устанавливать таймер, как только таймер будет заканчивать счет, контакт D0 будет передавать сигнал LOW на контакт RST, в результате чего модуль будет просыпаться ото сна в результате перезагрузки.
Данные температуры мы будем передавать на сервер Thingspeak. Для этого вам необходимо создать себе аккаунт на thingspeak.com и создать в нем канал, на который мы будем передавать данные. Достаточно подробно про эти операции вы можете прочитать в статье про мониторинг температуры и влажности через Интернет с помощью Arduino.
Далее со своего аккаунта в сервисе Thingspeak вам необходимо будет скопировать свой API ключ (API key) – далее он нам пригодится при написании программы для модуля ESP8266.
Объяснение программы для модуля ESP8266
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Программировать модуль ESP8266 мы будем с помощью Arduino IDE – убедитесь в том, что в ней установлены все файлы для работы с платами ESP8266.
Первым делом в программе нам необходимо подключить используемые библиотеки.
1 |
#include <ESP8266WiFi.h> |
Далее в программе нам необходимо указать свой API ключ с сервиса Thingspeak, имя своей Wi-Fi сети и пароль для доступа к ней. После этого необходимо объявить все переменные, которые будут использованы нами для хранения данных.
1 2 3 |
String apiWritekey = "*************"; // replace with your THINGSPEAK WRITEAPI key here char ssid[] = "******"; // your wifi SSID name char password[] = "******" ;// wifi pasword |
Затем запрограммируем функцию для подключения модуля к сети Wi-Fi, используя внутри нее функцию wifi.begin(). Далее в цикле мы будем проверять условие соединения модуля с сетью Wi-Fi.
1 2 3 4 5 |
void connect1() { WiFi.disconnect(); delay(10); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { |
Также запрограммируем функцию для передачи данных на сервер thingspeak. Передаваемая на сервер строка будет содержать API ключ, имена полей и данные для передачи. Передавать эту строку на сервер thingspeak мы будем с помощью функции client.print().
1 2 3 4 5 6 7 8 9 |
void data() { if (client.connect(server,80)) { String tsData = apiWritekey; tsData +="&field1="; tsData += String(tempF); tsData += "\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); |
Далее внутри функции void setup() мы будем вызывать функцию connect1() для подключения модуля к сети Wi-Fi, после этого мы начнем считывание температуры с датчика LM35 и преобразование ее в градусы Цельсия.
1 2 3 4 5 6 7 |
void setup() { Serial.begin(115200); Serial.println("device is in Wake up mode"); connect1(); int value = analogRead(A0); float volts=(value/1024.0)*5.0; tempC = volts*100.0; |
Далее мы будем вызывать функцию data() для передачи данных в облако thingspeak. Затем мы будем использовать такую важную для нашего проекта функцию как ESP.deepSleep(), в результате выполнения которой модуль будет переходить в режим сна на интервал времени, заданный в микросекундах в качестве параметра функции.
1 2 3 |
data(); Serial.println("deep sleep for 15 seconds"); ESP.deepSleep(15e6); |
Функция Loop будет оставаться пустой поскольку все задачи в нашем проекте будут выполняться один раз и затем модуль будет перезагружаться через заданный интервал времени.
Тестирование работы проекта
Загрузите код программы в модуль ESP8266. Перед загрузкой программы устраните (удалите) соединение между контактами RST и D0, иначе будет выдаваться ошибка.
После загрузки программы в модуль ESP8266 вы увидите что значения температуры будут передаваться в облако ThingSpeak каждые 15 секунд и затем модуль будет переходить в режим глубокого сна.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
// esp8266 deepsleep #include <ESP8266WiFi.h> String apiWritekey = "*************"; char ssid[] = "XXXXXXXXXX"; // enter your wifi home router ssid (идентификатор вашей сети wifi) char password[] = "XXXXXXXXXX" ; // enter your wifi home router ssid (пароль вашей сети wifi) char server[] = "api.thingspeak.com"; double tempF; double tempC; WiFiClient client; void connect1() { WiFi.disconnect(); delay(10); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("NodeMcu connected to wifi..."); } void data() { if (client.connect(server,80)) { String Data = apiWritekey; Data +="&field1="; Data += String(tempF); Data += "\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: "+apiWritekey+"\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(Data.length()); client.print("\n\n"); client.print(Data); Serial.println("uploaded to Thingspeak server...."); } client.stop(); } void setup() { Serial.begin(115200); Serial.println("device is in Wake up mode"); while (!Serial) { } connect1(); int value = analogRead(A0); float volts=(value/1024.0)*5.0; //conversion to volts (переводим в вольты) tempC = volts*100.0; //conversion to temp Celsius (переводим в градусы Цельсия) Serial.print("Temperature C: "); Serial.println(tempC); data(); Serial.println("deep sleep for 15 seconds"); ESP.deepSleep(15e6); } void loop() { } |