Измерение температуры и влажности регулярно производится во многих современных учреждениях: фермы, офисы, медицинские учреждения, промышленные склады и т.д. В связи с этим контроль (мониторинг) этих параметров является востребованной задачей, реализованной во многих электронных устройствах.
Ранее на нашем сайте мы уже рассматривали измерение температуры и влажности с помощью Arduino, а в этом проекте мы рассмотрим мониторинг температуры и влажности через сеть Интернет с помощью Arduino и сервиса (сервера) ThingSpeak. В этом проекте мы будем использовать плату Arduino Uno, датчик DHT11, WiFi модуль ESP8266 и ЖК дисплей. Температура в градусах Цельсия и относительная влажность в процентах будут показываться на ЖК дисплее, а также передаваться на сервер ThingSpeak, на котором через сеть Интернет можно будет посмотреть эти значения из любой точки мира.
Настройка ThingSpeak
Структурная схема работы нашего проекта представлена на следующем рисунке и она содержит 4 секции. Вначале с помощью датчика температуры и влажности DHT11 измеряются эти параметры атмосферы. Затем плата Arduino Uno считывает эти данные с DHT11 и преобразует их в нужную для нас форму, а затем она передает их на Wi-Fi модуль. После этого Wi-Fi модуль ESP8266 передает эти данные на сервер ThingSpeak. Затем сервис ThingSpeak анализирует эти данные и показывает их в удобной графической форме. Также дополнительно значения температуры и влажности показываются на экране ЖК дисплея.
Сервис ThingSpeak представляет собой достаточно удобную платформу для реализации различных проектов тематики интернета вещей (IoT) на Arduino. С помощью сервиса ThingSpeak мы можем просматривать (контролировать) наши данные через сеть Интернет из любой точки мира, также с его помощью мы можем управлять нашими системами (устройствами) через интернет. ThingSpeak собирает данные от датчиков, анализирует и визуализирует эти данные, а затем реагирует на различные события, которые могут привести к изменению этих данных. В этой части статьи мы рассмотрим как передавать данные на сервер ThingSpeak с использованием Wi-Fi модуля ESP8266 (купить на AliExpress).
1. Вначале нам необходимо создать аккаунт на ThingSpeak.com, заходим туда, жмем Sign In, а потом Get Started.
2. Затем идем в пункт меню ‘Channels’ (каналы) и создаем новый канал с помощью кнопки New Channel.
3. После этого увидите форму для создания нового канала, заполните там поля Name (имя) и Description (описание) по своему усмотрению. Затем напишите ‘Humidity’ (влажность) и ‘Temperature’ (температура) в Field 1 (поле 1) и Field 2 (поле 2) и поставьте галочки в чек-боксах напротив этих полей. Также поставьте галочку в чек-боксе ‘Make Public’ (сделать общедоступным) в форме ниже и сохраните канал (Save the Channel). Теперь новый канал для вас создан.
4. Теперь откройте вкладку ‘API keys’ чтобы записать свои ключи с этой вкладки. Нам будет нужен только ключ для записи (Write key). Скопируйте этот ключ в переменную char *api_key в тексте программы (приведен в конце статьи).
5. После этого кликните на ‘Data Import/Export’ и скопируйте Update Channel Feed GET Request URL, который будет примерно вида https://api.thingspeak.com/update?api_key=SIWOYBX26OXQ1WMS&field1=0.
6. Теперь необходимо открыть api.thingspeak.com используя функцию httpGet с postUrl в виде “update?api_key=SIWOYBX26OXQ1WMS&field1=0” и затем передать данные используя адрес обновления запроса.
Перед передачей данных необходимо отредактировать строку запроса или postUrl с полями данных температуры и влажности как показано в программном коде ниже. Здесь мы добавили в строку оба параметра, которые нам необходимо передать используя GET запрос к серверу, после этого необходимо использовать httpGet чтобы передать данные на сервер. Более подробно все эти процессы представлены в полном тексте программы, представленном в конце статьи.
sprintf(postUrl, "update?api_key=%s&field1=%s&field2=%s",api_key,humidStr,tempStr);
httpGet("api.thingspeak.com", postUrl, 80);
В рассматриваемом проекте плата Arduino передает сигнал старта (после которого начинаются измерения) на датчик DHT, а в ответ датчик DHT передает Arduino сигнал, содержащий необходимые данные измерений. Плата Arduino собирает и извлекает эти данные в два приема: сначала извлекается влажность, а потом извлекается температура. Далее эти данные обрабатываются и передаются на ЖК дисплей 16x2 и сервер ThingSpeak. Сервис ThingSpeak отображает данные температуры и влажности в виде графиков, пример которых показан на следующем рисунке.
Работа схемы
Схема устройства представлена на следующем рисунке.
ЖК дисплей на представленной схеме подключен к плате Arduino в 4-битном режиме. Контакты ЖК дисплея RS, EN, D4, D5, D6 и D7 подсоединены к цифровым контактам Arduino с номерами 14, 15, 16, 17, 18 и 19. Использование ЖК дисплея в данном проекте опционально – можно обойтись и без него.
Датчик DHT11 подсоединен к цифровому контакту 12 платы Arduino. Контакты Vcc и GND модуля ESP8266 подключены к контактам 3.3V и GND платы Arduino, контакт CH_PD также подсоединен к 3.3V. Контакты Tx и Rx модуля ESP8266 непосредственно подсоединены к контактам 2 и 3 платы Arduino. Библиотека последовательной связи (Software Serial Library) используется чтобы осуществлять последовательную связь на контактах 2 и 3 Arduino. Также об использовании Wi-Fi модуля ESP8266 совместно с Arduino можно прочитать в статье про передачу Email с помощью Arduino и модуля ESP8266.
Исходный код программы
В программе мы первым делом должны подключить необходимые библиотеки и инициализировать необходимые переменные.
#include"dht.h" // подключение библиотеки для работы с датчиком dht
#include<LiquidCrystal.h> // библиотека для работы с ЖК дисплеем
LiquidCrystal lcd(14,15,16,17,18,19);
#include<Timer.h>
Timer t;
#include <SoftwareSerial.h> // библиотека последовательной связи
SoftwareSerial Serial1(2, 3); // передача и прием последовательных данных будет производиться на контактах 2 и 3
После этого необходимо записать ваш API key и инициализировать некоторые строки (строковые переменые).
char *api_key="SIWOYBX26OXQ1WMS"; // запишите здесь ваш API key с сервиса ThingSpeak
static char postUrl[150];
int humi,tem;
void httpGet(String ip, String path, int port=80);
В функции void loop() мы будем считывать значения температуры и влажности и затем показывать их на ЖК дисплее.
Функция void send2server() используется для передачи данных на сервер. Функция Send2server представляет собой подпрограмму обработки прерывания от таймера, вызываемую каждые 20 секунд. Когда мы будем вызывать функцию обновления (update function), подпрограмма обработки прерывания от таймера будет вызываться.
void send2server()
{
char tempStr[8];
char humidStr[8];
dtostrf(tem, 5, 3, tempStr);
dtostrf(humi, 5, 3, humidStr);
sprintf(postUrl, "update?api_key=%s&field1=%s&field2=%s",api_key,humidStr,tempStr);
httpGet("api.thingspeak.com", postUrl, 80);
}
Далее представлен полный текст программы.
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
#include"dht.h" // подключение библиотеки для работы с датчиком dht #include<LiquidCrystal.h> LiquidCrystal lcd(14,15,16,17,18,19); #include<Timer.h> Timer t; #include <SoftwareSerial.h> // библиотека последовательной связи SoftwareSerial Serial1(2, 3); #define dht_dpin 12 #define heart 13 dht DHT; char *api_key="SIWOYBX26OXQ1WMS"; // запишите здесь ваш API key с сервиса ThingSpeak static char postUrl[150]; int humi,tem; void httpGet(String ip, String path, int port=80); void setup() { lcd.begin(16, 2); lcd.clear(); lcd.print(" Humidity "); lcd.setCursor(0,1); lcd.print(" Measurement "); delay(2000); lcd.clear(); lcd.print("Circuit Digest "); lcd.setCursor(0,1); lcd.print("Welcomes You"); delay(2000); Serial1.begin(9600); Serial.begin(9600); lcd.clear(); lcd.print("WIFI Connecting"); lcd.setCursor(0,1); lcd.print("Please wait...."); Serial.println("Connecting Wifi...."); connect_wifi("AT",1000); connect_wifi("AT+CWMODE=1",1000); connect_wifi("AT+CWQAP",1000); connect_wifi("AT+RST",5000); connect_wifi("AT+CWJAP=\"1st floor\",\"muda1884\"",10000); // имя пользователя и пароль для вашего Wifi соединения Serial.println("Wifi Connected"); lcd.clear(); lcd.print("WIFI Connected."); pinMode(heart, OUTPUT); delay(2000); t.oscillate(heart, 1000, LOW); t.every(20000, send2server); } void loop() { DHT.read11(dht_dpin); lcd.setCursor(0,0); lcd.print("Humidity: "); humi=DHT.humidity; lcd.print(humi); // printing Humidity on LCD lcd.print(" % "); lcd.setCursor(0,1); lcd.print("Temperature:"); tem=DHT.temperature; lcd.print(tem); // Printing temperature on LCD lcd.write(1); lcd.print("C "); delay(1000); t.update(); } void send2server() { char tempStr[8]; char humidStr[8]; dtostrf(tem, 5, 3, tempStr); dtostrf(humi, 5, 3, humidStr); sprintf(postUrl, "update?api_key=%s&field1=%s&field2=%s",api_key,humidStr,tempStr); httpGet("api.thingspeak.com", postUrl, 80); } //GET https://api.thingspeak.com/update?api_key=SIWOYBX26OXQ1WMS&field1=0 void httpGet(String ip, String path, int port) { int resp; String atHttpGetCmd = "GET /"+path+" HTTP/1.0\r\n\r\n"; //AT+CIPSTART="TCP","192.168.20.200",80 String atTcpPortConnectCmd = "AT+CIPSTART=\"TCP\",\""+ip+"\","+port+""; connect_wifi(atTcpPortConnectCmd,1000); int len = atHttpGetCmd.length(); String atSendCmd = "AT+CIPSEND="; atSendCmd+=len; connect_wifi(atSendCmd,1000); connect_wifi(atHttpGetCmd,1000); } void connect_wifi(String cmd, int t) { int temp=0,i=0; while(1) { lcd.clear(); lcd.print(cmd); Serial.println(cmd); Serial1.println(cmd); while(Serial1.available()) { if(Serial1.find("OK")) i=8; } delay(t); if(i>5) break; i++; } if(i==8) { Serial.println("OK"); lcd.setCursor(0,1); lcd.print("OK"); } else { Serial.println("Error"); lcd.setCursor(0,1); lcd.print("Error"); } } |