» Ηλεκτρονικά » Arduino »Διαχείριση θερμοκηπίου ή θερμοκηπίου από οπουδήποτε στον κόσμο (παράδειγμα εφαρμογής)

Διαχείριση θερμοκηπίου ή θερμοκηπίου από οπουδήποτε στον κόσμο (παράδειγμα εφαρμογής)

1 ιδέα συσκευής



Σκοπός αυτής της ανάπτυξης είναι η συλλογή δεδομένων από τοπικούς αισθητήρες, η αποστολή αυτών των δεδομένων στο Internet. Ο χρήστης θα είναι σε θέση να δει οπουδήποτε στον κόσμο τα δεδομένα που προέρχονται από τους αισθητήρες και θα αποφασίσει εξ αποστάσεως την ενεργοποίηση ορισμένων ενεργοποιητών που θα βρίσκονται τοπικά, δίπλα στους αισθητήρες

Το έργο χρησιμοποιεί Arduino Μονάδα UNO και WiFi ESP8266-01. Τα δεδομένα θα μεταδοθούν στο σύννεφο μέσω της υπηρεσίας ιστού ThingSpeak.com και οι συσκευές θα ενεργοποιηθούν μέσω της εφαρμογής Android που αναπτύχθηκε με το MIT AppInventor.

Διαχείριση θερμοκηπίου ή θερμοκηπίου από οπουδήποτε στον κόσμο (παράδειγμα εφαρμογής)


Το IoT είναι μια έννοια ενός δικτύου υπολογιστών φυσικών αντικειμένων εξοπλισμένων με ενσωματωμένες τεχνολογίες για αλληλεπίδραση μεταξύ τους ή με το εξωτερικό περιβάλλον, θεωρώντας την οργάνωση τέτοιων δικτύων ως ένα φαινόμενο που μπορεί να ανοικοδομήσει οικονομικές και κοινωνικές διαδικασίες, εξαλείφοντας την ανάγκη για ανθρώπινη συμμετοχή από μέρος ενεργειών και επιχειρήσεων.


Το κύριο μέλημα αυτού του έργου IoT θα είναι η υπηρεσία ThingSpeak.com. Η τοπική συσκευή UNO / ESP-01 λαμβάνει δεδομένα από αισθητήρες και δεδομένα σχετικά με την κατάσταση των ενεργοποιητών, την αποστέλλει στην "εγγραφή" του Διαδικτύου μέσω ενός συγκεκριμένου καναλιού κατάστασης ThingSpeak.com (κανάλι κατάστασης ThingSpeak.com), η ίδια τοπική συσκευή λαμβάνει δεδομένα " την ανάγνωση "από άλλο κανάλι δεδομένων -" το κανάλι εκτελεστικών συσκευών "(κανάλια ενεργοποιητή ThingSpeak.com).



Τα δεδομένα θα συλλέγονται με χρήση αισθητήρα θερμοκρασίας και σχετικής υγρασίας, θερμοκρασίας και υγρασίας εδάφους και αισθητήρα περιβάλλοντος φωτός. Αυτά τα δεδομένα θα σταλούν στο cloud υπηρεσίας ThingSpeak.

Θα υπάρχουν δύο εκτελεστικές συσκευές - αυτή είναι μια ηλεκτρική αντλία νερού και μια λάμπα. Η κατάσταση ON / OFF θα σταλεί επίσης στο νέφος. Τα δεδομένα από αισθητήρες, για παράδειγμα, μπορούν να εμφανίσουν την τρέχουσα κατάσταση ενός θερμοκηπίου ή θερμοκηπίου. Ο χρήστης θα ελέγχει τις εκτελεστικές συσκευές χρησιμοποιώντας την εφαρμογή Android.


2 Λίστα των απαιτούμενων στοιχείων



Όλοι οι σύνδεσμοι προορίζονται μόνο για ενημερωτικούς σκοπούς.






2 x LED (κόκκινο και πράσινο)
1 x
- $3.00
Λαμπτήρας 220V
2 x 330 ohm αντίσταση (χρησιμοποιείται με LED)
2 x 10K ohm αντίσταση (χρησιμοποιείται με DHT22 και LDR)
1 x αντίσταση 4K7 ohm (χρησιμοποιείται με DS18B20)
Breadboard
Jumpers
Εξωτερική παροχή ρεύματος για ρελέ 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 soilTemp = 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 φως = 0;

// Υγρασία εδάφους
#define soilHumPIN 0
int soilHum = 0;


Τώρα αρχικοποιούμε τους αισθητήρες μας και τις εμφανίζουμε στο τερματικό:
void setup ()
{
  Serial.begin (9600);
  DS18B20.begin ();
  dht.begin ();
}}

κενός βρόχος ()
{
  readSensors ();
  displaySensors ();
  καθυστέρηση (10000);
}}

Και τέλος, θα γράψουμε δύο λειτουργίες: η μία διαβάζει τις μετρήσεις από τους αισθητήρες και η άλλη τις εμφανίζει στην οθόνη:
/ ********* Διαβάστε την τιμή των αισθητήρων ************* /
κενές readSensors (κενές)
{
  airTemp = dht.readTemperature ();
  airHum = dht.readΑυματισμός ();

  DS18B20.requestTemperatures ();
  soilTemp = DS18B20.getTempCByIndex (0); // Ο αισθητήρας 0 θα συλλάβει τη Θερμοκρασία εδάφους στο Celcius
  
  soilHum = χάρτης (analogRead (soilHumPIN), 1023, 0, 0, 100).
 
  φως = χάρτης (αναλογικόΔιαβάστε (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> ελαφρύ 100%

}}

/ ********* Τιμή αισθητήρα οθόνης ************* /
άκυρη οθόνηΟι αισθητήρες (κενό)
{
  Serial.print ("airTemp (oC):");
  Serial.println (airTemp);
  Serial.print ("airHum (%):");
  Serial.println (airHum);
  Serial.print ("soilTemp (oC):");
  Serial.println (soilTemp);
  Serial.print ("soilHum (%):");
  Serial.println (soilHum);
  Serial.print ("φως (%):");
  Serial.println (ελαφρύ);
  Serial.println ("");
}}


Η φωτογραφία δείχνει τον τρόπο εμφάνισης των δεδομένων στην οθόνη.


Ο πηγαίος κώδικας μπορεί να μεταφορτωθεί από τον συγγραφέα.

4 Βασική ρύθμιση παραμέτρων ESP8266-01



Ο γρηγορότερος τρόπος για να "μιλήσετε" με την ενότητα είναι η εντολή AT. Ο επεξεργαστής έχει ήδη επεξεργαστή εντολών AT. Από προεπιλογή, η ενότητα διαθέτει εργοστασιακές ρυθμίσεις 115200 baud, πρέπει να ρυθμίσετε 9600 baud στις ρυθμίσεις.

Πρώτον, πρέπει να συνδέσετε τη μονάδα, όπως φαίνεται στη φωτογραφία



( Σημειώστε ότι ο ακροδέκτης Tx του ESP-01 είναι συνδεδεμένος με τον τερματικό Tx του UNO, ακριβώς όπως τα τερματικά Rx είναι συνδεδεμένα μεταξύ τους. Αυτή η σύνδεση θα αλλάξει αργότερα. ).

Στη συνέχεια, συνδέστε το UNO στον υπολογιστή, ανοίξτε το IDE και κατεβάστε το παράδειγμα που βρίσκεται. Αυτός είναι κενός κώδικας, έτσι ώστε να μην υπάρχουν συγκρούσεις μεταξύ του ESP-01 και του UNO. Αυτός ο κώδικας μεταφορτώθηκε στο Ardunio πριν συνδέσει το ESP-01 σε αυτό, για να βεβαιωθεί ότι το Ardunio δεν θα χρησιμοποιήσει τις ακίδες Tx και Rx για οτιδήποτε άλλο.
Τώρα πρέπει να ανοίξετε την σειριακή παρακολούθηση IDE, να ρυθμίσετε την ταχύτητα baud στις 115200 στις ρυθμίσεις και να στείλετε την εντολή AT στην σειριακή οθόνη IDE. Το ESP-01 πρέπει να στείλει μια απάντηση Εντάξει

Τώρα πρέπει να αλλάξετε την ταχύτητα δεδομένων στη μονάδα ESP-01. Για να το κάνετε αυτό, στο IDE, δώστε την εντολή

AT + CIOBAUD = 9600


Μπορεί να συμβεί ότι το ESP-01 επιστρέφει στις εργοστασιακές ρυθμίσεις, τότε θα χρειαστεί να χρησιμοποιήσετε μια άλλη εντολή:

AT + UART_DEF = , , , , <έλεγχος ροής>


Για παράδειγμα 9600 baud / 8 bits δεδομένων / 1 bits stop και κανένας έλεγχος ισοτιμίας και ροής

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


Τώρα αλλάξτε την ταχύτητα μεταφοράς δεδομένων στις ρυθμίσεις IDE σε 9600 και στείλτε την εντολή AT, η απάντηση ΟΚ θα πρέπει να έρθει.
Στη συνέχεια, πρέπει να αλλάξετε τη λειτουργία στη λειτουργία STA, ώστε να μπορεί να συνδεθεί στο σημείο πρόσβασης του δικτύου σας.

AT + CWMODE = 1


Για να συνδέσετε τη μονάδα στο δίκτυο, εισαγάγετε την εντολή AT + CWJAP = "όνομα_δικτύου", "όνομα_δικτύου_1"όπου όνομα δικτύου Είναι το όνομα του δικτύου σας, και 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 ==> Pin 6. TX ==> Pin7

#define speed8266 9600

void setup ()
{
  esp8266.begin (speed8266);
  Serial.begin (speed8266);
  Serial.println ("Δοκιμή εγκατάστασης ESP8266 - χρησιμοποιήστε AT coomands").
}}

κενός βρόχος ()
{
  ενώ (esp8266.available ())
  {
    Serial.write (esp8266.read ());
  }}
  ενώ (Serial.available ())
  {
    esp8266.write (Serial.read ());
  }}
}}


Τώρα μερικές AT ομάδες. Δείτε τα αποτελέσματα στην σειριακή οθόνη.



* AT =====> Το ESP8266 επιστρέφει εντάξει
* AT + RST =====> ESP8266 επανεκκίνηση και επιστροφή OK
* AT + GMR =====> ESP8266 επιστρέφει AT έκδοση? Έκδοση SDK. id; Εντάξει
* AT + CWMODE; => Τύπος λειτουργίας επιστροφής ESP8266
* AT + CWLAP ===> Το ESP8266 επιστρέφει κοντά σημεία πρόσβασης
* AT + CIFSR ===> Το ESP8266 επιστρέφει το καθορισμένο IP

Ο κωδικός του προγράμματος μπορεί να μεταφορτωθεί στο

6 σύνδεση αισθητήρων και ESP-01




Αφού συνδεθούν και ελεγχθούν όλοι οι αισθητήρες, καθώς και η ηλεκτρονική μονάδα ESP-01, πρέπει να ετοιμάσετε τα δεδομένα για αποστολή στο Internet.

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 Αποστολή της κατάστασης αισθητήρα στο νέφος



Προς το παρόν, έχουμε μια διαμορφωμένη υπηρεσία cloud και οι αισθητήρες μας συλλέγουν δεδομένα τοπικά. Τώρα πρέπει να λάβετε αυτά τα δεδομένα και να τα στείλετε στο σύννεφο στο ThingSpeak.com.

Για να γράψετε δεδομένα στο κανάλι ThingSpeak, πρέπει να στείλετε μια συμβολοσειρά GET. Αυτό θα γίνει σε τρία στάδια.
Στείλτε την εντολή "Εκκίνηση cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80

Περαιτέρω μήκος χορδής

AT + CIPSEND = 116


Και τέλος, μια συμβολοσειρά GET που θα γράψει τα δεδομένα μας στα επιλεγμένα πεδία Καναλιού κατάστασης.

Εφαρμογή / ενημέρωση; Api_key = your_saved_key_here & field1 = αντλία & fieldlamp = 0 & field3 = airTemp & field4 = airHum & field5 = soilTemp & field6 = χώμαHum & field7 = light & field8 = spare


Λάβετε υπόψη ότι δεν πρέπει να γράψουμε δεδομένα στο κανάλι περισσότερο από 1 φορά σε 16 δευτερόλεπτα.

Ο υποβαλλόμενος κώδικας θα κάνει όλα αυτά.
// Thingspeak
Κατάσταση συμβολοσειράςChWriteKey = "ΕΓΓΡΑΦΕΙΤΕ ΤΟ ΚΛΕΙΔΙ ΕΔΩ". // Status Channel id: 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 soilTemp = 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 φως = 0;

// Υγρασία εδάφους
#define soilHumPIN 0
int soilHum = 0;

// Μεταβλητές που θα χρησιμοποιηθούν με χρονοδιακόπτες
μακρά WriteTimingSeconds = 17; // ==> Ορίστε το χρόνο δειγματοληψίας σε δευτερόλεπτα για να στείλετε δεδομένα
long startWriteTiming = 0;
long elapsedWriteTime = 0;

// Μεταβλητές που χρησιμοποιούνται με τους ενεργοποιητές
boolean αντλία = 0;
λυχνία boolean = 0;

int spare = 0;
boolean error;

void setup ()
{
  Serial.begin (9600);
  
  pinMode (HARDWARE_RESET, OUTPUT);
  
  ψηφιακή καταγραφή (HARDWARE_RESET, HIGH);
  
  DS18B20.begin ();
  dht.begin ();

  EspSerial.begin (9600); // Comunicacao com Modulo WiFi
  EspHardwareReset (); // Επαναφορά κάντε Modulo WiFi
  startWriteTiming = millis (); // ξεκινώντας το "ρολόι προγράμματος"
}}

κενός βρόχος ()
{
  αρχή: // ετικέτα
  σφάλμα = 0;
  
  elapsedWriteTime = millis () - startWriteTiming;
  
  αν (elapsedWriteTime> (writeTimingSeconds * 1000))
  {
    readSensors ();
    writeThingSpeak ();
    startWriteTiming = millis ();
  }}
  
  αν (σφάλμα == 1) // Επαναλάβετε εάν η μετάδοση δεν έχει ολοκληρωθεί
  {
    Serial.println ("<<<< ΣΦΑΛΜΑ >>>>");
    καθυστέρηση (2000).
    πρέπει να ξεκινήσει? // πηγαίνετε στην ετικέτα "έναρξη"
  }}
}}

/ ********* Διαβάστε την τιμή των αισθητήρων ************* /
κενές readSensors (κενές)
{
  airTemp = dht.readTemperature ();
  airHum = dht.readΑυματισμός ();

  DS18B20.requestTemperatures ();
  soilTemp = DS18B20.getTempCByIndex (0); // Ο αισθητήρας 0 θα συλλάβει τη Θερμοκρασία εδάφους στο Celcius
             
  φως = χάρτης (αναλογικόΔιαβάστε (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> ελαφρύ 100%
  soilHum = χάρτης (analogRead (soilHumPIN), 1023, 0, 0, 100).

}}

/ ********* Conexao com TCP com Thingspeak ******* /
void writeThingSpeak (κενό)
{

  startThingSpeakCmd ();

  // προετοιμασία για τη σειρά GET
  String getStr = "GET / ενημέρωση; 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 + = Σειρά (soilTemp);
  getStr + = "& field6 =";
  getStr + = συμβολοσειρά (soilHum);
  getStr + = "& field7 =";
  getStr + = String (φως);
  getStr + = "& field8 =";
  getStr + = String (spare);
  getStr + = "\ r \ n \ r \ n";

  sendThingSpeakGetCmd (getStr);
}}

/ ********* Επαναφορά ESP ************* /
void EspHardwareReset (κενό)
{
  Serial.println ("Επανεκκίνηση .......");
  ψηφιακήWrite (HARDWARE_RESET, LOW);
  καθυστέρηση (500);
  ψηφιακή καταγραφή (HARDWARE_RESET, HIGH);
  καθυστέρηση (8000), // Tempo nevyhnutário para começar a ler
  Serial.println ("RESET");
}}

/ ********* Ξεκινήστε την επικοινωνία με το ThingSpeak ************* /
void startThingSpeakCmd (κενό)
{
  EspSerial.flush (); / / limpa o buffer πριν από την προσθήκη ενός gravar
  
  Σειρά cmd = "AT + CIPSTART = \" TCP \ ", \" ";
  cmd + = "184.106.153.149". // Endereco IP de api.thingspeak.com
  cmd + = "\", 80 ".
  EspSerial.println (cmd);
  Serial.print ("enviado ==> Εκκίνηση cmd:");
  Serial.println (cmd);

  αν (EspSerial.find ("Σφάλμα"))
  {
    Serial.println ("σφάλμα AT + CIPSTART");
    επιστροφή
  }}
}}

/ ********* στείλετε ένα GET cmd στο ThingSpeak ************* /
Σειρά sendThingSpeakGetCmd (String getStr)
{
  Σειρά cmd = "AT + CIPSEND =";
  cmd + = συμβολοσειρά (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), // tempo para processar o GET, sem είναι καθυστέρηση apresenta απασχολημένος χωρίς próximo comando

    String messageBody = "";
    ενώ (EspSerial.available ())
    {
      Γραμμή συμβολοσειράς = EspSerial.readStringUntil ('\ n');
      αν (line.length () == 1)
      {// το πραγματικό περιεχόμενο αρχίζει μετά από κενή γραμμή (που έχει μήκος 1)
        μήνυμαBody = EspSerial.readStringUntil ('\ n');
      }}
    }}
    Serial.print ("MessageBody έλαβε:");
    Serial.println (messageBody);
    επιστροφή μήνυμαBody;
  }}
  αλλού
  {
    EspSerial.println ("AT + CIPCLOSE"). // χρήστης ειδοποίησης
    Serial.println ("ESP8266 CIPSEND ERROR: ΑΠΟΣΤΟΛΗ"). // Επαναλάβετε ...
    ανταλλακτικά = ανταλλακτικά + 1;
    σφάλμα = 1;
    επιστροφή "σφάλμα"?
  }}
}}

Μπορείτε να δείτε την πρόοδο στην σειριακή οθόνη.

Ο πηγαίος κώδικας μπορεί να μεταφορτωθεί στο

9 app 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 θα ενεργοποιήσει το ρελέ και το LED, λαμβάνοντας αυτές τις εντολές. Η εικόνα δείχνει πώς πρέπει να συνδεθούν οι ενεργοποιητές. Λάβετε υπόψη ότι η έξοδος ρελέ GND ΔΕΝ ΣΥΝΔΕΕΤΑΙ στην έξοδο GNDUNO. Με αυτόν τον τρόπο θα υπάρξει λιγότερη παρεμβολή ισχύος όταν λειτουργεί ο ηλεκτρονόμος.

11 διαμόρφωση των ενεργοποιητών καναλιών (κανάλια ενεργοποιητών)




Όλες οι ενέργειες επαναλαμβάνουν τη διαδικασία διαμόρφωσης του καναλιού κατάστασης. Είναι απαραίτητο να δημιουργήσετε δύο κανάλια για κάθε μια από τις συσκευές. Για κάθε κανάλι, γράψτε τα πλήκτρα αναγνωριστικού καναλιού, ανάγνωσης και εγγραφής. Θα γράψουμε μόνο στο πρώτο πεδίο κάθε καναλιού. Για παράδειγμα:
Αναγνωριστικό καναλιού 375598 ==> Κόκκινο LED (αντλία)
◦ Πεδίο1 = 0 ==> Αντλία απενεργοποιημένη
◦ Πεδίο1 = 1 ==> Αντλία ενεργοποιημένη
2. Αναγνωριστικό καναλιού 375599 ==> LED πράσινο (Λάμπα)
◦ Πεδίο1 = 0 ==> Απενεργοποιημένη λυχνία
◦ Πεδίο1 = 1 ==> Ενεργοποιημένη λυχνία

11 ενεργοποιητές κωδικών φόρτωσης και δοκιμής στο Ardunio.



Όταν στέλναμε δεδομένα στο σύννεφο, γράψαμε αυτά τα δεδομένα στο κανάλι κατάστασης, το οποίο μεταδίδει αυτά τα δεδομένα. Τώρα πρέπει να "διαβάσουμε" τα δεδομένα από το κανάλι ενεργοποιητή, "αποδοχή" (λήψη) αυτών των δεδομένων.

Για να γίνει αυτό, στείλτε μια συμβολοσειρά GET και αυτή η διαδικασία αποτελείται από 3 στάδια.
"Εκκίνηση cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80

Μήκος γραμμής
AT + CIPSEND = 36

Και η ίδια η συμβολοσειρά GET
GET / κανάλια / 375598 / πεδία / 1 / τελευταίο

Τα κανάλια θα "διαβάζονται" κάθε 10 δευτερόλεπτα

Μετά την αποστολή του GET, πρέπει να δεχτούμε την απάντηση από το ThingSpeak. Η απάντηση πρέπει να είναι 0 ή 1 για κάθε κανάλι. Εάν υπάρχουν άλλες αξίες, απλώς τις αγνοούμε.

Η κύρια διαφορά μεταξύ αυτού του μέρους και του προηγούμενου είναι μόνο στη λειτουργία readThingSpeak (αναγνωριστικό κανόνα στοιχειοσειράς)
Παρακάτω είναι ο κώδικας που εκτελεί τις περιγραφόμενες ενέργειες.

// Thingspeak
String canalID1 = "999999"; // Ενεργοποιητής1
String canalID2 = "999999"; // Actuator2

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

// Μεταβλητές που θα χρησιμοποιηθούν με χρονοδιακόπτες
μακρύ readTimingSeconds = 10; // ==> Ορίστε το χρόνο δειγματοληψίας σε δευτερόλεπτα για να λάβετε δεδομένα
long startReadTiming = 0;
long elapsedReadTime = 0;

// Ρελέ
#define ACTUATOR1 10 // ΚΟΚΚΙΝΟ LED ==> Αντλία
#define ACTUATOR2 12 // ΠΡΑΣΙΝΟ LED ==> Λάμπα
boolean αντλία = 0;
λυχνία boolean = 0;

int spare = 0;
boolean error;

void setup ()
{
  Serial.begin (9600);
  
  pinMode (ACTUATOR1, OUTPUT);
  pinMode (ACTUATOR2, OUTPUT);
  pinMode (HARDWARE_RESET, OUTPUT);

  ψηφιακή καταγραφή (ACTUATOR1, HIGH); // ο τρόπος αναμετάδοσης του LOW
  ψηφιακή γραφή (ACTUATOR2, HIGH); // ο τρόπος αναμετάδοσης του LOW
  ψηφιακή καταγραφή (HARDWARE_RESET, HIGH);

  EspSerial.begin (9600); // Comunicacao com Modulo WiFi
  EspHardwareReset (); // Επαναφορά κάντε Modulo WiFi
  startReadTiming = millis (); // ξεκινώντας το "ρολόι προγράμματος"
}}

κενός βρόχος ()
{
  αρχή: // ετικέτα
  σφάλμα = 0;
  
  elapsedReadTime = millis () - startReadTiming;

  αν (elapsedReadTime> (readTimingSeconds * 1000))
  {
    int εντολή = readThingSpeak (κανάλιID1);
    αν (εντολή! = 9) αντλία = εντολή;
    καθυστέρηση (5000);
    εντολή = readThingSpeak (κανάλιID2);
    εάν (εντολή! = 9) λαμπτήρας = εντολή;
    takeActions ();
    startReadTiming = millis ();
  }}
  
  αν (σφάλμα == 1) // Επαναλάβετε εάν η μετάδοση δεν έχει ολοκληρωθεί
  {
    Serial.println ("<<<< ΣΦΑΛΜΑ >>>>");
    καθυστέρηση (2000).
    πρέπει να ξεκινήσει? // πηγαίνετε στην ετικέτα "έναρξη"
  }}
}}

/ ********* Λήψη ενεργειών βασισμένων σε εντολές ThingSpeak ************* /
άκυρες λήψεις (κενές)
{
  Serial.print ("Αντλία:");
  Serial.println (αντλία);
  Serial.print ("Λάμπα:");
  Serial.println (λάμπα);
  αν (αντλία == 1) digitalWrite (ACTUATOR1, LOW);
  άλλο ψηφιακό γράψιμο (ACTUATOR1, HIGH);
  αν (λαμπτήρας == 1) ψηφιακό γράψιμο (ACTUATOR2, LOW);
  άλλο ψηφίοWrite (ACTUATOR2, HIGH);
}}

/ ********* Διαβάστε την εντολή Actuators από ThingSpeak ************* /
int readThingSpeak (αναγνωριστικό κανάλι στοιχειοσειράς)
{
  startThingSpeakCmd ();
  εντολή int;
  // προετοιμασία για τη σειρά GET
  Σειρά getStr = "GET / κανάλια /";
  getStr + = κανάλιID;
  getStr + = "/ fields / 1 / last".
  getStr + = "\ r \ n";

  String μήνυμαDown = sendThingSpeakGetCmd (getStr);
  αν (messageDown [5] == 49)
  {
    εντολή = messageDown [7] -48;
    Serial.print ("Εντολή λήψης:");
    Serial.println (εντολή);
  }}
  else εντολή = 9;
  εντολή επιστροφής;
}}

/ ********* Επαναφορά ESP ************* /
void EspHardwareReset (κενό)
{
  Serial.println ("Επανεκκίνηση .......");
  ψηφιακήWrite (HARDWARE_RESET, LOW);
  καθυστέρηση (500);
  ψηφιακή καταγραφή (HARDWARE_RESET, HIGH);
  καθυστέρηση (8000), // Tempo nevyhnutário para começar a ler
  Serial.println ("RESET");
}}

/ ********* Ξεκινήστε την επικοινωνία με το ThingSpeak ************* /
void startThingSpeakCmd (κενό)
{
  EspSerial.flush (); / / limpa o buffer πριν από την προσθήκη ενός gravar
  
  Σειρά cmd = "AT + CIPSTART = \" TCP \ ", \" ";
  cmd + = "184.106.153.149". // Endereco IP de api.thingspeak.com
  cmd + = "\", 80 ".
  EspSerial.println (cmd);
  Serial.print ("enviado ==> Εκκίνηση cmd:");
  Serial.println (cmd);

  αν (EspSerial.find ("Σφάλμα"))
  {
    Serial.println ("σφάλμα AT + CIPSTART");
    επιστροφή
  }}
}}

/ ********* στείλετε ένα GET cmd στο ThingSpeak ************* /
Σειρά sendThingSpeakGetCmd (String getStr)
{
  Σειρά cmd = "AT + CIPSEND =";
  cmd + = συμβολοσειρά (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), // tempo para processar o GET, sem είναι καθυστέρηση apresenta απασχολημένος χωρίς próximo comando

    String messageBody = "";
    ενώ (EspSerial.available ())
    {
      Γραμμή συμβολοσειράς = EspSerial.readStringUntil ('\ n');
      αν (line.length () == 1)
      {// το πραγματικό περιεχόμενο αρχίζει μετά από κενή γραμμή (που έχει μήκος 1)
        μήνυμαBody = EspSerial.readStringUntil ('\ n');
      }}
    }}
    Serial.print ("MessageBody έλαβε:");
    Serial.println (messageBody);
    επιστροφή μήνυμαBody;
  }}
  αλλού
  {
    EspSerial.println ("AT + CIPCLOSE"). // χρήστης ειδοποίησης
    Serial.println ("ESP8266 CIPSEND ERROR: ΑΠΟΣΤΟΛΗ"). // Επαναλάβετε ...
    ανταλλακτικά = ανταλλακτικά + 1;
    σφάλμα = 1;
    επιστροφή "σφάλμα"?
  }}
}}


Μπορείτε να το κατεβάσετε στο

12 αποστολή εντολών σε συσκευές



Σε αυτό το στάδιο, έχουμε διαμορφωμένο κανάλι ενεργοποιητή αλλάζοντας την τιμή του πεδίου 1 για κάθε συσκευή. Πρέπει να επαληθεύσουμε ότι οι συσκευές επεξεργάζονται σωστά τις εντολές. Στο τέλος του έργου, μια εφαρμογή Android θα χρησιμοποιηθεί για αυτό, αλλά μπορεί επίσης να γίνει μέσω ενός προγράμματος περιήγησης.

Ενεργοποιήστε την αντλία (κόκκινη ενδεικτική λυχνία)
https://api.thingspeak.com/update?api_key=Saved_channel_key_1&field1=1

Αφαίρεση αντλίας (κόκκινη λυχνία LED σβηστή)
https://api.thingspeak.com/update?api_key=Saved Channel_key_1 & field1 = 0

Ενεργοποιήστε τη λάμπα (η πράσινη λυχνία LED είναι αναμμένη)
https://api.thingspeak.com/update?api_key=Saved_channel_key_2&field1=1

Απενεργοποιήστε τη λάμπα
https://api.thingspeak.com/update?api_key=Saved Channel_key_2 & field1 = 0


14 Τερματισμός του προγράμματος Android




Στο προηγούμενο μέρος, υπήρχε ένα απλό πρόγραμμα που "διάβαζε" τα δεδομένα από το κανάλι και τα εμφάνιζε στην οθόνη. Τώρα πρέπει να κάνουμε το πρόγραμμα "γράψε" τις εντολές στο Actuator Channal, έτσι ώστε αυτές οι εντολές να μπορούν να διαβαστούν από τον ελεγκτή και η λάμπα με την αντλία να λειτουργεί ανάλογα.

Για να μπορεί ο χρήστης να στέλνει εντολές, η εφαρμογή θα έχει δύο κουμπιά για κάθε συσκευή. Εάν είναι ενεργοποιημένη, μπλε, εάν είναι απενεργοποιημένη, κόκκινη.

Κάνοντας κλικ στα κουμπιά της εφαρμογής, μπορείτε να δείτε το αποτέλεσμα στην σειριακή οθόνη.

Ο κώδικας μπορεί να μεταφορτωθεί στο

15 Τελική συναρμολόγηση



Σε αυτό το στάδιο, υπάρχει μια πλήρως ολοκληρωμένη εφαρμογή Android, ένα πλήρως συναρμολογημένο τμήμα "σιδήρου", αλλά δεν υπάρχει κανένας κώδικας στον ελεγκτή που θα διαβάσει συνεχώς τα δεδομένα και θα στείλει εντολές στο σύννεφο. Απλά πρέπει να συνδυάσετε όλα τα κομμάτια του κώδικα που γράψατε νωρίτερα. Φυσικά, ο κώδικας έχει πρόσθετες επιλογές επαλήθευσης (για παράδειγμα, εάν το ESP-01 παγώνει). Για να γίνει αυτό, περιοδικά, πριν από κάθε εντολή ανάγνωσης ή εγγραφής, αποστέλλεται μια εντολή AT.Και αν η απάντηση ΟΚ δεν προήλθε από την ενότητα, τότε η μονάδα αναγκάζεται να επανεκκινηθεί με προγραμματισμό.

Ο πλήρης κώδικας έργου μπορεί να μεταφορτωθεί στο

Στη διεύθυνση μπορείτε να λάβετε ενημερώσεις για αρχεία προγράμματος.

Μπορείτε επίσης να διαβάσετε σχόλια σχετικά με τη σύνδεση με την πηγή, εάν κάτι δεν είναι σαφές.
8.3
8.6
8.4

Προσθέστε ένα σχόλιο

    • χαμόγελοχαμογελάειxaxaΕντάξειdontknowyahoonea
      αφεντικόξυστάανόητοςναιναι-ναιεπιθετικήμυστικό
      Συγγνώμηχορόςdance2dance3συγχώρησηβοήθειαποτά
      σταματήστεφίλουςκαλόgoodgoodσφυρίχτρασυρρέουνγλώσσα
      καπνόςπαλαμάκιαcrayδηλώστεαπογοητευτικήdon-t_mentionκατεβάστε
      θερμότηταςirefulγέλιο1mdaσυνάντησηmoskingαρνητική
      not_iποπ κορντιμωρίαδιαβάστετρομάξτεφοβίζειαναζήτηση
      χλευάζωthank_youαυτόto_clueumnikοξείασυμφωνώ
      κακόbeeeblack_eyeblum3ρουζκαυχηθείτεπλήξη
      λογοκρισίαευχαρίστησηsecret2απειλήσουννίκηyusun_bespectacled
      shokrespektlolπροβλέπουνκαλωσορίστεkrutoyya_za
      ya_dobryiβοηθόςne_huliganne_othodifludαπαγόρευσηκοντά

Σας συμβουλεύουμε να διαβάσετε:

Κάντε το για το smartphone ...