1 Laitekonsepti
Tämän kehityksen tarkoituksena on kerätä tietoja paikallisilta antureilta, lähettää nämä tiedot Internetiin. Käyttäjä pystyy tarkastelemaan antureista tulevaa tietoa kaikkialla maailmassa ja etäpäättämään tiettyjen paikallisesti antureiden vieressä sijaitsevien toimilaitteiden aktivoinnista
Projekti käyttää Työläs UNO ja WiFi-moduuli ESP8266-01. Tiedot siirretään pilveen ThingSpeak.com -verkkopalvelun kautta, ja laitteet aktivoidaan MIT AppInventorilla kehitetyn android-sovelluksen kautta.
IoT on käsite fyysisten esineiden (”asioiden”) tietoverkosta, joka on varustettu sisäänrakennetulla tekniikalla vuorovaikutukseen toistensa tai ulkoisen ympäristön kanssa, pitäen tällaisten verkkojen organisointia ilmiönä, joka voi rakentaa uudelleen taloudellisia ja sosiaalisia prosesseja, poistaen ihmisten osallistumisen tarpeen osasta toimia ja toimintoja.
Tämän internet-projektin pääpaino on ThingSpeak.com-palvelu. Paikallinen UNO / ESP-01 -laite vastaanottaa tietoja antureilta ja tietoja toimilaitteiden tilasta, lähettää sen Internetin “tallennukseen” tietyn ThingSpeak.com-tilakanavan (ThingSpeak.com Status Channel) kautta, sama paikallinen laite vastaanottaa dataa, " lukeminen ”toiselta datakanavalta,” toimeenpanolaitteiden kanavalta ”(ThingSpeak.com -toimilaitekanavat).
Tiedot kerätään lämpötila- ja suhteellisen kosteuden anturin, maaperän lämpötilan ja kosteuden sekä ympäristön valotunnistimen avulla. Nämä tiedot lähetetään ThingSpeak-palvelupilveen.
Siellä on kaksi toimeenpanolaitetta - tämä on vesisähköpumppu ja lamppu. Heidän ON / OFF-tila lähetetään myös pilvelle. Esimerkiksi anturien tiedot voivat näyttää kasvihuoneen tai kasvihuoneen nykyisen tilan. Käyttäjä hallitsee toimeenpanolaitteita android-sovelluksen avulla.
2 Luettelo tarvittavista komponenteista
Kaikki linkit ovat vain tiedoksi.
2 x LEDiä (punainen ja vihreä)
1 x
- $3.00
220 V lamppu
2 x 330 ohmin vastus (käytetään LEDien kanssa)
2 x 10K ohmin vastus (käytetään DHT22: n ja LDR: n kanssa)
1 x 4K7 ohmin vastus (käytetään DS18B20: n kanssa)
prototyyppien aluksella
hyppääjiä
Ulkoinen virtalähde releen 5V DC
3 Rautaosa
Nyt sinun on kytkettävä kaikki anturit kuvan osoittamalla tavalla.
Ihanteellinen ratkaisu olisi koota ja testata projekti osittain.
Seuraavassa järjestyksessä:
1. Asenna ja testaa kaikki anturit
2.Asenna ESP-01 ja määritä se vähintään
3. Muuta ESP-01-asetus lopulliseen kokoonpanoon ja testiin
4. Määritä ThingSpeak Status Channel
5. Asenna ThingSpeak-koodi Arduinoon ja tarkista pilvien anturien tila
6. Kehitä Android-ohjelman ensimmäinen versio tarkistaaksesi anturien tilaviestit
7. Asenna toimilaitteet
8. Määritä ThingSpeak-toimilaitteiden kanavat
9. Asenna ja testaa koodit johtolaitteille Arduinolle
10. Tee toinen versio ohjelmasta androidilla koko laitekokoonpanolle.
4 Anturiliitäntä
Projekti käyttää joitain kirjastoja, jotka sisältyvät. On tarpeen tarkistaa niiden saatavuus. Näiden kirjastojen alkuperäinen kokoonpano on seuraava:
// DS18B20
# Sisällytä
# Sisällytä
#define ONE_WIRE_BUS 5 // DS18B20 nastassa D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
int groundTemp = 0;
// DHT
#sisältää "DHT.h"
# sisällytä
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT-dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;
// LDR (vaalea)
#define ldrPIN 1
int valo = 0;
// Maaperän kosteus
#määritä maaperäHumPIN 0
int groundHum = 0;
Nyt alustamme anturit ja näytämme ne terminaalissa:
tyhjä asennus ()
{
Serial.begin (9600);
DS18B20.begin ();
dht.begin ();
}
tyhjä silmukka ()
{
readSensors ();
näyttöanturit ();
viive (10000);
}
Ja lopuksi kirjoitamme kaksi toimintoa: toinen lukee anturien lukemat ja toinen näyttää ne näytöllä:
/ ********* Lue antureiden arvo ************* /
tyhjä readSensors (tyhjä)
{
airTemp = dht.readTemperature ();
airHum = dht.readHumidity ();
DS18B20.requestTemperatures ();
soilTemp = DS18B20.getTempCByIndex (0); // Anturi 0 tallentaa maaperän lämpötilan Celsiuksessa
soilHum = kartta (analoginen lukema (soilHumPIN), 1023, 0, 0, 100);
valo = kartta (analoginen lukumäärä (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> vaalea 100%
}
/ ********* Näyttöanturien arvo ************* /
tyhjä näyttöSensorit (tyhjä)
{
Serial.print ("airTemp (oC):");
Serial.println (airTemp);
Sarjajälki ("airHum (%):");
Serial.println (airHum);
Serial.print ("soilTemp (oC):");
Serial.println (soilTemp);
Sarjajälki ("soilHum (%):");
Serial.println (soilHum);
Sarjajälki ("kevyt (%):");
Serial.println (vaalea);
Serial.println ("");
}
Valokuvassa näkyy, kuinka tiedot näytetään näytöllä.
Lähdekoodi voidaan ladata tekijältä.
4 ESP8266-01-peruskokoonpano
Nopein tapa "puhua" moduulin kanssa on AT-komento. Prosessorilla on jo AT-komentoprosessori. Oletusasetuksena on, että moduulin tehdasasetukset ovat 115200 baudia, asetukset on asetettava 9600 baudia.
Ensinnäkin, sinun on kytkettävä moduuli kuvan osoittamalla tavalla
( Huomaa, että ESP-01: n Tx-liitäntä on kytketty UNO: n Tx-liitäntään, aivan kuten Rx-liittimet on kytketty toisiinsa. Tämä yhteys vaihdetaan myöhemmin. ).
Yhdistä sitten UNO tietokoneeseen, avaa IDE ja lataa löytyvä esimerkki. Tämä on tyhjä koodi, joten ESP-01: n ja UNO: n välillä ei ole ristiriitoja. Tämä koodi ladattiin Ardunioon ennen ESP-01: n kytkemistä siihen, jotta voidaan varmistaa, että Ardunio ei käytä Tx- ja Rx-nastaita mihinkään muuhun.
Nyt sinun on avattava IDE Serial Monitor, asetettava tiedonsiirtonopeudeksi 115200 asetuksissa ja lähetettävä AT-komento IDE Serial Monitoriin. ESP-01: n pitäisi lähettää vastaus OK
Nyt sinun on muutettava tiedonsiirtonopeutta ESP-01-moduulissa. Anna tämä komento IDE: ssä
AT + CIOBAUD = 9600
Voi tapahtua, että ESP-01 palaa tehdasasetuksiin, sinun on käytettävä toista komentoa:
AT + UART_DEF = , , , ,
Esimerkiksi 9600 baudia / 8 databittiä / 1 lopetusbitti eikä pariteetti- ja virtauksenhallintaa
AT + UART_DEF = 9600,8,1,0,0
Muuta nyt IDE-asetusten tiedonsiirtonopeus arvoon 9600 ja lähetä AT-komento, OK-vastauksen pitäisi tulla.
Seuraavaksi sinun on vaihdettava moduuli STA-tilaan, jotta se voi muodostaa yhteyden verkon tukiasemaan.
AT + CWMODE = 1
Kirjoita komento, jotta moduuli voi muodostaa yhteyden verkkoon AT + CWJAP = "verkon_nimi", "verkon_nimi_1"jossa NETWORK_NAME Onko verkon nimi ja network_name_1 - verkon salasana (salasanan ja verkon nimen on oltava lainausmerkeissä)
Jos näet vastauksen WIFI KYTKETTY WIFI SAI IP: N, sitten yhteys muodostetaan. Varmista IP-osoite komennolla
AT + CIFSR
. Näyttöön ilmestyvä osoite, jota voit käyttää tulevaisuudessa. Kun olet määrittänyt moduulin, voit kytkeä sen pysyvästi, mutta tätä varten sinun on vaihdettava sen kytkentäpiiri kuvan osoittamalla tavalla.
• ESP-01 RX (keltainen) -> UNO-napa D7
• ESP-01 TX (oranssi) -> UNO-nasta D6
• ESP-01 Ch-Pd (ruskea) -> Vcc (3,3 V)
• ESP-01 nollaus (sininen) -> UNO-napa D8
• ESP-01 Vcc (punainen) -> 3,3 V
• ESP-01 Gnd (musta) -> UNO GND
Huomaa, että ohjelmistosarjakirjasto käyttää UNO Pin D7 -tappia kuten tx ja se kytketään ESP-01: n lähtöön RXsamalla kun UNO-pin D6 kuten rxkytketty ESP-01: een TX.
Kirjoita pieni koodi varmistaaksesi oikean yhteyden ja ESP-01-moduulin kokoonpanon
#sisältää
SoftwareSerial esp8266 (6.7); // Rx ==> Tappi 6; TX ==> Pin7
#define speed8266 9600
tyhjä asennus ()
{
esp8266.begin (nopeus8266);
Serial.begin (nopeus8266);
Serial.println ("ESP8266 asennustesti - käytä AT-koodauksia");
}
tyhjä silmukka ()
{
kun taas (esp8266.on käytettävissä ())
{
Sarjakuvaus (esp8266.read ());
}
while (Sarjakuvaus saatavissa ())
{
esp8266.write (Serial.read ());
}
}
Nyt muutama AT-joukkue. Katso tulokset sarjamonitorista.
* AT =====> ESP8266 palaa OK
* AT + RST =====> ESP8266 käynnistyy uudelleen ja palaa OK
* AT + GMR =====> ESP8266 palauttaa AT-version; SDK-versio; id; kunnossa
* AT + CWMODE? => ESP8266 palauttaa tilan tyypin
* AT + CWLAP ===> ESP8266 palauttaa läheiset tukiasemat
* AT + CIFSR ===> ESP8266 palauttaa suunnitellun IP: n
Ohjelmakoodin voi ladata osoitteesta
6 anturien ja ESP-01: n liitäntä
Kun kaikki anturit on kytketty ja tarkistettu, samoin kuin ESP-01-moduuli on tarkistettu, tiedot on valmisteltava Internetissä lähettämistä varten.
7 ThingSpeak
Yksi projektin tärkeimmistä osista on avoin Internet-alusta, jonka avulla voit kerätä tietoja antureista, käsitellä ja analysoida niitä. Siirry tähän luodaksesi tilisi. Seuraavaksi sinun on luotava kanava, jossa on 2 toimilaitetta, 5 anturia ja yksi varmuuskopiokenttä.
• Kenttä 1: Toimilaite 1 (laite 1)
• Kenttä 2: Toimilaite 2 (laite 2)
• Kenttä 3: Ilman lämpötila oC (ilman lämpötila Celsius-asteina)
• Filed 4: Ilman suhteellinen kosteus% (suhteellinen kosteus%)
• Kenttä 5: Maaperän lämpötila oC: ssa (Maaperän lämpötila grammoina Celsius)
• Kenttä 6: Maaperän kosteus% (maaperän kosteus%)
• Kenttä 7: Valaistus% (valaistus%)
• Kenttä 8: Varaosa
Kenttä 8 on varattu tulevaa laajennusta tai virheenkorjausta varten. Tässä projektissa sitä käytetään viestintävirhelaskurina Arduino / ESP-01: n ja ThingSpeak.com: n välillä.
Kun olet luonut tilakanavan, sinun on tallennettava näppäimet kuvan osoittamalla tavalla.
8 Anturin tilan lähettäminen pilveen
Tällä hetkellä meillä on konfiguroitu pilvipalvelu ja anturimme keräävät tietoja paikallisesti. Nyt sinun on otettava nämä tiedot ja lähetettävä ne pilveen ThingSpeak.com -sivustolla.
Jotta voit kirjoittaa tietoja ThingSpeak-kanavalle, sinun on lähetettävä GET-merkkijono. Tämä tehdään kolmessa vaiheessa.
Lähetä komento "Käynnistä cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80
Jousen lisäpituus
AT + CIPSEND = 116
Ja lopuksi, GET-merkkijono, joka kirjoittaa tietomme varattuihin tilakanavakenttiin.
GET / päivittää? Api_key = sinun_saved_key_here & field1 = pump & fieldlamp = 0 & field3 = airTemp & field4 = airHum & field5 = soilTemp & field6 = soilHum & field7 = light & field8 = spare
Huomaa, että meidän ei pitäisi kirjoittaa tietoja kanavalle enempää kuin kerran 16 sekunnissa.
Lähetetty koodi tekee kaiken tämän.
// Asutunne
Merkkijono statusChWriteKey = "KIRJOITTAMINEN TÄTÄ"; // Tilakanavan tunnus: 385184
#sisältää
SoftwareSerial EspSerial (6, 7); // Rx, Tx
#define HARDWARE_RESET 8
// DS18B20
# Sisällytä
# Sisällytä
#define ONE_WIRE_BUS 5 // DS18B20 nastassa D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
int groundTemp = 0;
// DHT
#sisältää "DHT.h"
# sisällytä
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT-dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;
// LDR (vaalea)
#define ldrPIN 1
int valo = 0;
// Maaperän kosteus
#määritä maaperäHumPIN 0
int groundHum = 0;
// Ajastimien kanssa käytettävät muuttujat
long writeTimingSeconds = 17; // ==> Määritä näytteen aika sekunneissa tietojen lähettämistä varten
pitkä startWriteTiming = 0;
kauan kulunutWriteTime = 0;
// Toimilaitteiden kanssa käytettävät muuttujat
boolean pump = 0;
boolean lamppu = 0;
int vara = 0;
boolen virhe;
tyhjä asennus ()
{
Serial.begin (9600);
pinMode (HARDWARE_RESET, OUTPUT);
digitalWrite (HARDWARE_RESET, HIGH);
DS18B20.begin ();
dht.begin ();
EspSerial.begin (9600); // Comunicacao com Modulo WiFi
EspHardwareReset (); // Palauta Modulo WiFi
startWriteTiming = millis (); // "kellon" käynnistäminen
}
tyhjä silmukka ()
{
alku: // tarra
virhe = 0;
kulunutWriteTime = millis () - startWriteTiming;
if (kulunutWriteTime> (writeTimingSeconds * 1000))
{
readSensors ();
writeThingSpeak ();
startWriteTiming = millis ();
}
if (virhe == 1) // Lähetä uudelleen, jos lähetys ei ole valmis
{
Serial.println ("<<<< VIRHE >>>>");
viive (2000);
aloita; // siirry etikettiin "start"
}
}
/ ********* Lue antureiden arvo ************* /
tyhjä readSensors (tyhjä)
{
airTemp = dht.readTemperature ();
airHum = dht.readHumidity ();
DS18B20.requestTemperatures ();
soilTemp = DS18B20.getTempCByIndex (0); // Anturi 0 tallentaa maaperän lämpötilan Celsiuksessa
valo = kartta (analoginen lukumäärä (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> vaalea 100%
soilHum = kartta (analoginen lukema (soilHumPIN), 1023, 0, 0, 100);
}
/ ********* Conexao com TCP com Thingspeak ******* /
void writeThingSpeak (tyhjä)
{
startThingSpeakCmd ();
// preparacao da merkkijono GET
Merkkijono getStr = "GET / update? Api_key =";
getStr + = statusChWriteKey;
getStr + = "& field1 =";
getStr + = merkkijono (pumppu);
getStr + = "& field2 =";
getStr + = merkkijono (lamppu);
getStr + = "& field3 =";
getStr + = merkkijono (airTemp);
getStr + = "& field4 =";
getStr + = merkkijono (airHum);
getStr + = "& field5 =";
getStr + = merkkijono (soilTemp);
getStr + = "& field6 =";
getStr + = merkkijono (soilHum);
getStr + = "& field7 =";
getStr + = merkkijono (kevyt);
getStr + = "& field8 =";
getStr + = merkkijono (vapaa);
getStr + = "\ r \ n \ r \ n";
sendThingSpeakGetCmd (getStr);
}
/ ********* Palauta ESP ************* /
tyhjä EspHardwareReset (tyhjä)
{
Serial.println ("Nollataan .......");
digitalWrite (HARDWARE_RESET, LOW);
viive (500);
digitalWrite (HARDWARE_RESET, HIGH);
viivästyminen (8000); // Tempo välttämätön para começar a ler
Serial.println ("RESET");
}
/ ********* Aloita viestintä ThingSpeakin kanssa ************** /
tyhjä startThingSpeakCmd (tyhjä)
{
EspSerial.flush (); // limpa o puskuri antaa gravarin käyttöön
Merkkijono cmd = "AT + CIPSTART = \" TCP \ ", \" ";
cmd + = "184.106.153.149"; // Endereco IP de api.thingspeak.com
cmd + = "\", 80 ";
EspSerial.println (cmd);
Serial.print ("enviado ==> Käynnistä cmd:");
Serial.println (cmd);
if (EspSerial.find ("Virhe"))
{
Serial.println ("AT + CIPSTART-virhe");
palata;
}
}
/ ********* lähetä GET cmd ThingSpeakiin ************* /
Merkkijono sendThingSpeakGetCmd (merkkijono getStr)
{
Merkkijono cmd = "AT + CIPSEND =";
cmd + = merkkijono (getStr.length ());
EspSerial.println (cmd);
Serial.print ("enviado ==> pituus cmd:");
Serial.println (cmd);
if (EspSerial.find ((char *) ">"))
{
EspSerial.print (getStr);
Serial.print ("enviado ==> getStr:");
Serial.println (getStr);
viivytys (500); // tempo para processar o GET, sem este delay apresenta kiire varattu ei próximo comando
Merkkijono messageBody = "";
kun taas (EspSerial.a available ())
{
Merkkijono = EspSerial.readStringUntil ('\ n');
if (juovan pituus () == 1)
{// todellinen sisältö alkaa tyhjän rivin jälkeen (jonka pituus on 1)
messageBody = EspSerial.readStringUntil ('\ n');
}
}
Serial.print ("MessageBody vastaanotettu:");
Serial.println (messageBody);
paluu messageBody;
}
muu
{
EspSerial.println ("AT + CIPCLOSE"); // hälytyskäyttäjä
Serial.println ("ESP8266 CIPSEND ERROR: RESENDING"); // Lähetä uudelleen ...
vapaa = vara + 1;
virhe = 1;
palauta "virhe";
}
}
Voit nähdä edistymisen Sarjamonitorissa.
Lähdekoodi voi ladata osoitteesta
9 android-sovellus - osa yksi
Ensin sinun on luotava käyttöliittymä. Kuvassa näkyvät tärkeimmät näkyvät ja näkymättömät elementit.
Sen jälkeen sinun on luotava lohkoja. Valikkokohteet vastaavat kuvakaappausnumeroita.
1 Tilamuuttujat, jotka tulisi julistaa globaaleiksi
2 Joka toinen sekunti (kello1: stä riippuen) menettelyä kutsutaan "ReadArduino"
Menetelmä palauttaa niiden muuttujien arvot, jotka tulisi näyttää näytöllä. Tässä tapauksessa toimilaitteiden tila-arvo (0 ja 1) muutetaan “ON” ja “OFF” paremman havainnon saamiseksi.
Nämä arvot (Tila) näytetään vastaavissa ”Pikavalinnat”
3 ReadArduino-rutiini lukee oleellisesti tilakanavan ThingSpeakissa. Joten, sinun on määritettävä URL, joka lähetetään Thingspeakille. Tätä varten 3 globaalia muuttujaa on ilmoitettava ja yhdistettävä, jotta luodaan URL, joka lähetetään ThingSpeakille. GET tulisi lähettää verkkokomponentille nimeltä «ArduFarmBotStatusCh»
4 Edellisestä komennosta saatu teksti saapuu JSon-muodossa. Tämä teksti on käsiteltävä niin, että jokainen kenttä luetaan ja tallennetaan vastaavaan globaalimuuttujaan.
5 Viimeinen tehtävä on kutsua ”Hälytys” -menettely, joka analysoi kahden maa-anturin tilan. Jos lämpötila on liian matala (meidän tapauksessamme 10 ° C), näyttöön tulee viesti. Sama kosteudelle, jos se on alle 60%.
Huomaa, että olemme määritellyt toisen ajastimen (Clock2), joka on ohjelmoitu toimimaan joka sekunti. Tarvitaan vain viestin tekstin värin "vaihtaminen" (valkoisesta punaiseen). Viesti vilkkuu.
Sovelluskoodin voi ladata osoitteesta
10 Toimilaitteiden kytkentä
Komennot pumpun ja lampun kytkemiseksi päälle ja pois päältä vastaanotetaan etäyhteyden kautta. Ardunion lähtö aktivoi releen ja LEDin ottaen nämä komennot. Kuvassa näkyy, kuinka toimilaitteet on kytkettävä. Huomaa, että GND-relelähtö EI KYTKETTY GND-ulostuloonUNO. Tällä tavoin on vähemmän tehohäiriöitä, kun rele on käynnissä.
11 kanavatoimilaitteiden (toimilaitekanavat) kokoonpano
Kaikki toimet toistavat tilakanavan määrittämisohjeet. Kullekin laitteelle on tarpeen luoda kaksi kanavaa. Kirjoita jokaiselle kanavalle kanavan tunnus, luku- ja kirjoitusnäppäimet. Me kirjoitamme vain kunkin kanavan ensimmäiseen kenttään. Esimerkki:
Kanavan tunnus 375598 ==> Punainen LED (pumppu)
◦ Kenttä1 = 0 ==> Pump OFF
◦ Kenttä1 = 1 ==> Pump ON
2. Kanavan tunnus 375599 ==> LED vihreä (lamppu)
◦ Kenttä1 = 0 ==> Lamppu POIS
◦ Kenttä 1 = 1 ==> Lamppu palaa
11 lataus- ja testauskooditoimilaitetta Arduniossa.
Kun lähetimme tietoja pilvelle, "kirjoitimme" nämä tiedot ThingSpeakiin. Tilakanava, "lähettämällä" (lähettämällä) nämä tiedot. Nyt meidän on "luettava" tiedot toimilaitekanavalta, "hyväksyttävä" (ladattava) nämä tiedot.
Lähetä tämä lähettämällä GET-merkkijono ja tämä menettely koostuu 3 vaiheesta.
"Käynnistä cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80
Linjan pituus
AT + CIPSEND = 36
Ja itse GET-merkkijono
GET / kanavat / 375598 / kentät / 1 / viimeinen
Kanavat luetaan 10 sekunnin välein
GET: n lähettämisen jälkeen meidän on hyväksyttävä ThingSpeakin vastaus. Vastauksen on oltava joko 0 tai 1 jokaiselle kanavalle. Jos on muita arvoja, niin emme yksinkertaisesti sivuuta niitä.
Tärkein ero tämän osan ja edellisen välillä on vain funktiossa readThingSpeak (merkkijonon tunnus)
Alla on koodi, joka suorittaa kuvatut toimenpiteet.
// Asutunne
Merkkijono canalID1 = "999999"; // Toimilaite1
Merkkijono canalID2 = "999999"; // Toimilaite2
#sisältää
SoftwareSerial EspSerial (6, 7); // Rx, Tx
#define HARDWARE_RESET 8
// Ajastimien kanssa käytettävät muuttujat
pitkä readTimingSeconds = 10; // ==> Määritä näytteenottoaika sekunteina tietojen vastaanottamiseksi
pitkä startReadTiming = 0;
kauan kulunutReadTime = 0;
// Releet
#define ACTUATOR1 10 // PUNAINEN LED ==> Pumppu
#define ACTUATOR2 12 // VIHREÄ LED ==> Lamppu
boolean pump = 0;
boolean lamppu = 0;
int vara = 0;
boolen virhe;
tyhjä asennus ()
{
Serial.begin (9600);
pinMode (ACTUATOR1, OUTPUT);
pinMode (ACTUATOR2, OUTPUT);
pinMode (HARDWARE_RESET, OUTPUT);
digitalWrite (ACTUATOR1, HIGH); // o modeulo relé é ativo em LOW
digitalWrite (ACTUATOR2, HIGH); // o modeulo relé é ativo em LOW
digitalWrite (HARDWARE_RESET, HIGH);
EspSerial.begin (9600); // Comunicacao com Modulo WiFi
EspHardwareReset (); // Palauta Modulo WiFi
startReadTiming = millis (); // "kellon" käynnistäminen
}
tyhjä silmukka ()
{
alku: // tarra
virhe = 0;
elapsedReadTime = millis () - startReadTiming;
if (kulunutReadTime> (readTimingSeconds * 1000))
{
int-komento = readThingSpeak (canalID1);
if (komento! = 9) pump = komento;
viive (5000);
komento = readThingSpeak (canalID2);
if (komento! = 9) lamppu = komento;
takeActions ();
startReadTiming = millis ();
}
if (virhe == 1) // Lähetä uudelleen, jos lähetys ei ole valmis
{
Serial.println ("<<<< VIRHE >>>>");
viive (2000);
aloita; // siirry etikettiin "start"
}
}
/ ********* Suorita toimenpiteet perustuen ThingSpeak-komentoihin ************* /
mitätöntoimenpiteet (tyhjä)
{
Serial.print ("Pump:");
Serial.println (pumppu);
Serial.print ("Lamppu:");
Serial.println (lamppu);
if (pump == 1) digitalWrite (ACTUATOR1, LOW);
else digitalWrite (ACTUATOR1, HIGH);
if (lamppu == 1) digitalWrite (ACTUATOR2, LOW);
else digitalWrite (ACTUATOR2, HIGH);
}
/ ********* Lue Toimilaitteet-komento ThingSpeakista ************* /
int readThingSpeak (merkkijonon tunnus)
{
startThingSpeakCmd ();
int komento;
// preparacao da merkkijono GET
Merkkijono getStr = "GET / kanavat /";
getStr + = kanavaID;
getStr + = "/ kentät / 1 / viimeinen";
getStr + = "\ r \ n";
Merkkijono messageDown = sendThingSpeakGetCmd (getStr);
if (messageDown [5] == 49)
{
komento = messageDown [7] -48;
Serial.print ("Komento vastaanotettu:");
Serial.println (komento);
}
else komento = 9;
paluukomento;
}
/ ********* Palauta ESP ************* /
tyhjä EspHardwareReset (tyhjä)
{
Serial.println ("Nollataan .......");
digitalWrite (HARDWARE_RESET, LOW);
viive (500);
digitalWrite (HARDWARE_RESET, HIGH);
viivästyminen (8000); // Tempo välttämätön para começar a ler
Serial.println ("RESET");
}
/ ********* Aloita viestintä ThingSpeakin kanssa ************** /
tyhjä startThingSpeakCmd (tyhjä)
{
EspSerial.flush (); // limpa o puskuri antaa gravarin käyttöön
Merkkijono cmd = "AT + CIPSTART = \" TCP \ ", \" ";
cmd + = "184.106.153.149"; // Endereco IP de api.thingspeak.com
cmd + = "\", 80 ";
EspSerial.println (cmd);
Serial.print ("enviado ==> Käynnistä cmd:");
Serial.println (cmd);
if (EspSerial.find ("Virhe"))
{
Serial.println ("AT + CIPSTART-virhe");
palata;
}
}
/ ********* lähetä GET cmd ThingSpeakiin ************* /
Merkkijono sendThingSpeakGetCmd (merkkijono getStr)
{
Merkkijono cmd = "AT + CIPSEND =";
cmd + = merkkijono (getStr.length ());
EspSerial.println (cmd);
Serial.print ("enviado ==> pituus cmd:");
Serial.println (cmd);
if (EspSerial.find ((char *) ">"))
{
EspSerial.print (getStr);
Serial.print ("enviado ==> getStr:");
Serial.println (getStr);
viivytys (500); // tempo para processar o GET, sem este delay apresenta kiire varattu ei próximo comando
Merkkijono messageBody = "";
kun taas (EspSerial.a available ())
{
Merkkijono = EspSerial.readStringUntil ('\ n');
if (juovan pituus () == 1)
{// todellinen sisältö alkaa tyhjän rivin jälkeen (jonka pituus on 1)
messageBody = EspSerial.readStringUntil ('\ n');
}
}
Serial.print ("MessageBody vastaanotettu:");
Serial.println (messageBody);
paluu messageBody;
}
muu
{
EspSerial.println ("AT + CIPCLOSE"); // hälytyskäyttäjä
Serial.println ("ESP8266 CIPSEND ERROR: RESENDING"); // Lähetä uudelleen ...
vapaa = vara + 1;
virhe = 1;
palauta "virhe";
}
}
Voit ladata sen osoitteesta
12 komentojen lähettämistä laitteille
Tässä vaiheessa meillä on konfiguroitu toimilaitekanava, joka muuttaa kentän 1 arvoa jokaiselle laitteelle. Meidän on varmistettava, että laitteet toimivat komennot oikein. Projektin lopussa tähän käytetään android-sovellusta, mutta se voidaan tehdä myös selaimen kautta.
Kytke pumppu päälle (punainen LED palaa)
https://api.thingspeak.com/update?api_key=Сохраненный_ключ_канала_1&field1=1
Pumppu pois (punainen LED ei pala)
https://api.thingspeak.com/update?api_key=Tallennettu Channel_key_1 & field1 = 0
Kytke lamppu päälle (vihreä LED palaa)
https://api.thingspeak.com/update?api_key=Tallennettu Channel_key_2 & field1 = 1
Sammuta lamppu (vihreä LED ei pala)
https://api.thingspeak.com/update?api_key=Tallennettu kanava_avain2 ja kenttä1 = 0
14 Android-ohjelman päättäminen
Edellisessä osassa oli yksinkertainen ohjelma, joka “luki” tiedot kanavalta ja näytti ne näytöllä. Nyt meidän on tehtävä ohjelmasta “kirjoittamaan” komennot toimilaitteen Channaliin, jotta ohjain voi lukea nämä komennot ja lamppu pumpun kanssa toimivat vastaavasti.
Jotta käyttäjä voi lähettää komentoja, sovelluksessa on kaksi painiketta jokaista laitetta kohti. Jos päällä, sininen, jos pois päältä, punainen.
Napsauttamalla sovelluksen painikkeita näet tulos sarjanäytössä.
Koodin voi ladata osoitteesta
15 Lopullinen kokoonpano
Tässä vaiheessa on täysin valmis android-sovellus, täysin koottu “rauta” osa, mutta ohjaimessa ei ole koodia, joka jatkuvasti luettaisiin tietoja ja lähettäisi komentoja pilvelle. Sinun tarvitsee vain yhdistää kaikki aiemmin kirjoitetun koodin fragmentit.Koodissa on tietysti ylimääräisiä vahvistusvaihtoehtoja (esimerkiksi jos ESP-01 jäätyy). Tätä varten ajoittain, ennen jokaista luku- tai kirjoituskomentoa, AT-komento lähetetään.Ja jos vastaus OK ei tullut moduulista, moduuli käynnistetään pakollisesti ohjelmallisesti.
Koko projektikoodi voidaan ladata osoitteesta
Osoitteesta voit saada päivityksiä ohjelmatiedostoihin.
Voit myös lukea kommentteja lähdelinkkiin, jos jotain ei ole selvää.