1 Концепция на устройството
Целта на това развитие е да събира данни от локални сензори, да изпраща тези данни в Интернет. Потребителят ще може да вижда данни, идващи от сензорите навсякъде по света, и да вземе дистанционно решение за задействането на определени задействащи устройства, които ще бъдат разположени локално, до сензорите
Проектът използва Arduino UNO и WiFi модул ESP8266-01. Данните ще бъдат предавани в облака чрез уеб услугата ThingSpeak.com и устройствата ще се активират чрез андроид приложението, разработено с помощта на MIT AppInventor.
IoT е концепция за компютърна мрежа от физически обекти („неща“), оборудвани с вградени технологии за взаимодействие помежду си или с външната среда, разглеждайки организацията на такива мрежи като явление, което може да възстанови икономическите и социалните процеси, елиминирайки необходимостта от човешко участие от част от действия и операции.
Основният фокус на този IoT проект ще бъде услугата ThingSpeak.com. Местното устройство UNO / ESP-01 получава данни от сензори и данни за състоянието на задвижващите устройства, изпраща ги до „запис“ в Интернет чрез специфичен канал за състояние на ThingSpeak.com (ThingSpeak.com Status Channel), същото местно устройство получава данни, " четене ”от друг канал за данни -“ каналът на изпълнителните устройства ”(ThingSpeak.com Actuator Channels).
Данните ще се събират с помощта на сензор за температура и относителна влажност, температура и влажност на почвата и сензор за околна светлина. Тези данни ще бъдат изпратени до облака на услугата ThingSpeak.
Ще има две изпълнителни устройства - това е водна електрическа помпа и лампа. Техният статус ON / OFF също ще бъде изпратен в облака. Данните от сензорите например могат да показват текущото състояние на оранжерия или оранжерия. Потребителят ще контролира изпълнителните устройства, използвайки приложението android.
2 Списък на необходимите компоненти
Всички връзки са само с информационна цел.
2 x светодиоди (червени и зелени)
1 х
- $3.00
220V лампа
2 х 330 ома резистор (използва се с LED)
2 x 10K ома резистор (използва се с DHT22 и LDR)
1 х 4K7 ома резистор (използва се с DS18B20)
прототипи борда
джъмпери
Външно захранване за реле 5V DC
3 Желязна част
Сега трябва да свържете всички сензори, както е показано на диаграмата.
Идеалното решение би било да се събере и тества проектът на части.
В следната последователност:
1. Инсталирайте и тествайте всички сензори
2.Инсталирайте и минимално конфигурирайте ESP-01
3. Променете настройката на ESP-01 към окончателната конфигурация и тест
4. Конфигурирайте канал за състояние на ThingSpeak
5. Инсталирайте ThingSpeak код на Arduino и проверете състоянието на сензорите в облака
6. Разработете първата версия на програмата на android, за да проверите съобщенията за състоянието от сензори
7. Инсталирайте изпълнителни механизми
8. Конфигурирайте каналите на изпълнителите на ThingSpeak
9. Инсталирайте и тествайте кода за изпълнителни устройства на Arduino
10. Направете втората версия на програмата на android за целия монтаж на устройството.
4 Свързване на сензор
Проектът използва някои библиотеки, които са включени в. Необходимо е да се провери тяхната наличност. Първоначалната конфигурация на тези библиотеки е следната:
// DS18B20
#include
#include
#define ONE_WIRE_BUS 5 // DS18B20 на щифт D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
int почватаTemp = 0;
// DHT
#include "DHT.h"
#include
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;
// LDR (светлина)
#define ldrPIN 1
int light = 0;
// Влажност на почвата
#define почватаHumPIN 0
int почватаHum = 0;
Сега ние инициализираме нашите датчици и ги показваме в терминала:
настройка за невалидност ()
{
Serial.begin (9600);
DS18B20.begin ();
dht.begin ();
}
void loop ()
{
readSensors ();
displaySensors ();
забавяне (10000);
}
И накрая, ще напишем две функции: едната отчита показанията от сензорите, а другата ги показва на екрана:
/ ********* стойност на сензорите за четене ************* /
void readSensors (невалиден)
{
airTemp = dht.readTemperature ();
airHum = dht.readHumidity ();
DS18B20.requestTemperatures ();
почватаTemp = DS18B20.getTempCByIndex (0); // Сензор 0 ще заснеме Температура на почвата в Целций
zemljaHum = карта (analogRead (почватаHumPIN), 1023, 0, 0, 100);
light = карта (analogRead (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> светлина 100%
}
/ ********* Датчици за дисплей стойност ************* /
void displaySensors (пустота)
{
Serial.print ("airTemp (oC):");
Serial.println (airTemp);
Serial.print ("airHum (%):");
Serial.println (airHum);
Serial.print ("почватаTemp (oC):");
Serial.println (почватаTemp);
Serial.print ("почваHum (%):");
Serial.println (почватаHum);
Serial.print ("светлина (%):");
Serial.println (светлина);
Serial.println ("");
}
Снимката показва как данните се показват на екрана.
Изходният код може да бъде изтеглен от автора.
4 ESP8266-01 основна конфигурация
Най-бързият начин за "разговор" с модула е командата AT. Процесорът вече има AT команден процесор. По подразбиране модулът се предлага с фабрични настройки от 115200 baud, трябва да зададете 9600 бод в настройките.
Първо, трябва да свържете модула, както е показано на снимката
( Обърнете внимание, че Tx терминалът на ESP-01 е свързан към Tx терминала на UNO, точно както терминалите Rx са свързани помежду си. Тази връзка ще бъде променена по-късно. ).
След това свържете UNO към компютъра, отворете IDE и изтеглете примера, който се намира. Това е празен код, за да няма конфликти между ESP-01 и UNO. Този код беше качен в Ardunio, преди да се свърже ESP-01 към него, за да сме сигурни, че Ardunio няма да използва щифтовете Tx и Rx за нищо друго.
Сега трябва да отворите IDE сериен монитор, да настроите скоростта на предаване на 115200 в настройките и да изпратите AT командата на IDE сериен монитор. ESP-01 трябва да изпрати отговор ОК
Сега трябва да промените скоростта на данни в модула ESP-01. За да направите това, в IDE дайте командата
AT + CIOBAUD = 9600
Може да се случи, че ESP-01 се върне към фабричните настройки, тогава ще трябва да използвате друга команда:
AT + UART_DEF = , , , ,
Например 9600 бод / 8 бита за данни / 1 стоп бита и няма четност и контрол на потока
AT + UART_DEF = 9600,8,1,0,0
Сега променете скоростта на пренос на данни в настройките на IDE на 9600 и изпратете командата AT, отговорът на ОК трябва да дойде.
След това трябва да преминете модула в режим STA, така че той да може да се свърже с точката за достъп на вашата мрежа.
AT + CWMODE = 1
За да се свърже модулът към мрежата, въведете командата AT + CWJAP = "network_name", "network_name_1"където network_name Е името на вашата мрежа и network_name_1 - парола за вашата мрежа (паролата и името на мрежата трябва да са в кавички)
Ако видите отговора WIFI СВЪРЗАН С WIFI GOT IP, тогава връзката се установява. Проверете IP адреса с командата
AT + CIFSR
. Адресът, който се появява във вашия монитор, можете да използвате в бъдеще. След като конфигурирате модула, можете да го свържете за постоянно, но за това е необходимо да промените неговата комутационна схема, както е показано на фигурата.
• ESP-01 RX (жълт) -> UNO Pin D7
• ESP-01 TX (оранжев) -> UNO Pin D6
• ESP-01 Ch-Pd (кафяв) -> Vcc (3.3V)
• Нулиране на ESP-01 (син) -> UNO Pin D8
• ESP-01 Vcc (червен) -> 3.3V
• ESP-01 Gnd (черен) -> UNO GND
Обърнете внимание, че серийната библиотека на софтуера използва пина UNO Pin D7 като tx и се свързва към изхода на ESP-01 RXдокато UNO Pin D6 като rxсвързан към ESP-01 TX.
Въведете малък код, за да проверите правилната връзка и конфигурация на модула ESP-01
#include
SoftwareSerial esp8266 (6.7); // Rx ==> Пин 6; TX ==> Pin7
#define speed8266 9600
настройка за невалидност ()
{
esp8266.begin (скорост8266);
Serial.begin (скорост8266);
Serial.println ("Тест за настройка на ESP8266 - използвайте AT coomands");
}
void loop ()
{
докато (esp8266.available ())
{
Serial.write (esp8266.read ());
}
докато (Serial.available ())
{
esp8266.write (Serial.read ());
}
}
Сега няколко AT отбора. Вижте резултатите в сериен монитор.
* AT =====> ESP8266 връща ОК
* AT + RST =====> ESP8266 се рестартира и връща ОК
* AT + GMR =====> ESP8266 връща AT версия; SDK версия; ИД; добре
* AT + CWMODE? => ESP8266 връща тип режим
* AT + CWLAP ===> ESP8266 връща затворени точки за достъп
* AT + CIFSR ===> ESP8266 връща обозначен IP
Програмен код можете да изтеглите на
6 свързване на сензори и ESP-01
След като всички сензори са свързани и проверени, както и модулът ESP-01 е проверен, е необходимо да се подготвят данните за изпращане в Интернет.
7 ThingSpeak
Една от най-важните части на проекта е отворената платформа IoT, която ще ви позволи да събирате данни от сензори, да ги обработвате и анализирате. За целта отидете и създайте своя акаунт. На следващо място, трябва да създадете канал, където ще има 2 задействащи механизма, 5 датчика и едно резервно поле.
• Поле 1: Задвижващ механизъм 1 (устройство 1)
• Поле 2: Задвижващ механизъм 2 (устройство 2)
• Поле 3: Температура на въздуха в oC (температура на въздуха в градуси по Целзий)
• Пила 4: Относителна влажност на въздуха в% (Относителна влажност в%)
• Поле 5: Температура на почвата в oC (Температура на почвата в гр. Целзий)
• Поле 6: Влажност на почвата в% (влажност на почвата в%)
• Поле 7: Светимост в% (осветеност в%)
• Поле 8: Запасни
Поле 8 е запазено за бъдещо разширение или за отстраняване на грешки. В този проект той се използва като брояч на грешки в комуникацията между Arduino / ESP-01 и ThingSpeak.com.
След като създадете канала за състояние, трябва да запишете клавишите, както е показано на снимката.
8 Изпращане на състоянието на сензора в облака
В момента имаме конфигурирана облачна услуга и нашите сензори събират данни локално. Сега трябва да вземете тези данни и да ги изпратите в облака на ThingSpeak.com.
За да запишете данни в ThingSpeak канал, трябва да изпратите GET низ. Това ще стане на три етапа.
Изпратете командата "Start cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80
Допълнителна дължина на низ
AT + CIPSEND = 116
И накрая, GET низ, който ще запише нашите данни в запазените полета Status Channel.
GET / актуализация? Api_key = Your_saved_key_here & field1 = pump & fieldlamp = 0 & field3 = airTemp & field4 = airHum & field5 = zemljaTemp & field6 = zemljaHum & field7 = light & field8 = резервен
Моля, обърнете внимание, че не трябва да пишем данни в канала повече от 1 път за 16 секунди.
Изпратеният код ще свърши всичко това.
// Thingspeak
String statusChWriteKey = "ВАШИЯТ ПИСМЕН КЛЮЧ ТУК"; // Идент. № на канала за състояние: 385184
#include
SoftwareSerial EspSerial (6, 7); // Rx, Tx
#define HARDWARE_RESET 8
// DS18B20
#include
#include
#define ONE_WIRE_BUS 5 // DS18B20 на щифт D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
int почватаTemp = 0;
// DHT
#include "DHT.h"
#include
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;
// LDR (светлина)
#define ldrPIN 1
int light = 0;
// Влажност на почвата
#define почватаHumPIN 0
int почватаHum = 0;
// Променливи, които да се използват с таймери
long writeTimingSeconds = 17; // ==> Определете времето за вземане на проби в секунди за изпращане на данни
long startWriteTiming = 0;
дълго изминалоWriteTime = 0;
// Променливи, които да се използват с изпълнителни механизми
булева помпа = 0;
булева лампа = 0;
int резервен = 0;
булева грешка;
настройка за невалидност ()
{
Serial.begin (9600);
pinMode (HARDWARE_RESET, OUTPUT);
digitalWrite (HARDWARE_RESET, HIGH);
DS18B20.begin ();
dht.begin ();
EspSerial.begin (9600); // Comunicacao com Modulo WiFi
EspHardwareReset (); // Нулиране на Modulo WiFi
startWriteTiming = millis (); // стартиране на "програмния часовник"
}
void loop ()
{
старт: // етикет
грешка = 0;
elapsedWriteTime = millis () - startWriteTiming;
ако (elapsedWriteTime> (writeTimingSeconds * 1000))
{
readSensors ();
writeThingSpeak ();
startWriteTiming = millis ();
}
ако (грешка == 1) // Повторно изпращане, ако предаването не е завършено
{
Serial.println ("<<<< ГРЕШКА >>>>");
забавяне (2000 г.);
отидете на старт; // отидете на етикет "старт"
}
}
/ ********* стойност на сензорите за четене ************* /
void readSensors (невалиден)
{
airTemp = dht.readTemperature ();
airHum = dht.readHumidity ();
DS18B20.requestTemperatures ();
почватаTemp = DS18B20.getTempCByIndex (0); // Сензор 0 ще заснеме Температура на почвата в Целций
light = карта (analogRead (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> светлина 100%
zemljaHum = карта (analogRead (почватаHumPIN), 1023, 0, 0, 100);
}
/ ********* Conexao com TCP com Thingspeak ******* /
void writeThingSpeak (void)
{
startThingSpeakCmd ();
// preparacao da string GET
String getStr = "GET / update? Api_key =";
getStr + = statusChWriteKey;
getStr + = "& field1 =";
getStr + = String (помпа);
getStr + = "& field2 =";
getStr + = String (лампа);
getStr + = "& field3 =";
getStr + = String (airTemp);
getStr + = "& field4 =";
getStr + = String (airHum);
getStr + = "& field5 =";
getStr + = String (groundTemp);
getStr + = "& field6 =";
getStr + = String (почватаHum);
getStr + = "& field7 =";
getStr + = String (лек);
getStr + = "& field8 =";
getStr + = String (резервен);
getStr + = "\ r \ n \ r \ n";
sendThingSpeakGetCmd (getStr);
}
/ ********* Възстановяване на ESP ************* /
void EspHardwareReset (void)
{
Serial.println ("Възстановяване .......");
digitalWrite (HARDWARE_RESET, LOW);
забавяне (500);
digitalWrite (HARDWARE_RESET, HIGH);
забавяне (8000); // Tempo Requário para começar a ler
Serial.println ("RESET");
}
/ ********* Започнете комуникация с ThingSpeak ************* /
void startThingSpeakCmd (void)
{
EspSerial.flush (); // limpa o buffer antes de começar a gravar
String cmd = "AT + CIPSTART = \" TCP \ ", \" ";
cmd + = "184.106.153.149"; // Endereco IP de api.thingspeak.com
cmd + = "\", 80 ";
EspSerial.println (cmd);
Serial.print ("enviado ==> Start cmd:");
Serial.println (cmd);
ако (EspSerial.find ("Грешка"))
{
Serial.println ("грешка AT + CIPSTART");
се върне;
}
}
/ ********* изпрати GET cmd на ThingSpeak ************* /
String sendThingSpeakGetCmd (String getStr)
{
String cmd = "AT + CIPSEND =";
cmd + = String (getStr.length ());
EspSerial.println (cmd);
Serial.print ("enviado ==> дължина cmd:");
Serial.println (cmd);
ако (EspSerial.find ((char *) ">"))
{
EspSerial.print (getStr);
Serial.print ("enviado ==> getStr:");
Serial.println (getStr);
закъснение (500); // темпо за пара процес на GET, sem este забавяне apresenta зает без próximo comando
String messageBody = "";
докато (EspSerial.available ())
{
String line = EspSerial.readStringUntil ('\ n');
ако (line.length () == 1)
{// действителното съдържание започва след празен ред (който има дължина 1)
messageBody = EspSerial.readStringUntil ('\ n');
}
}
Serial.print ("Съобщение получено:");
Serial.println (messageBody);
съобщение за връщанеBody;
}
още
{
EspSerial.println ("AT + CIPCLOSE"); // предупреди потребител
Serial.println („ESP8266 CIPSEND ERROR: RESENDING“); // Повторно изпращане ...
резервен = резервен + 1;
грешка = 1;
връщане "грешка";
}
}
Можете да видите напредъка в сериен монитор.
Изходният код може да бъде изтеглен на
9 приложение за Android - първа част
Първо трябва да създадете потребителски интерфейс. Картината показва основните видими и невидими елементи.
След това трябва да създадете блокове. Елементите от менюто съответстват на номера на екрана.
1 Държавни променливи, които трябва да бъдат декларирани като глобални
2 На всеки две секунди (в зависимост от Clock1) се извиква процедура "ReadArduino"
Процедурата връща стойността на променливите, които трябва да бъдат показани на екрана. В този случай стойността на състоянието (0 и 1) за задвижващите механизми се преобразува в „ON“ и „OFF“ за по-добро възприемане.
Тези стойности (Състояние) ще бъдат показани в съответните „Преки пътища“
3 Рутината readArduino по същество ще прочете канала за състояние в ThingSpeak. Така че, трябва да определите URL адреса, който ще бъде изпратен до Thingspeak. За целта трябва да бъдат декларирани и комбинирани 3 глобални променливи, за да се създаде URL адресът, който ще бъде изпратен до ThingSpeak. GET трябва да бъде изпратен до уеб компонент, наречен «ArduFarmBotStatusCh»
4 Текст, получен от предишната команда, ще пристигне във формат JSon. Този текст трябва да бъде обработен, така че всяко поле да се чете и съхранява в съответната глобална променлива.
5 Последното нещо, което трябва да направите е да се обадите на процедурата „Аларма“, която ще анализира състоянието на два сензора за почвата. Ако температурата е твърде ниска (в нашия случай 10oC), трябва да се покаже съобщение. Същото е и за влагата, ако е под 60%.
Моля, обърнете внимание, че сме дефинирали друг таймер (Clock2), програмиран да го пуска всяка секунда. Необходимо е само за „превключване“ на цвета на текста на съобщението (от бяло в червено). Съобщението ще мига.
Кодът на приложението може да бъде изтеглен на
10 Свързване на задвижващи механизми
Командите за включване и изключване на помпата и лампата ще се получават дистанционно. Изходът на Ardunio ще активира релето и светодиода, като поеме тези команди. На снимката е показано как трябва да се свържат задвижванията. Моля, обърнете внимание, че GND релеен изход НЕ СВЪРЗАНИ към GND изходUNO. По този начин ще има по-малко смущения в захранването, когато релето работи.
11 конфигурация на задвижващите канали (изпълнителни канали)
Всички действия повтарят процедурата за конфигуриране на канала за състояние. Необходимо е да се създадат два канала за всяко от устройствата. За всеки канал напишете клавишите ID на канала, четене и запис. Ще пишем само в първото поле на всеки канал. Например:
ID на канала 375598 ==> LED червен (помпа)
◦ Field1 = 0 ==> Pump OFF
◦ Field1 = 1 ==> Помпа ВКЛЮЧЕНА
2. ID на канала 375599 ==> LED зелен (лампа)
◦ Field1 = 0 ==> Лампата е изключена
◦ Field1 = 1 ==> Лампата е включена
11 задвижващи и тестващи задвижващи кодове в Ardunio.
Когато изпратихме данни в облака, ние ги „записахме“ в канала ThingSpeak. Състояние на състоянието, „предаване“ (качване) на тези данни. Сега трябва да "четем" данните от задвижващия канал, "приемайки" (изтегляйки) тези данни.
За целта изпратете GET низ и тази процедура се състои от 3 етапа.
„Стартиране на cmd“
AT + CIPSTART = "TCP", "184.106.153.149", 80
Дължина на линията
AT + CIPSEND = 36
И самия низ GET
GET / канали / 375598 / полета / 1 / последно
Каналите ще бъдат "четени" на всеки 10 секунди
След изпращане на GET, трябва да приемем отговора от ThingSpeak. Отговорът трябва да бъде или 0, или 1 за всеки канал. Ако има някакви други стойности, тогава просто ги игнорираме.
Основната разлика между тази част и предишната е само във функцията readThingSpeak (String channelID)
По-долу е кодът, който изпълнява описаните действия.
// Thingspeak
String canalID1 = "999999"; // Задвижващ механизъм1
String canalID2 = "999999"; // Актуатор2
#include
SoftwareSerial EspSerial (6, 7); // Rx, Tx
#define HARDWARE_RESET 8
// Променливи, които да се използват с таймери
дълго четенеTimingSeconds = 10; // ==> Определете времето за вземане на проби в секунди за получаване на данни
дълъг стартReadTiming = 0;
дълго изминалоReadTime = 0;
// Релета
#define ACTUATOR1 10 // ЧЕРВЕН LED ==> Помпа
#define ACTUATOR2 12 // ЗЕЛЕН LED ==> Лампа
булева помпа = 0;
булева лампа = 0;
int резервен = 0;
булева грешка;
настройка за невалидност ()
{
Serial.begin (9600);
pinMode (ACTUATOR1, OUTPUT);
pinMode (ACTUATOR2, OUTPUT);
pinMode (HARDWARE_RESET, OUTPUT);
digitalWrite (ACTUATOR1, HIGH); // o módulo relé é ativo em LOW
digitalWrite (ACTUATOR2, HIGH); // o módulo relé é ativo em LOW
digitalWrite (HARDWARE_RESET, HIGH);
EspSerial.begin (9600); // Comunicacao com Modulo WiFi
EspHardwareReset (); // Нулиране на Modulo WiFi
startReadTiming = millis (); // стартиране на "програмния часовник"
}
void loop ()
{
старт: // етикет
грешка = 0;
elapsedReadTime = millis () - startReadTiming;
ако (прошлоReadTime> (readTimingSeconds * 1000))
{
команда int = readThingSpeak (canalID1);
ако (команда! = 9) помпа = команда;
забавяне (5000);
команда = readThingSpeak (canalID2);
ако (команда! = 9) лампа = команда;
предприемане на действия ();
startReadTiming = millis ();
}
ако (грешка == 1) // Повторно изпращане, ако предаването не е завършено
{
Serial.println ("<<<< ГРЕШКА >>>>");
забавяне (2000 г.);
отидете на старт; // отидете на етикет "старт"
}
}
/ ********* Предприемайте действия въз основа на ThingSpeak командите ************* /
анулиране предприемане на действия (невалидни)
{
Serial.print ("Помпа:");
Serial.println (помпа);
Serial.print ("Лампа:");
Serial.println (лампа);
ако (помпа == 1) digitalWrite (ACTUATOR1, LOW);
друго digitalWrite (ACTUATOR1, HIGH);
ако (лампа == 1) digitalWrite (ACTUATOR2, LOW);
друго digitalWrite (ACTUATOR2, HIGH);
}
/ ********* Прочетете командата на Actuators от ThingSpeak ************* /
int readThingSpeak (String channelID)
{
startThingSpeakCmd ();
команда int;
// preparacao da string GET
String getStr = "GET / канали /";
getStr + = channelID;
getStr + = "/ полета / 1 / последен";
getStr + = "\ r \ n";
String messageDown = sendThingSpeakGetCmd (getStr);
ако (messageDown [5] == 49)
{
command = messageDown [7] -48;
Serial.print ("Командата получена:");
Serial.println (команда);
}
команда else = 9;
команда за връщане;
}
/ ********* Възстановяване на ESP ************* /
void EspHardwareReset (void)
{
Serial.println ("Възстановяване .......");
digitalWrite (HARDWARE_RESET, LOW);
забавяне (500);
digitalWrite (HARDWARE_RESET, HIGH);
забавяне (8000); // Tempo Requário para começar a ler
Serial.println ("RESET");
}
/ ********* Започнете комуникация с ThingSpeak ************* /
void startThingSpeakCmd (void)
{
EspSerial.flush (); // limpa o buffer antes de começar a gravar
String cmd = "AT + CIPSTART = \" TCP \ ", \" ";
cmd + = "184.106.153.149"; // Endereco IP de api.thingspeak.com
cmd + = "\", 80 ";
EspSerial.println (cmd);
Serial.print ("enviado ==> Start cmd:");
Serial.println (cmd);
ако (EspSerial.find ("Грешка"))
{
Serial.println ("грешка AT + CIPSTART");
се върне;
}
}
/ ********* изпрати GET cmd на ThingSpeak ************* /
String sendThingSpeakGetCmd (String getStr)
{
String cmd = "AT + CIPSEND =";
cmd + = String (getStr.length ());
EspSerial.println (cmd);
Serial.print ("enviado ==> дължина cmd:");
Serial.println (cmd);
ако (EspSerial.find ((char *) ">"))
{
EspSerial.print (getStr);
Serial.print ("enviado ==> getStr:");
Serial.println (getStr);
закъснение (500); // темпо за пара процес на GET, sem este забавяне apresenta зает без próximo comando
String messageBody = "";
докато (EspSerial.available ())
{
String line = EspSerial.readStringUntil ('\ n');
ако (line.length () == 1)
{// действителното съдържание започва след празен ред (който има дължина 1)
messageBody = EspSerial.readStringUntil ('\ n');
}
}
Serial.print ("Съобщение получено:");
Serial.println (messageBody);
съобщение за връщанеBody;
}
още
{
EspSerial.println ("AT + CIPCLOSE"); // предупреди потребител
Serial.println („ESP8266 CIPSEND ERROR: RESENDING“); // Повторно изпращане ...
резервен = резервен + 1;
грешка = 1;
връщане "грешка";
}
}
Можете да го изтеглите на
12 изпращане на команди до устройства
На този етап имаме конфигуриран канал за задействане, променящ стойността на поле 1 за всяко устройство. Трябва да проверим дали устройствата работят правилно командите. В края на проекта ще се използва андроид приложение за това, но може да се направи и чрез браузър.
Включете помпата (червен светодиод е включен)
https://api.thingspeak.com/update?api_key=Сохраненный_ключ_канала_1&field1=1
Изпомпване (червен светодиод изключен)
https://api.thingspeak.com/update?api_key=Съхранен канал_key_1 & field1 = 0
Включете лампата (зеленият светодиод е включен)
https://api.thingspeak.com/update?api_key=Съхранен канал_key_2 & field1 = 1
Изключете лампата (зеленият светодиод е изключен)
https://api.thingspeak.com/update?api_key=Съхранен канал_key_2 & field1 = 0
14 Прекратяване на андроид програмата
В предишната част имаше проста програма, която „прочете“ данните от канала и ги показа на екрана. Сега трябва да накараме програмата да „запише“ командите в изпълнителния канал, така че тези команди да могат да се четат от контролера и лампата с помпата да работи съответно.
За да може потребителят да изпраща команди, приложението ще има два бутона за всяко устройство. Ако е включен, син, ако е изключен, червен.
Щраквайки върху бутоните в приложението, можете да видите резултата в сериен монитор.
Кодът може да бъде изтеглен на
15 Заключителен монтаж
На този етап има напълно завършено андроидно приложение, напълно сглобена „желязна” част, но в контролера няма код, който постоянно да чете данните и да изпраща команди в облака. Просто трябва да комбинирате всички фрагменти от кода, написани по-рано. Разбира се, кодът има допълнителни опции за проверка (например, ако ESP-01 замръзне). За да направите това, периодично преди всяка команда за четене или запис се изпраща AT команда.И ако отговорът ОК не дойде от модула, тогава модулът се насилва рестартиран програмно.
Пълният код на проекта може да бъде изтеглен на
На адреса можете да получите актуализации за програмните файлове.
Можете също да прочетете коментари към връзката към източника, ако нещо не е ясно.