» elektronika » Težak »Upravljanje staklenikom ili staklenikom s bilo kojeg mjesta na svijetu (primjer implementacije)

Upravljanje staklenikom ili staklenikom s bilo kojeg mjesta na svijetu (primjer implementacije)

1 Koncept uređaja



Svrha ovog razvoja je prikupljanje podataka s lokalnih senzora, slanje tih podataka na Internet. Korisnik će moći bilo gdje u svijetu pregledati podatke koji dolaze sa senzora i daljinski odlučiti o aktiviranju određenih aktuatora koji će biti locirani pored senzora.

Projekt koristi Težak UNO i WiFi modul ESP8266-01. Podaci će se prenositi u oblak putem web usluge ThingSpeak.com, a uređaji će se aktivirati putem android aplikacije razvijene pomoću MIT AppInventor.

Upravljanje staklenikom ili staklenikom s bilo kojeg mjesta na svijetu (primjer implementacije)


IoT je koncept računalne mreže fizičkih objekata ("stvari") opremljenih ugrađenim tehnologijama za interakciju jedni s drugima ili s vanjskim okruženjem, organizaciju takvih mreža smatra fenomenom koji može obnoviti ekonomske i društvene procese, eliminirajući potrebu za ljudskim sudjelovanjem iz dijela akcija i operacija.


Glavni fokus ovog IoT projekta bit će usluga ThingSpeak.com. Lokalni UNO / ESP-01 uređaj prima podatke od senzora i podatke o statusu pokretača, šalje ih na Internet snimanje putem određenog kanala statusa ThingSpeak.com (ThingSpeak.com Status Channel), kao i isti lokalni uređaj prima podatke, " čitanje ”s drugog podatkovnog kanala -“ kanala izvršnih uređaja ”(ThingSpeak.com Actuator Channels).



Podaci će se prikupljati pomoću senzora temperature i relativne vlage, temperature tla i vlažnosti tla i senzora ambijentalne svjetlosti. Ti će podaci biti poslani u oblak usluge ThingSpeak.

Postojat će dva izvršna uređaja - ovo je vodena električna pumpa i svjetiljka. Njihov status ON / OFF također će biti poslan u oblak. Podaci senzora, na primjer, mogu prikazati trenutno stanje staklenika ili staklenika. Korisnik će kontrolirati izvršne uređaje pomoću android aplikacije.


2 Popis potrebnih komponenti



Sve su poveznice samo u informativne svrhe.






2 x LED (crvena i zelena)
1 x
- $3.00
220V svjetiljka
Otpornik 2 x 330 ohm (koristi se sa LED)
Otpornik 2 x 10 K ohm (koristi se s DHT22 i LDR)
Otpornik 1 x 4K7 ohm (koristi se s DS18B20)
prototipova odbora
skakači
Vanjsko napajanje za relejni napon 5V

3 željezni dio



Sada morate spojiti sve senzore, kao što je prikazano na dijagramu.



Idealno rješenje bi bilo sastaviti i testirati projekt u dijelovima.

U sljedećem slijedu:
1. Instalirajte i testirajte sve senzore
2.Instalirajte i minimalno konfigurirajte ESP-01
3. Promijenite postavljanje ESP-01 u konačnu konfiguraciju i test
4. Konfigurirajte ThingSpeak statusni kanal
5. Instalirajte ThingSpeak kôd na Arduino i provjerite stanje senzora u oblaku
6. Razviti prvu verziju programa na androidu za provjeru poruka o stanju senzora
7. Ugradite pogone
8. Konfigurirajte kanale pokretača ThingSpeak
9. Instalirajte i testirajte kôd izvršnih uređaja na Arduino
10. Napravite drugu verziju programa na androidu za cijeli sklop uređaja.

4 Priključak senzora





Projekt koristi neke knjižnice koje su uključene u. Potrebno je provjeriti njihovu dostupnost. Početna konfiguracija ovih knjižnica je sljedeća:
// DS18B20
#include 
#include 
#define ONE_WIRE_BUS 5 // DS18B20 na pin D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
int zemljaTemp = 0;

// DHT
#include "DHT.h"
#include 
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;

// LDR (svjetlost)
#define ldrPIN 1
int svjetlost = 0;

// Vlažnost tla
#define zemljaHumPIN 0
int zemljaHum = 0;


Sada inicijaliziramo naše senzore i prikazujemo ih u terminalu:
postavljanje praznine ()
{
  Serijski počet (9600);
  DS18B20.begin ();
  dht.begin ();
}

void petlja ()
{
  readSensors ();
  displaySensors ();
  kašnjenje (10000);
}

I na kraju, napisat ćemo dvije funkcije: jedna očitava očitanja s senzora, a druga prikazuje ih na ekranu:
/ ********* Pročitajte vrijednost senzora ************* /
void readSensors (praznina)
{
  airTemp = dht.readTemperature ();
  airHum = dht.readHumidity ();

  DS18B20.requestTemperatures ();
  zemljaTemp = DS18B20.getTempCByIndex (0); // Senzor 0 snimit će Temp tla u Celzijusu
  
  zemljaHum = karta (analogRead (zemljaHumPIN), 1023, 0, 0, 100);
 
  light = karta (analogRead (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> svjetlost 100%

}

/ ********* Senzori prikaza vrijednosti ************* /
neispravni prikaz Senzori (praznina)
{
  Serijski.print ("airTemp (oC):");
  Serijski.println (airTemp);
  Serijski.print ("airHum (%):");
  Serijski.println (airHum);
  Serijski.print ("zemljaTemp (oC):");
  Serijski.println (zemljaTemp);
  Serijski.print ("zemljaHum (%):");
  Serijski.println (zemljaHum);
  Serijski.print ("svjetlost (%):");
  Serijski.println (svjetlo);
  Serial.println ("");
}


Fotografija prikazuje kako se podaci prikazuju na zaslonu.


Izvorni kod se može preuzeti od autora.

4 osnovna konfiguracija ESP8266-01



Najbrži način "razgovora" s modulom je naredba AT. Procesor već ima AT naredbeni procesor. Modul se tvornički postavlja s tvorničkim postavkama od 115200 baud, u postavkama morate postaviti 9600 baud-a.

Prvo, morate povezati modul, kao što je prikazano na fotografiji



( Imajte na umu da je Tx terminal ESP-01 spojen na Tx terminal UNO-a, baš kao što su Rx terminali spojeni jedan s drugim. Ta će se veza kasnije promijeniti. ).

Zatim spojite UNO na računalo, otvorite IDE i preuzmite primjer koji se nalazi. Ovo je prazan kod kako ne bi došlo do sukoba između ESP-01 i UNO. Ovaj je kôd postavljen u Ardunio prije nego što je na njega priključio ESP-01, kako bi bili sigurni da Ardunio neće koristiti igle Tx i Rx za ništa drugo.
Sada morate otvoriti IDE serijski monitor, postaviti postavke brzine prijenosa na 115200 u postavkama i poslati AT naredbu na IDE Serial Monitor. ESP-01 bi trebao poslati odgovor u redu

Sada morate promijeniti brzinu podataka u modulu ESP-01. Da biste to učinili, u IDE-u dajte naredbu

AT + CIOBAUD = 9600


Može se dogoditi da se ESP-01 vrati na tvorničke postavke, tada ćete morati koristiti drugu naredbu:

AT + UART_DEF = , , , , 


Na primjer 9600 baud / 8 podataka bita / 1 zaustavni bita i nijedan paritet i kontrola protoka

AT + UART_DEF = 9600,8,1,0,0


Sada promijenite brzinu prijenosa podataka u IDE postavkama u 9600 i pošaljite AT naredbu, trebao bi stići odgovor OK.
Zatim trebate prebaciti modul u STA način kako bi se mogao povezati s pristupnom točkom vaše mreže.

AT + CWMODE = 1


Da bi se modul povezao s mrežom, unesite naredbu AT + CWJAP = "naziv mreže", "ime mreže"gdje NETWORK_NAME Je ime vaše mreže i network_name_1 - lozinka za vašu mrežu (lozinka i naziv mreže moraju biti u navodnicima)
Ako vidite odgovor WIFI POVEZANO WIFI DOBIO IP, tada je veza uspostavljena. Pomoću naredbe provjerite IP adresu
AT + CIFSR
.

Adresa koja se pojavljuje na vašem monitoru i koju biste mogli koristiti u budućnosti. Nakon što ste konfigurirali modul, možete ga trajno povezati, ali za to trebate promijeniti njegov prekidački krug, kao što je prikazano na slici.


• ESP-01 RX (žuto) -> UNO Pin D7
• ESP-01 TX (narančasta) -> UNO Pin D6
• ESP-01 Ch-Pd (smeđa) -> Vcc (3.3V)
• ESP-01 Reset (plava) -> UNO Pin D8
• ESP-01 Vcc (crveno) -> 3.3V
• ESP-01 Gnd (crna) -> UNO GND

Imajte na umu da softverska serijska biblioteka koristi UNO Pin D7 pin poput tx i povezuje se s izlazom ESP-01 RXdok UNO Pin D6 poput rxspojen na ESP-01 TX.

Unesite mali kod da biste provjerili ispravnost veze i konfiguracije ESP-01 modula
#include 
SoftwareSerial esp8266 (6.7); // Rx ==> Pin 6; TX ==> Pin7

#define brzina8266 9600

postavljanje praznine ()
{
  esp8266.begin (brzina8266);
  Serijski.početka (brzina8266);
  Serial.println ("ESP8266 test za postavljanje - koristite AT koomande");
}

void petlja ()
{
  dok (esp8266.available ())
  {
    Serial.write (esp8266.read ());
  }
  dok (Serijski.available ())
  {
    esp8266.write (Serial.read ());
  }
}


Sada nekoliko AT timova. Pogledajte rezultate u serijskom monitoru.



* AT =====> ESP8266 vraća OK
* AT + RST =====> ESP8266 ponovno pokreni i vrati u redu
* AT + GMR =====> ESP8266 vraća AT verziju; SDK verzija; id; U redu
* AT + CWMODE? => ESP8266 vraća vrstu načina rada
* AT + CWLAP ===> ESP8266 vraća bliske pristupne točke
* AT + CIFSR ===> ESP8266 vraća označeni IP

Programski kod možete preuzeti na

6 spajanje senzora i ESP-01




Nakon što su svi senzori spojeni i provjereni, kao i provjera ESP-01 modula, potrebno je pripremiti podatke za slanje na Internet.

7 ThingSpeak





Jedan od najvažnijih dijelova projekta je otvorena IoT platforma, koja će vam omogućiti prikupljanje podataka s senzora, obradu i analizu istih. Da biste to učinili, idite na i otvorite svoj račun. Zatim trebate stvoriti kanal na kojem će se nalaziti 2 aktuatora, 5 senzora i jedno rezervno polje.
• Polje 1: Aktivator 1 (uređaj 1)
• Polje 2: Aktivator 2 (uređaj 2)
• Polje 3: Temperatura zraka u oC (temperatura zraka u stupnjevima Celzijusa)
• Varalica 4: Relativna vlaga zraka u% (Relativna vlaga u%)
• Polje 5: Temperatura tla u oC (Temperatura tla u gr. Celzijusa)
• Polje 6: Vlažnost tla u% (vlaga tla u%)
• Polje 7: Osvjetljenje u% (osvjetljenje u%)
• Polje 8: Rezervni

Polje 8 rezervirano je za buduće proširenje ili za uklanjanje pogrešaka. U ovom se projektu koristi kao brojač pogreške komunikacije između Arduino / ESP-01 i ThingSpeak.com.

Nakon što stvorite Statusni kanal, morate snimiti tipke, kao što je prikazano na fotografiji.

8 Slanje statusa senzora u oblak



Trenutno imamo konfiguriranu uslugu oblaka i naši senzori prikupljaju podatke lokalno. Sada morate uzeti ove podatke i poslati ih u oblak na ThingSpeak.com.

Kako biste upisali podatke u ThingSpeak kanal, potrebno je poslati GET niz. To će biti učinjeno u tri faze.
Pošaljite naredbu "Start cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80

Daljnja duljina niza

AT + CIPSEND = 116


I na kraju, GET niz koji će upisati naše podatke u rezervirana polja Status Channel.

GET / update? Api_key = your_saved_key_here & field1 = pump & fieldlamp = 0 & field3 = airTemp & field4 = airHum & field5 = zemljaTemp & field6 = zemljaHum & field7 = svjetlo i polje8 = rezervno


Napominjemo da ne bismo trebali pisati podatke na kanal više od 1 puta u 16 sekundi.

Predani kod učinit će sve to.
// Thingspeak
String statusChWriteKey = "VAŠ PISATI KLJUČ OVDJE"; // Status kanala ID: 385184

#include 
SoftwareSerial EspSerial (6, 7); // Rx, Tx
#define HARDWARE_RESET 8

// DS18B20
#include 
#include 
#define ONE_WIRE_BUS 5 // DS18B20 na pin D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
int zemljaTemp = 0;

// DHT
#include "DHT.h"
#include 
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;

// LDR (svjetlost)
#define ldrPIN 1
int svjetlost = 0;

// Vlažnost tla
#define zemljaHumPIN 0
int zemljaHum = 0;

// Varijable koje se koriste s timerima
long writeTimingSeconds = 17; // ==> Odredite vrijeme uzorka u sekundama za slanje podataka
long startWriteTiming = 0;
dugo prošaoWriteTime = 0;

// Varijable koje se koriste s pokretačima
buola pumpa = 0;
boole lampica = 0;

int rezervni = 0;
logička pogreška;

postavljanje praznine ()
{
  Serijski počet (9600);
  
  pinMode (HARDWARE_RESET, OUTPUT);
  
  digitalWrite (HARDWARE_RESET, HIGH);
  
  DS18B20.begin ();
  dht.begin ();

  EspSerial.begin (9600); // Comunicacao com Modulo WiFi
  EspHardwareReset (); // Poništi modul WiFi
  startWriteTiming = millis (); // pokretanje "programskog sata"
}

void petlja ()
{
  početak: // oznaka
  greška = 0;
  
  elapsedWriteTime = millis () - startWriteTiming;
  
  if (prošloWriteTime> (writeTimingSeconds * 1000))
  {
    readSensors ();
    writeThingSpeak ();
    startWriteTiming = millis ();
  }
  
  if (error == 1) // Resend ako prijenos nije završen
  {
    Serial.println ("<<<< GREŠKA >>>>");
    kašnjenje (2000);
    ići na početak; // idi na oznaku "start"
  }
}

/ ********* Pročitajte vrijednost senzora ************* /
void readSensors (praznina)
{
  airTemp = dht.readTemperature ();
  airHum = dht.readHumidity ();

  DS18B20.requestTemperatures ();
  zemljaTemp = DS18B20.getTempCByIndex (0); // Senzor 0 snimit će Temp tla u Celzijusu
             
  light = karta (analogRead (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> svjetlost 100%
  zemljaHum = karta (analogRead (zemljaHumPIN), 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 (pumpa);
  getStr + = "& field2 =";
  getStr + = string (lampica);
  getStr + = "& field3 =";
  getStr + = string (airTemp);
  getStr + = "& field4 =";
  getStr + = string (airHum);
  getStr + = "& field5 =";
  getStr + = String (zemljaTemp);
  getStr + = "& field6 =";
  getStr + = String (zemljaHum);
  getStr + = "& field7 =";
  getStr + = string (light);
  getStr + = "& field8 =";
  getStr + = string (rezervno);
  getStr + = "\ r \ n \ r \ n";

  sendThingSpeakGetCmd (getStr);
}

/ ********* Poništi ESP ************* /
void EspHardwareReset (praznina)
{
  Serial.println ("Ponovno postavljanje .......");
  digitalWrite (HARDWARE_RESET, LOW);
  kašnjenje (500);
  digitalWrite (HARDWARE_RESET, HIGH);
  kašnjenje (8000); // Tempo Requário para começar a ler
  Serial.println ("RESET");
}

/ ********* Započnite komunikaciju s 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:");
  Serijski.println (cmd);

  ako (EspSerial.find ("Pogreška"))
  {
    Serial.println ("AT + CIPSTART error");
    povratak;
  }
}

/ ********* poslati GET cmd na ThingSpeak ************* /
String sendThingSpeakGetCmd (String getStr)
{
  String cmd = "AT + CIPSEND =";
  cmd + = string (getStr.length ());
  EspSerial.println (cmd);
  Serial.print ("enviado ==> dužina cmd:");
  Serijski.println (cmd);

  ako (EspSerial.find ((char *) ">"))
  {
    EspSerial.print (getStr);
    Serial.print ("enviado ==> getStr:");
    Serijski.println (getStr);
    kašnjenje (500); // tempo para procesor o GET, sem odugovlačenje apresenta zauzet bez próximo comando

    String messageBody = "";
    dok (EspSerial.available ())
    {
      String line = EspSerial.readStringUntil ('\ n');
      ako je (line.length () == 1)
      {// stvarni sadržaj započinje nakon praznog retka (koji ima dužinu 1)
        messageBody = EspSerial.readStringUntil ('\ n');
      }
    }
    Serial.print ("Poruka je primljena:");
    Serial.println (messageBody);
    povratna porukaBody;
  }
  drugo
  {
    EspSerial.println ("AT + CIPCLOSE"); // upozoriti korisnika
    Serial.println ("GREŠKA CIPSEND ESP8266: ODGOVORNO"); // Ponovno poslati ...
    rezervni = rezervni + 1;
    pogreška = 1;
    vratiti "greška";
  }
}

Napredak možete vidjeti u Serijskom monitoru.

Izvorni kôd možete preuzeti na

9 Android aplikacija - prvi dio



Prvo morate stvoriti korisničko sučelje. Na slici su prikazani glavni vidljivi i nevidljivi elementi.



Nakon toga, morate stvoriti blokove. Stavke izbornika odgovaraju brojevima zaslona.

1 Državne varijable koje bi trebale biti proglašene globalnim

2 Svake dvije sekunde (ovisno o Clock1) poziva se postupak "ReadArduino"


Postupak vraća vrijednost varijabli koje bi se trebale prikazati na zaslonu. U ovom slučaju, državna vrijednost (0 i 1) za pogone se pretvara u "ON" i "OFF" radi bolje percepcije.

Te vrijednosti (status) bit će prikazane u odgovarajućim "prečacima"

3 Rutina readArduino u biti će čitati statusni kanal u ThingSpeak. Dakle, trebate odrediti URL koji će biti poslan u Thingspeak. Da biste to učinili, 3 globalne varijable moraju biti deklarirane i kombinirane kako bi se stvorio URL koji će biti poslan ThingSpeak. GET treba poslati na web-komponentu koja se zove «ArduFarmBotStatusCh»

4 Tekst primljen iz prethodne naredbe stići će u JSon formatu. Ovaj tekst treba obraditi tako da se svako polje pročita i pohrani u odgovarajuću globalnu varijablu.

5 Posljednje što treba učiniti je nazvati postupak "Alarm", koji će analizirati stanje dva senzora tla. Ako je temperatura preniska (u našem slučaju 10oC), trebala bi se prikazati poruka. Isto vrijedi i za vlagu ako je ispod 60%.

Imajte na umu da smo definirali drugi tajmer (Clock2), programiran tako da ga pokreće svake sekunde. Potrebno je samo "prebaciti" boju teksta poruke (s bijele na crvenu). Poruka će treptati.

Kod za prijavu možete preuzeti na

10 Priključivanje pogona




Naredbe za uključivanje i isključivanje crpke i svjetiljke primaju se na daljinu. Ardunioov izlaz aktivirat će relej i LED, uzimajući ove naredbe. Na slici je prikazano kako se aktuatori trebaju spojiti. Imajte na umu da je GND relejni izlaz NIJE POVEZAN na GND izlazUNO. Na ovaj način će biti manje smetnji napajanja kada se relej pokreće.

11 konfiguracija aktuatora kanala (Kanali pokretača)




Sve radnje ponavljaju postupak konfiguriranja kanala Status. Za svaki od uređaja potrebno je stvoriti dva kanala. Za svaki kanal upišite ID kanala, tipke za čitanje i pisanje. Pisat ćemo samo u prvom polju svakog kanala. Na primjer:
ID kanala 375598 ==> LED crveno (pumpa)
◦ Field1 = 0 ==> Pumpa isključena
◦ Field1 = 1 ==> Pumpa je UKLJUČENA
2. ID kanala 375599 ==> LED zelena (žarulja)
◦ Polje1 = 0 ==> Svjetiljka je isključena
◦ Polje1 = 1 ==> Svjetiljka je uključena

11 aktivatora utovara i testiranja koda u Arduniju.



Kad smo podatke poslali u oblak, te podatke smo ih "upisali u ThingSpeak. Statusni kanal," prijenos "(prijenos) tih podataka. Sada moramo "pročitati" podatke sa Aktivatora, "prihvaćajući" (preuzimajući) ove podatke.

Da biste to učinili, pošaljite GET niz i ovaj postupak se sastoji od 3 faze.
"Pokreni cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80

Duljina crte
AT + CIPSEND = 36

I sam GET string
GET / kanali / 375598 / polja / 1 / zadnji

Kanali će se "čitati" svakih 10 sekundi

Nakon slanja GET-a, moramo prihvatiti odgovor od ThingSpeak-a. Odgovor mora biti 0 ili 1, za svaki kanal. Ako postoje bilo koje druge vrijednosti, onda ih jednostavno ignoriramo.

Glavna razlika između ovog dijela i prethodnog je samo u funkciji readThingSpeak (string string ID)
Ispod je kôd koji izvodi opisane radnje.

// Thingspeak
String canalID1 = "999999"; // Aktuator1
String canalID2 = "999999"; // Aktuator2

#include 
SoftwareSerial EspSerial (6, 7); // Rx, Tx
#define HARDWARE_RESET 8

// Varijable koje se koriste s timerima
dugo čitanjeTimingSekundi = 10; // ==> Odredite vrijeme uzorka u sekundi za primanje podataka
long startReadTiming = 0;
dugo protekloReadTime = 0;

// Releji
#define ACTUATOR1 10 // CRVENA LED ==> Crpka
#define ACTUATOR2 12 // ZELENA LED ==> Svjetiljka
buola pumpa = 0;
boole lampica = 0;

int rezervni = 0;
logička pogreška;

postavljanje praznine ()
{
  Serijski počet (9600);
  
  pinMode (ACTUATOR1, OUTPUT);
  pinMode (ACTUATOR2, OUTPUT);
  pinMode (HARDWARE_RESET, OUTPUT);

  digitalWrite (ACTUATOR1, HIGH); // o módulo relé é ativo em NISKO
  digitalWrite (ACTUATOR2, HIGH); // o módulo relé é ativo em NISKO
  digitalWrite (HARDWARE_RESET, HIGH);

  EspSerial.begin (9600); // Comunicacao com Modulo WiFi
  EspHardwareReset (); // Poništi modul WiFi
  startReadTiming = millis (); // pokretanje "programskog sata"
}

void petlja ()
{
  početak: // oznaka
  greška = 0;
  
  elapsedReadTime = millis () - startReadTiming;

  ako (prošloReadTime> (readTimingSeconds * 1000))
  {
    naredba int = readThingSpeak (canalID1);
    ako (naredba! = 9) pump = naredba;
    kašnjenje (5000);
    naredba = readThingSpeak (canalID2);
    ako (naredba! = 9) lampica = naredba;
    poduzimanja ();
    startReadTiming = millis ();
  }
  
  if (error == 1) // Resend ako prijenos nije završen
  {
    Serial.println ("<<<< GREŠKA >>>>");
    kašnjenje (2000);
    ići na početak; // idi na oznaku "start"
  }
}

/ ********* Poduzmite akcije na temelju ThingSpeak naredbi ************* /
nevažeće akcije (praznine)
{
  Serijski.print ("Pump:");
  Serijski.println (pumpa);
  Serijski.print ("Svjetiljka:");
  Serijski.println (svjetiljka);
  if (pumpa == 1) digitalWrite (AKTUATOR1, NISKO);
  inače digitalWrite (ACTUATOR1, HIGH);
  if (lampica == 1) digitalWrite (ACTUATOR2, LOW);
  inače digitalWrite (ACTUATOR2, HIGH);
}

/ ********* pročitajte naredbu pokretača iz ThingSpeaka ************* /
int readThingSpeak (string stringID)
{
  startThingSpeakCmd ();
  naredba int;
  // preparacao da string GET
  String getStr = "GET / kanali /";
  getStr + = channelID;
  getStr + = "/ polja / 1 / zadnji";
  getStr + = "\ r \ n";

  String messageDown = sendThingSpeakGetCmd (getStr);
  ako (porukaDown [5] == 49)
  {
    naredba = porukaDown [7] -48;
    Serial.print ("Naredba je primljena:");
    Serial.println (naredba);
  }
  command naredba = 9;
  naredba za povratak;
}

/ ********* Poništi ESP ************* /
void EspHardwareReset (praznina)
{
  Serial.println ("Ponovno postavljanje .......");
  digitalWrite (HARDWARE_RESET, LOW);
  kašnjenje (500);
  digitalWrite (HARDWARE_RESET, HIGH);
  kašnjenje (8000); // Tempo Requário para começar a ler
  Serial.println ("RESET");
}

/ ********* Započnite komunikaciju s 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:");
  Serijski.println (cmd);

  ako (EspSerial.find ("Pogreška"))
  {
    Serial.println ("AT + CIPSTART error");
    povratak;
  }
}

/ ********* poslati GET cmd na ThingSpeak ************* /
String sendThingSpeakGetCmd (String getStr)
{
  String cmd = "AT + CIPSEND =";
  cmd + = string (getStr.length ());
  EspSerial.println (cmd);
  Serial.print ("enviado ==> dužina cmd:");
  Serijski.println (cmd);

  ako (EspSerial.find ((char *) ">"))
  {
    EspSerial.print (getStr);
    Serial.print ("enviado ==> getStr:");
    Serijski.println (getStr);
    kašnjenje (500); // tempo para procesor o GET, sem odugovlačenje apresenta zauzet bez próximo comando

    String messageBody = "";
    dok (EspSerial.available ())
    {
      String line = EspSerial.readStringUntil ('\ n');
      ako je (line.length () == 1)
      {// stvarni sadržaj započinje nakon praznog retka (koji ima dužinu 1)
        messageBody = EspSerial.readStringUntil ('\ n');
      }
    }
    Serial.print ("Poruka je primljena:");
    Serial.println (messageBody);
    povratna porukaBody;
  }
  drugo
  {
    EspSerial.println ("AT + CIPCLOSE"); // upozoriti korisnika
    Serial.println ("GREŠKA CIPSEND ESP8266: ODGOVORNO"); // Ponovno poslati ...
    rezervni = rezervni + 1;
    pogreška = 1;
    vratiti "greška";
  }
}


Možete ga preuzeti na

12 slanje naredbi uređajima



U ovoj fazi imamo konfigurirani kanal aktuatora koji mijenja vrijednost polja 1 za svaki uređaj. Moramo potvrditi da uređaji pravilno rade naredbe. Na kraju projekta koristit će se android aplikacija za to, ali može se i putem preglednika.

Uključite crpku (uključen crveni LED)
https://api.thingspeak.com/update?api_key=Сохраненный_ключ_канала_1&field1=1

Isključite (crvena LED isključena)
https://api.thingspeak.com/update?api_key=Spremljeni kanal_key_1 & field1 = 0

Uključite lampicu (zeleni LED svijetli)
https://api.thingspeak.com/update?api_key=Spremljeni kanal_key_2 & field1 = 1

Isključite lampicu (zeleni LED isključen)
https://api.thingspeak.com/update?api_key=Spremljeni kanal_key_2 & field1 = 0


14 Završetak android programa




U prethodnom dijelu postojao je jednostavan program koji je "pročitao" podatke s kanala i prikazao ih na zaslonu. Sada moramo napraviti program da „upiše“ naredbe u pogonu kanala, tako da ove naredbe kontroler može očitati i lampica s pumpom radila u skladu s tim.

Kako bi korisnik mogao slati naredbe, aplikacija će imati dva gumba za svaki uređaj. Ako je uključen, plava, ako je isključena, crvena.

Klikom na gumbe u aplikaciji možete vidjeti rezultat u Serijskom nadzorniku.

Kôd se može preuzeti na

15 Završna montaža



U ovoj je fazi potpuno završena android aplikacija, potpuno sastavljen hardverski dio, ali u kontroleru nema koda koji bi stalno čitao podatke i slao naredbe u oblak. Trebate samo kombinirati sve fragmente koda napisane ranije. Naravno, kod ima dodatne mogućnosti provjere (na primjer, ako ESP-01 zamrzne). Da biste to učinili, povremeno se prije svake naredbe za čitanje ili pisanje šalje naredba AT.A ako odgovor u redu nije stigao iz modula, modul se prisilno ponovno pokreće programski.

Cjeloviti kod projekta možete preuzeti na

Na adresi možete dobiti ažuriranja za programske datoteke.

Također možete pročitati komentare na poveznici do izvora, ako nešto nije jasno.
8.3
8.6
8.4

Dodajte komentar

    • osmijehosmjesixaxau redudontknowprostakNea
      gazdaogrebotinabudaladaDa-Daagresivantajna
      oprostiteplesdance2dance3pomilovanjepomoćpića
      zaustavljanjeprijateljidobrogoodgoodzviždaljkapasti u nesvijestjezik
      dimpljeskanjeCrayObjavitepodrugljivdon-t_mentionpreuzimanje
      vrućinaljutitlaugh1MDAsastanakmoskingnegativan
      not_ikokicekaznitičitatiuplašitiplašitraži
      podsmijehthank_youovoto_clueumnikakutansložiti
      lošebeeeblack_eyeblum3rumenilohvalisati sedosada
      cenzuriranizadirkivanjesecret2prijetitipobjedayusun_bespectacled
      shokrespektlolpreveddobrodošlikrutoyya_za
      ya_dobryipomoćnikne_huliganne_othodifludzabranablizu

Savjetujemo vam da pročitate:

Predaj to pametnom telefonu ...