Мониторинг температуры и влажности через Интернет с помощью Arduino

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

Мониторинг температуры и влажности через Интернет с помощью Arduino: внешний вид проекта

Ранее на нашем сайте мы уже рассматривали измерение температуры и влажности с помощью Arduino, а в этом проекте мы рассмотрим мониторинг температуры и влажности через сеть Интернет с помощью Arduino и сервиса (сервера) ThingSpeak. В этом проекте мы будем использовать плату Arduino Uno, датчик DHT11, WiFi модуль ESP8266 и ЖК дисплей. Температура в градусах Цельсия и относительная влажность в процентах будут показываться на ЖК дисплее, а также передаваться на сервер ThingSpeak, на котором через сеть Интернет можно будет посмотреть эти значения из любой точки мира.

Внешний вид собранного устройства на Arduino для измерения температуры и влажности

Настройка ThingSpeak

Структурная схема работы нашего проекта представлена на следующем рисунке и она содержит 4 секции. Вначале с помощью датчика температуры и влажности DHT11 измеряются эти параметры атмосферы. Затем плата Arduino Uno считывает эти данные с DHT11 и преобразует их в нужную для нас форму, а затем она передает их на Wi-Fi модуль. После этого Wi-Fi модуль ESP8266 передает эти данные на сервер ThingSpeak. Затем сервис ThingSpeak анализирует эти данные и показывает их в удобной графической форме. Также дополнительно значения температуры и влажности показываются на экране ЖК дисплея.

Структурная схема нашего проекта

Сервис ThingSpeak представляет собой достаточно удобную платформу для реализации различных проектов тематики интернета вещей (IoT) на Arduino. С помощью сервиса ThingSpeak мы можем просматривать (контролировать) наши данные через сеть Интернет из любой точки мира, также с его помощью мы можем управлять нашими системами (устройствами) через интернет. ThingSpeak собирает данные от датчиков, анализирует и визуализирует эти данные, а затем реагирует на различные события, которые могут привести к изменению этих данных. В этой части статьи мы рассмотрим как передавать данные на сервер ThingSpeak с использованием Wi-Fi модуля ESP8266.

1. Вначале нам необходимо создать аккаунт на ThingSpeak.com, заходим туда, жмем Sign In, а потом Get Started.

Внешний вид сервиса ThingSpeak

2. Затем идем в пункт меню ‘Channels’ (каналы) и создаем новый канал с помощью кнопки New Channel.

Создание нового канала в ThingSpeak

3. После этого увидите форму для создания нового канала, заполните там поля Name (имя) и Description (описание) по своему усмотрению. Затем напишите ‘Humidity’ (влажность) и ‘Temperature’ (температура) в Field 1 (поле 1) и Field 2 (поле 2) и поставьте галочки в чек-боксах напротив этих полей. Также поставьте галочку в чек-боксе ‘Make Public’ (сделать общедоступным) в форме ниже и сохраните канал (Save the Channel). Теперь новый канал для вас создан.

Форма ввода данных для нового канала в ThingSpeak

4. Теперь откройте вкладку ‘API keys’ чтобы записать свои ключи с этой вкладки. Нам будет нужен только ключ для записи (Write key). Скопируйте этот ключ в переменную char *api_key в тексте программы (приведен в конце статьи).

Страница с ключами на ThingSpeak

5. После этого кликните на ‘Data Import/Export’ и скопируйте Update Channel Feed GET Request URL, который будет примерно вида https://api.thingspeak.com/update?api_key=SIWOYBX26OXQ1WMS&field1=0.

Страница для экспорта данных в ThingSpeak

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 собирает и извлекает эти данные в два приема: сначала извлекается влажность, а потом извлекается температура. Далее эти данные обрабатываются и передаются на ЖК дисплей 16×2 и сервер ThingSpeak. Сервис ThingSpeak отображает данные температуры и влажности в виде графиков, пример которых показан на следующем рисунке.

Пример отображения данных температуры и влажности в сервисе ThingSpeak

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема устройства для мониторинга температуры и влажности через Интернет с помощью Arduino

ЖК дисплей на представленной схеме подключен к плате 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);
}

Далее представлен полный текст программы.

#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");
}
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
32 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *