Цель этого проекта состоит в том, чтобы собрать устройство мониторинга температуры и влажности, которое транслирует температуру и влажность на удаленный сервер посредством wi-fi. Нам понадобятся Ардуино Уно (или аналог), датчик температуры и влажности DHT11, wi-fi чип ESP8266 и «ThingSpeak.com» для этого проекта. Это — замечательный проект, чтобы задействовать ESP8266 для записи исходных данных, так что начнем!
Шаг 1: Соберите детали
Для этого проекта использован Ардуино Уно, но подойдёт любая плата Ардуино или аналоги.
- Ардуино Уно
- USB — кабель типа А — B и 5-вольтовый источник питания USB
- Беспроводной приемопередатчик ESP8266. В принципе подойдет любой, просто удостоверьтесь, что Вы знаете, где какие клеммы
- Датчик температуры/влажности DHT11, хотя DHT22 тоже подойдет
- Макетная плата (не требующая пайки)
- Кроссовые провода
- Резисторы
Шаг 2: Создадите канал ThingSpeak
Чтобы фиксировать температуру и влажность онлайн, у Вас должны быть веб-сайт или веб-сервис, которые могут принимать команды метода GET http. В этом обзоре мы рекомендуем ThingSpeak, но есть и другие службы, так что Вы вполне можете использовать что-то еще, чтобы забивать Ваши данные. Чтобы создать учетную запись ThingSpeak, можно зайти сюда.
Если Вы будете использовать ThingSpeak, то Вы должны будете создать канал с двумя полями, один для температуры и один для влажности. На сайте есть много опций для отображения данных в графиках, так что можете изучить их самостоятельно и выбрать те, что Вам больше всего понравятся. Мы остановились на двух простых линейных диаграммах с 10 точками переменных, чтобы сгладить случайные колебания данных . ThingSpeak даст ключ для Вашего канала, который Вы должны будете вписать в код, после чего Ваш канал примет данные.
Шаг 3: Подключение
Сначала мы должны разобраться с ESP8266 и DHT11. После чего мы подсоединим их к контроллеру
На картинке Вы можете увидеть переднюю часть ESP8266 с 8 маркированными контактами. ESP8266 питается от 3.3 В, так что удостоверьтесь, что Вы соединяете контакт Vcc с 3.3-вольтовым контактом на контроллере. Это также означает, что Вы должны будете использовать преобразователь логических уровней или собрать делитель напряжения для последовательного соединения от платы контроллера до ESP8266, чтобы ничего не сжечь. Если Вы не захотите покупать преобразователь логических уровней, тогда, то Вы должны будете собрать делитель напряжения, задействовав два резистора.
У Sparkfun есть отличное учебное руководство по этой теме, там Вы увидите, как они собираются и вычислите, какие резисторы Вам понадобятся. Мы рекомендуем резистор на 220 Ом и резистор на 470 Ом, которые приблизительно дадут 3.3 В. Если приемопередатчик требует 3.3 В, а плата контроллера может работать при таком напряжении, нет никакой потребности делать что-либо с соединением приемопередатчик — контроллер.
Точность датчика составляет только +/-5% влажности и 2°C, так что это не самый точный датчик. Он подходит для температуры выше нуля. DHT22 немного более точен, поэтому, если это важно для Вас, выбирайте его. Оба датчика работают с напряжениями 3.3 — 5В. Сигнальный контакт должен быть подключен через токоограничивающий резистор, номиналом 4.7 кОм.
Схема отображает как соединить провода. Для простоты использования все соединения с 5 В или 3.3 В красные, и все соединения с общим проводом синие. Подключаем провода следующим образом:
- С контроллера на приемопередатчик
- RXD | TXD
- TXD | RXD (через делитель напряжения)
- 3.3 В | Vcc, CH_PD, сброс
- GND | GND
- С контроллера на датчик температуры/влажности
- 5 В | Vcc
- GND | GND
- D7 | Сигнал (соединение с Vcc через нагрузочный резистор)
Шаг 4: Программирование
Прежде чем использовать код, Вы должны будете загрузить и установить библиотеку DHT от Adafruit. У них есть описание того, как установить, пользоваться их библиотекой и заходить на их хранилище GitHub. Их библиотека имеет разные опции (такие как теплосчетчик — их мы не будем разбирать здесь), но Вы можете самостоятельно выбрать их и использовать, если Вам понадобится!
Бод для ESP8266 установлен в начале .ino файла. Версия ESP8266, которая использовалась в сборке, поддерживает значения 9600 или 115200 бод. Обе из микросхем, которые я заказывал, установлены в 115200 бодов. Но если у вас возникли ошибки, смените бод на 9600 в качестве первого шага в отладке.
Есть несколько мест в коде со значениями в скобках ‘<‘ ‘>’. Это- те места, где Вам нужно будет вставить свои собственные значения, чтобы завершить проект. Это включает имя и пароль для Вашей сети WiFi и ключ для Вашего канала ThingSpeak. Есть код, чтобы использовать красно-зеленый светодиод для отладки и контроля состояния системы, но это не отображено в монтажных схемах. Если Вы хотите знать, верно ли работает работает система, Вы можете добавить пару светодиодов.
Заключительная ремарка, которая может сбить с толку — нельзя загрузить скетч в ардуино, к которому подключен модуль беспроводной связи. Скетч не загрузится, если они будут соединены, так что Вам нужно сначала отсоединить информационный провод — либо с передатчика, либо с контроллера.
Код прилагается к этому шагу, ищите его здесь:
#include<stdlib.h> #include "DHT.h" #define SSID "<your_network_name>"//your network name #define PASS "<your_network_password>"//your network password #define IP "184.106.153.149" // thingspeak.com #define DHTPIN 7 // what pin the DHT sensor is connected to #define DHTTYPE DHT11 // Change to DHT22 if that's what you have #define Baud_Rate 115200 //Another common value is 9600 #define GREEN_LED 3 //optional LED's for debugging #define RED_LED 4 //optional LED's for debugging #define DELAY_TIME 60000 //time in ms between posting data to ThingSpeak //Can use a post also String GET = "GET /update?key=<your_thingspeak_channel_key>&field1="; String FIELD2 = "&field2="; //if you want to add more fields this is how //String FIELD3 = "&field3="; bool updated; DHT dht(DHTPIN, DHTTYPE); //this runs once void setup() { Serial.begin(Baud_Rate); Serial.println("AT"); delay(5000); if(Serial.find("OK")){ //connect to your wifi netowork bool connected = connectWiFi(); if(!connected){ //failure, need to check your values and try again Error(); } }else{ Error(); } //initalize DHT sensor dht.begin(); } //this runs over and over void loop(){ float h = dht.readHumidity(); // Read temperature as Fahrenheit (isFahrenheit = true) float f = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(f)) { LightRed(); return; } //update ThingSpeak channel with new values updated = updateTemp(String(f), String(h)); //if update succeeded light up green LED, else light up red LED if(updated){ LightGreen(); }else{ LightRed(); } //wait for delay time before attempting to post again delay(DELAY_TIME); } bool updateTemp(String tenmpF, String humid){ //initialize your AT command string String cmd = "AT+CIPSTART=\"TCP\",\""; //add IP address and port cmd += IP; cmd += "\",80"; //connect Serial.println(cmd); delay(2000); if(Serial.find("Error")){ return false; } //build GET command, ThingSpeak takes Post or Get commands for updates, I use a Get cmd = GET; cmd += tenmpF; cmd += FIELD2; cmd += humid; //continue to add data here if you have more fields such as a light sensor //cmd += FIELD3; //cmd += <field 3 value> cmd += "\r\n"; //Use AT commands to send data Serial.print("AT+CIPSEND="); Serial.println(cmd.length()); if(Serial.find(">")){ //send through command to update values Serial.print(cmd); }else{ Serial.println("AT+CIPCLOSE"); } if(Serial.find("OK")){ //success! Your most recent values should be online. return true; }else{ return false; } } boolean connectWiFi(){ //set ESP8266 mode with AT commands Serial.println("AT+CWMODE=1"); delay(2000); //build connection command String cmd="AT+CWJAP=\""; cmd+=SSID; cmd+="\",\""; cmd+=PASS; cmd+="\""; //connect to WiFi network and wait 5 seconds Serial.println(cmd); delay(5000); //if connected return true, else false if(Serial.find("OK")){ return true; }else{ return false; } } void LightGreen(){ digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, HIGH); } void LightRed(){ digitalWrite(GREEN_LED, LOW); digitalWrite(RED_LED, HIGH); } //if an error has occurred alternate green and red leds void Error(){ while(true){ LightRed(); delay(2000); LightGreen(); delay(2000); } }
Ссылкка на скетч в Arduino IDE
Шаг 5: Задействуйте свой датчик!
Поздравляем! Вы создали свой персональный беспроводной регистратор температуры и влажности! Можно оставить его в подвале или любом влажном месте для того, чтобы вещи не заплесневели. Можно прикрутить его к куску картона для удобной транспортировки. Мы надеемся, что Вам был полезен этот обзор и Вы весело провели время! Следующим шагом можно попробовать запрограммировать ESP8266 непосредственно напрямую, в обход контроллера.