ESP8266:Примеры/Выполнение ежедневной задачи с помощью ESP8266

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Выполнение ежедневной задачи с помощью ESP8266

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

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

Подготовка IDE Arduino

Собрав цепь, откройте IDE Arduino и установите в нее две библиотеки.

Для этого сначала кликните в IDE Arduino на «Скетч» > «Подключить библиотеку» > «Управлять библиотеками...» (Sketch > Include Library > Manage Libraries...).

Вбейте в поиске «dht», а затем нажмите на «Установка» (Install). Эту библиотеку также можно загрузить вручную отсюда.

Esp8266 lib dht adafruit 1.PNG

Далее нам нужно будет установить библиотеку «ESPDailyTask». Для этого проделайте следующее:

  1. Кликните тут, чтобы скачать ZIP-архив библиотеки. Он должен загрузиться в папку «Загрузки»;
  2. Распакуйте его. У вас должна получиться папка «ESPDailyTask-master»;
  3. Переименуйте ее на «ESPDailyTask»;
  4. Переместите эту папку в папку «libraries» (туда устанавливаются библиотеки IDE Arduino), которая находится внутри папки, куда установлена IDE Arduino;
  5. Наконец, перезапустите IDE Arduino;

Thing Speak

В этом проекте мы воспользуемся сервисом ThingSpeak.com. Он позволяет публиковать данные от датчиков на их вебсайт и выводить на график, помечая датой/временем. Это позволяет получить доступ к своим данным из любой точки мира.

Esp8266 thingspeak main page 1.PNG

Стоит добавить, что это легко модифицируемый проект, и его можно настроить так, чтобы данные вместо Thing Speak публиковались в IoT-хабе или любой другой системе. Главное, что я хочу показать в этом проекте – это то, как постоянно переводить ESP8266 в режим глубокого сна, публикуя данные каждые 24 часа.

Создаем новый канал

Нет аккаунта в Thing Speak? Создайте его. Затем залогиньтесь и откройте вкладку Channels.

Далее нажмите на кнопку New Channel:

Esp8266 thingspeak new channel 1.PNG

Задайте название и описание для своего канала, а также включите поле 2. Поле 1 будет получать данные о влажности (Humidity), а поле 2 – данные о температуре (Temperature). Заполнив поля, сохраните канал.

Esp8266 thingspeak new channel edit 1.PNG

Настраиваем график

Чтобы настроить график нужным образом, перейдите на вкладку Private View и нажмите на кнопку редактирования (она изображена в виде карандаша):

Esp8266 thingspeak new channel edit chart 1.PNG

Название графика задается в поле «Title». К примеру, первый график будет называться «Humidity %», а второй – «Temperature ˚C».

Esp8266 thingspeak new channel edit chart field 1 options 1.PNG

Вы также можете настроить фоновый цвет, оси X и Y и многое другое (см. скриншот ниже). Закончив, нажмите на кнопку Save.

Esp8266 thingspeak new channel edit chart field 2 options 1.PNG

API-ключ для записи (Write API Key)

Для публикации значений при помощи ESP8266 нам понадобится API-ключ для записи (Write API Key). Откройте вкладку API Keys и скопируйте в какое-нибудь безопасное место строчку из поля Key. Скоро она нам понадобится.

Esp8266 thingspeak api key to write data 1.PNG

Подготавливаем код

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

1 // Вставьте здесь SSID и пароль для своей WiFi-сети:
2 const char* ssid     = "ВСТАВЬТЕ_СЮДА_СВОЙ_SSID";
3 const char* password = "ВСТАВЬТЕ_СЮДА_СВОЙ_ПАРОЛЬ";

В строчке ниже нужно вписать API-ключ для записи данных (Write API Key) в Thing Speak:

1 // Вставьте здесь API-ключ для записи (Write API Key) Thing Speak:
2 const char* apiKey = "ВАШ_API_КЛЮЧ_ThingSpeak";

Как работает этот код

Теперь давайте взглянем на этот код поближе. Блок setup() начинается с инициализации последовательной коммуникации.

1 void setup() {
2   // Инициализируем последовательную коммуникацию (для отладки): 
3   Serial.begin(115200);
4   delay(10);

После этого вызываем метод sleep1Day(), чтобы определить, прошло ли 24 часа с того момента, когда данные были считаны в последний раз. Если не прошло, ESP8266 вернется в режим глубокого сна.

dailyTask.sleep1Day();

Но если эти 24 часа все же прошли, код продолжит работать дальше. В нем будет инициализирован датчик DHT, будет выполнено подключение к WiFi-роутеру и сделан HTTP-запрос GET к Thing Speak для публикации этих данных.

1   // Ниже пишем код, который раз в день
2   // будет выполняться при запуске ESP8266:
3   dht.begin();
4   initWifi();
5   makeHTTPRequest();

Опубликовав данные, ESP8266 вернется в режим глубокого сна.

1   // После этого переходим в режим глубокого сна: 
2   dailyTask.backToSleep();
3 }

В блоке loop() ничего выполняться не будет, т.к. ESP8266 будет постоянно переходить в режим сна, просто не добираясь до loop().

1 void loop() {
2   // ESP8266 «заснет» и не доберется до блока loop():
3 }

Дополнительное редактирование кода – смена датчика и переключение на Фаренгейты

Если вы используете не DHT11, а другой датчик, то выбрать его можно, раскомментировав правильную строчку и закомментировав все остальные во фрагменте ниже:

1 // Раскомментируйте строчку, соответствующую типу вашего датчика:
2 #define DHTTYPE DHT11   // DHT 11
3 //#define DHTTYPE DHT21   // DHT 21 (AM2301)
4 //#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

Есть еще одна важная вещь, которую можно поменять в этом скетче. По умолчанию он публикует температуру в градусах Цельсия, но если закомментировать строчку, помеченную во фрагменте ниже красным цветом, и раскомментировать строчку, помеченную во фрагменте ниже зеленым цветом, скетч начнет публиковать данные в градусах Фаренгейта.

1 // Рассчитываем температуру в Цельсиях и Фаренгейтах и влажность: 
2 float hic = dht.computeHeatIndex(t, h, false); 
3 // Закомментируйте строчку ниже, если предпочитаете Фаренгейты: 
4 dtostrf(hic, 6, 2, temperatureTemp);
5                  
6 float hif = dht.computeHeatIndex(f, h);
7 // Раскомментируйте строчку ниже, если предпочитаете Фаренгейты: 
8 //dtostrf(hif, 6, 2, temperatureTemp);

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

Проверяем проект

Наконец, открываем монитор порта IDE Arduino на скорости 115200 бод. При помощи небольшой хитрости мы можем сделать так, чтобы 24 часа для ESP8266 прошли за несколько секунд. Отключите провод между контактами RESET и D0 (GPIO16), а затем нажмите на кнопку RESET. Одно нажатие на нее имитирует один час.

Таким образом, чтобы сымитировать сутки, вам нужно нажать на эту кнопку 24 раза. Каждое нажатие на кнопку увеличивает значение в параметре «counter» («счетчик», см. ниже) на единицу. Если нажать на кнопку сброса 24 раза, это запустит публикацию данных в Thing Speak.

Esp8266 thingspeak chart test com port 1.PNG

Как видите, данные о температуре и влажности были успешно опубликованы и в режиме реального времени показаны на графике.

Esp8266 thingspeak chart test 1.PNG

Протестировав цепь, снова подключите провод между контактами RESET и D0. ESP8266 будет просыпаться каждый час, но новые данные опубликует только когда пройдет 24 часа. Надеюсь, этот проект был для вас полезен. Теперь вы должны понимать, как запрограммировать ESP8266 на выполнение ежедневной задачи.

Схема

Esp8266 dht11 deep sleep thingspeek 1.png

Код

  1 /*
  2  * Выполнение ежедневной задачи с помощью ESP8266
  3  * Автор – Руи Сантос 
  4  * Более подробно о проекте на: http://randomnerdtutorials.com
  5  */
  6  
  7 #include <ESP8266WiFi.h>
  8 #include <ESPDailyTask.h>
  9 #include "DHT.h"
 10 
 11 // Раскомментируйте строчку, соответствующую типу вашего датчика:
 12 #define DHTTYPE DHT11   // DHT 11
 13 //#define DHTTYPE DHT21   // DHT 21 (AM2301)
 14 //#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
 15 
 16 // Вставьте здесь SSID и пароль для своей WiFi-сети:
 17 const char* ssid     = "ВСТАВЬТЕ_СЮДА_СВОЙ_SSID";
 18 const char* password = "ВСТАВЬТЕ_СЮДА_СВОЙ_ПАРОЛЬ";
 19 
 20 // Вставьте здесь API-ключ для записи (Write API Key) Thing Speak:
 21 const char* apiKey = "ВАШ_API_КЛЮЧ_ThingSpeak";
 22 
 23 const char* resource = "/update?api_key=";
 24 
 25 // Сервер API Thing Speak:
 26 const char* server = "api.thingspeak.com";
 27 
 28 // Задайте здесь, в какое время должен запускаться ваш код: 
 29 ESPDailyTask dailyTask(11*60 + 15); // 11:15am
 30 
 31 // Контакт, к которому подключен датчик DHT:
 32 const int DHTPin = 5;
 33 // Инициализируем датчик DHT:
 34 DHT dht(DHTPin, DHTTYPE);
 35 
 36 // Временные переменные:
 37 static char temperatureTemp[7];
 38 static char humidityTemp[7];
 39 
 40 void setup() {
 41   // Инициализируем последовательную коммуникацию (для отладки): 
 42   Serial.begin(115200);
 43   delay(10);
 44   
 45   dailyTask.sleep1Day();
 46   
 47   // Ниже пишем код, который раз в день
 48   // будет выполняться при запуске ESP8266:
 49   dht.begin();
 50   initWifi();
 51   makeHTTPRequest();
 52 
 53   // После выполнения ежедневного кода
 54   // переходим в режим глубокого сна: 
 55   dailyTask.backToSleep();
 56 }
 57 
 58 void loop() {
 59   // ESP8266 «заснет» и не доберется до блока loop():
 60 }
 61 
 62 // Функция, устанавливающая WiFi-коммуникацию с роутером:
 63 void initWifi() {
 64   Serial.print("Connecting to: ");  // "Подключаемся к: "
 65   Serial.print(ssid);
 66   WiFi.begin(ssid, password);  
 67 
 68   int timeout = 10 * 4; // 10 секунд
 69   while(WiFi.status() != WL_CONNECTED  && (timeout-- > 0)) {
 70     delay(250);
 71     Serial.print(".");
 72   }
 73   Serial.println("");
 74 
 75   if(WiFi.status() != WL_CONNECTED) {
 76      Serial.println("Failed to connect, going back to sleep");
 77                 //  "Подключиться не удалось,
 78                 //  возвращаемся в режим сна"
 79   }
 80 
 81   Serial.print("WiFi connected in: ");
 82            //  "Время подключения к WiFi: "
 83   Serial.print(millis());
 84   Serial.print(", IP address: ");  //  ", IP-адрес: "
 85   Serial.println(WiFi.localIP());
 86 }
 87 
 88 // Функция для выполнения HTTP-запроса к Thing Speak:
 89 void makeHTTPRequest() {
 90   // Данные от датчика могут запаздывать на 2 секунды
 91   // (это очень медленный датчик):
 92   float h = dht.readHumidity();
 93   // Считываем температуру в градусах Цельсия (по умолчанию):
 94   float t = dht.readTemperature();
 95   // Считываем температуру в градусах Фаренгейта
 96   // (isFahrenheit = true):
 97   float f = dht.readTemperature(true);
 98   // Проверяем, удалось ли прочесть данные,
 99   // и если нет, то выходим (чтобы попробовать снова):
100   if (isnan(h) || isnan(t) || isnan(f)) {
101     Serial.println("Failed to read from DHT sensor!");
102                //  "Не удалось прочесть данные с датчика DHT!"
103     strcpy(temperatureTemp,"Failed");
104     strcpy(humidityTemp, "Failed");
105     return;    
106   }
107   else {
108     // Рассчитываем температуру в Цельсиях и Фаренгейтах и влажность: 
109     float hic = dht.computeHeatIndex(t, h, false); 
110     // Закомментируйте строчку ниже, если предпочитаете Фаренгейты: 
111     dtostrf(hic, 6, 2, temperatureTemp);
112                  
113     float hif = dht.computeHeatIndex(f, h);
114     // Раскомментируйте строчку ниже, если предпочитаете Фаренгейты: 
115     //dtostrf(hif, 6, 2, temperatureTemp);   
116           
117     dtostrf(h, 6, 2, humidityTemp);
118     // Методы Serial.print() ниже можно удалить,
119     // т.к. они нужно исключительно для отладки:
120     Serial.print("Humidity: ");  //  "Влажность: "
121     Serial.print(h);
122     Serial.print(" %\t Temperature: ");  //  " Температура: "
123     Serial.print(t);
124     Serial.print(" *C ");
125     Serial.print(f);
126     Serial.print(" *F\t Heat index: ");  //  " Тепловой индекс: "
127     Serial.print(hic);
128     Serial.print(" *C ");
129     Serial.print(hif);
130     Serial.print(" *F");
131     Serial.print("Humidity: ");  //  "Влажность: "
132     Serial.print(h);
133     Serial.print(" %\t Temperature: ");  //  " Температура: "
134     Serial.print(t);
135     Serial.print(" *C ");
136     Serial.print(f);
137     Serial.print(" *F\t Heat index: ");  //  " Тепловой индекс: "
138     Serial.print(hic);
139     Serial.print(" *C ");
140     Serial.print(hif);
141     Serial.println(" *F");
142   }
143   
144   Serial.print("Connecting to ");  //  "Подключаемся к "
145   Serial.print(server);
146   
147   WiFiClient client;
148   int retries = 5;
149   while(!!!client.connect(server, 80) && (retries-- > 0)) {
150     Serial.print(".");
151   }
152   Serial.println();
153   if(!!!client.connected()) {
154      Serial.println("Failed to connect, going back to sleep");
155                 //  "Подключиться не удалось,
156                 //  Возвращаемся в режим сна"
157   }
158   
159   Serial.print("Request resource: ");  //  "Ресурс запроса: "
160   Serial.println(resource);
161   client.print(String("GET ") + resource + apiKey + "&field1=" + humidityTemp + "&field2=" + temperatureTemp +
162                   " HTTP/1.1\r\n" +
163                   "Host: " + server + "\r\n" + 
164                   "Connection: close\r\n\r\n");
165                   
166   int timeout = 5 * 10; // 5 секунд             
167   while(!!!client.available() && (timeout-- > 0)){
168     delay(100);
169   }
170   if(!!!client.available()) {
171      Serial.println("No response, going back to sleep");
172                 //  "Нет ответа, возвращаемся в режим глубокого сна"
173   }
174   while(client.available()){
175     Serial.write(client.read());
176   }
177   
178   Serial.println("\nclosing connection");  
179              //  " отключаем соединение"
180   client.stop();
181 }

См.также

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