» elektronik » Arduino »Dünyanın herhangi bir yerinden bir sera veya seranın yönetimi (uygulama örneği)

Dünyanın herhangi bir yerinden bir sera veya seranın yönetimi (uygulama örneği)

1 Cihaz konsepti



Bu geliştirmenin amacı yerel sensörlerden veri toplamak, bu verileri internete göndermek. Kullanıcı dünyanın herhangi bir yerindeki sensörlerden gelen verileri görüntüleyebilecek ve sensörlerin yanında yerel olarak konumlandırılacak belirli aktüatörlerin aktivasyonu hakkında uzaktan karar verebilecektir.

Proje şunları kullanır: Arduino UNO ve WiFi modülü ESP8266-01. Veriler ThingSpeak.com web hizmeti aracılığıyla buluta aktarılacak ve cihazlar MIT AppInventor kullanılarak geliştirilen android uygulaması aracılığıyla etkinleştirilecek.

Dünyanın herhangi bir yerinden bir sera veya seranın yönetimi (uygulama örneği)


IoT, ekonomik ve sosyal süreçleri yeniden inşa edebilecek, eylemlerin ve operasyonların bir kısmından insan katılımı ihtiyacını ortadan kaldıracak bir fenomen olarak düşünen, birbirleriyle veya dış çevre ile etkileşim kurmak için yerleşik teknolojilerle donatılmış bir fiziksel nesneler ("şeyler") bilgisayar ağı kavramıdır.


Bu IoT projesinin ana odağı ThingSpeak.com hizmeti olacak. Yerel UNO / ESP-01 cihazı, sensörlerden ve aktüatörlerin durumuyla ilgili verilerden veri alır, belirli bir ThingSpeak.com durum kanalı (ThingSpeak.com Durum Kanalı) aracılığıyla internete “kayıt” gönderir, aynı yerel cihaz veri alır, " onları "başka bir veri kanalından -" yürütme cihazlarının kanalı "(ThingSpeak.com Aktüatör Kanalları).



Veriler bir sıcaklık ve bağıl nem sensörü, toprak sıcaklığı ve nem ve bir ortam ışığı sensörü kullanılarak toplanacaktır. Bu veriler ThingSpeak servis bulutuna gönderilecektir.

İki yönetici cihaz olacak - bu bir su elektrikli pompa ve bir lamba. ON / OFF durumları buluta da gönderilecek. Örneğin sensörlerden gelen veriler bir sera veya seranın mevcut durumunu görüntüleyebilir. Kullanıcı android uygulamasını kullanarak yönetici cihazları kontrol edecektir.


2 Gerekli bileşenlerin listesi



Tüm bağlantılar yalnızca bilgi amaçlıdır.






2 x LED (kırmızı ve yeşil)
1 x
- $3.00
220V lamba
2 x 330 ohm direnç (LED'lerle kullanılır)
2 x 10K ohm direnç (DHT22 ve LDR ile kullanılır)
1 x 4K7 ohm direnç (DS18B20 ile kullanılır)
Prototip tahtası
jumper
5V DC röle için harici güç kaynağı

3 Demir parçası



Şimdi tüm sensörleri şemada gösterildiği gibi bağlamanız gerekir.



İdeal çözüm, projeyi parçalar halinde monte etmek ve test etmek olacaktır.

Aşağıdaki sırayla:
1. Tüm sensörleri kurun ve test edin
2.ESP-01'i yükleyin ve minimum yapılandırın
3. ESP-01 kurulumunu son yapılandırmaya değiştirin ve test edin
4. ThingSpeak Durum Kanalını Yapılandırma
5. ThingSpeak kodunu Arduino'ya kurun ve bulut üzerindeki sensörlerin durumunu kontrol edin
6. Sensörlerden durum mesajlarını kontrol etmek için android programın ilk sürümünü geliştirin
7. Aktüatörleri takın
8. ThingSpeak Aktüatör kanallarını yapılandırın
9. Arduino'daki yönetici cihazların kodunu yükleyin ve test edin
10. Tüm cihaz montajı için android programın ikinci sürümünü olun.

4 Sensör Bağlantısı





Proje, içinde bulunan bazı kitaplıkları kullanır. Uygunluklarını kontrol etmek gerekir. Bu kütüphanelerin ilk yapılandırması aşağıdaki gibidir:
// DS18B20
#include 
#include 
#define ONE_WIRE_BUS 5 // D5 pimindeki DS18B20
OneWire oneWire (ONE_WIRE_BUS);
Dallas Sıcaklığı DS18B20 (& oneWire);
int toprakTemp = 0;

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

// LDR (Açık)
#define ldrPIN 1
int ışık = 0;

// Toprak nemi
#define toprakHumPIN 0
int toprakHum = 0;


Şimdi sensörlerimizi başlatıyor ve terminalde gösteriyoruz:
geçersiz kurulum ()
{
  Serial.begin (9600);
  DS18B20.begin ();
  dht.begin ();
}

void loop ()
{
  readSensors ();
  displaySensors ();
  gecikme (10000);
}

Ve son olarak, iki işlev yazacağız: biri sensörlerden okumaları okur ve diğeri bunları ekranda görüntüler:
/ ********* Sensörler değerini okuyun ************* /
void readSensors (geçersiz)
{
  airTemp = dht.readTemperature ();
  airHum = dht.readHumidity ();

  DS18B20.requestTemperatures ();
  toprakTemp = DS18B20.getTempCByIndex (0); // Sensör 0, Celcius'ta Toprak Sıcaklığını yakalayacak
  
  toprakHum = harita (analogOkuma (toprakHumPIN), 1023, 0, 0, 100);
 
  ışık = harita (analogOkuma (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> ışık% 100

}

/ ********* Ekran Sensörleri değeri ************* /
void displaySensors (geçersiz)
{
  Serial.print ("airTemp (oC):");
  Serial.println (airTemp);
  Serial.print ("airHum (%):");
  Serial.println (airHum);
  Serial.print ("toprakTemp (oC):");
  Seri.println (toprakTemp);
  Serial.print ("toprakHum (%):");
  Seri.println (toprakHum);
  Serial.print ("light (%):");
  Serial.println (hafif);
  Serial.println ("");
}


Fotoğraf, verilerin ekranda nasıl görüntülendiğini gösterir.


Kaynak kodu yazardan indirilebilir.

4 ESP8266-01 temel yapılandırma



Modülle "konuşmanın" en hızlı yolu AT komutudur. İşlemcide zaten bir AT komut işlemcisi var. Varsayılan olarak, modül 115200 baud fabrika ayarlarıyla birlikte gelir, ayarlarda 9600 baud ayarlamanız gerekir.

İlk olarak, fotoğrafta gösterildiği gibi modülü bağlamanız gerekir



( ESP-01'in Tx terminalinin, tıpkı Rx terminalleri birbirine bağlı olduğu gibi UNO'nun Tx terminaline bağlandığını unutmayın. Bu bağlantı daha sonra değiştirilecek. ).

Ardından UNO'yu bilgisayara bağlayın, IDE'yi açın ve bulunan örneği indirin. Bu boş koddur, böylece ESP-01 ve UNO arasında çakışma olmaz. Bu kod, Ardunio'nun Tx ve Rx pinlerini başka hiçbir şey için kullanmayacağından emin olmak için ESP-01'i bağlamadan önce Ardunio'ya yüklendi.
Şimdi IDE Seri Monitörünü açmanız, baud hızını ayarlarda 115200 olarak ayarlamanız ve AT komutunu IDE Seri Monitöre göndermeniz gerekir. ESP-01 cevap göndermeli Tamam

Şimdi ESP-01 modülündeki veri hızını değiştirmeniz gerekiyor. Bunu yapmak için, IDE'de,

AT + CIOBAUD = 9600


ESP-01 fabrika ayarlarına geri dönebilir, o zaman başka bir komut kullanmanız gerekir:

AT + UART_DEF = , , , , 


Örneğin 9600 baud / 8 veri biti / 1 durdurma biti ve hiçbiri parite ve akış kontrolü

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


Şimdi IDE ayarlarındaki veri aktarım hızını 9600 olarak değiştirin ve AT komutunu gönderin, OK yanıtı gelmelidir.
Ardından, ağınızın erişim noktasına bağlanabilmesi için modülü STA moduna geçirmeniz gerekir.

AT + CWMODE = 1


Modülün ağa bağlanması için komutu girin AT + CWJAP = "ağ_adı", "ağ_adı_1"nerede network_name Ağınızın adı ve network_name_1 - ağınız için şifre (şifre ve ağ adı tırnak içinde olmalıdır)
Cevabı görürsen WIFI BAĞLI WIFI GOT IP, daha sonra bağlantı kurulur. IP adresini komutla doğrulayın
AT + CIFSR
.

Monitörünüzde görünen adres, ileride kullanabilirsiniz. Modülü yapılandırdıktan sonra, kalıcı olarak bağlayabilirsiniz, ancak bunun için şekilde gösterildiği gibi anahtarlama devresini değiştirmeniz gerekir.


• ESP-01 RX (Sarı) -> UNO Pin D7
• ESP-01 TX (Turuncu) -> UNO Pin D6
• ESP-01 Ch-Pd (Kahverengi) -> Vcc (3.3V)
• ESP-01 Sıfırla (Mavi) -> UNO Pin D8
• ESP-01 Vcc (Kırmızı) -> 3.3V
• ESP-01 Gnd (Siyah) -> UNO GND

Software Serial kütüphanesinin UNO Pin D7 pinini kullandığını unutmayın tx gibi ve ESP-01'in çıkışına bağlanır RXUNO Pin D6 rx gibiESP-01'e bağlı Teksas.

ESP-01 modülünün doğru bağlantısını ve yapılandırmasını kontrol etmek için küçük bir kod girin
#include 
Yazılım Seri esp8266 (6.7); // Rx ==> Pin 6; TX ==> Pin7

#define speed8266 9600

geçersiz kurulum ()
{
  esp8266.begin (hız8266);
  Seri.başlangıç ​​(hız8266);
  Serial.println ("ESP8266 Kurulum testi - AT komandolarını kullanın");
}

void loop ()
{
  ise (esp8266.available ())
  {
    Serial.write (esp8266.read ());
  }
  while (Serial.available ())
  {
    esp8266.write (Serial.read ());
  }
}


Şimdi birkaç AT takımı. Seri Monitördeki sonuçları görün.



* AT =====> ESP8266 TAMAM döndürüyor
* AT + RST =====> ESP8266 yeniden başlatılır ve Tamam'a döner
* AT + GMR =====> ESP8266 AT Sürümü'nü döndürür; SDK sürümü; id; tamam
* AT + CWMODE'DA? => ESP8266 mod türünü döndürür
* AT + CWLAP ===> ESP8266 yakın erişim noktalarını döndürür
* AT + CIFSR ===> ESP8266 belirtilen IP'yi döndürür

Program kodu şuradan indirilebilir:

6 sensör bağlantısı ve ESP-01




Tüm sensörler bağlandıktan ve kontrol edildikten sonra ESP-01 modülü kontrol edildikten sonra, verileri İnternet'e göndermek için hazırlamanız gerekir.

7 ŞeySpeak





Projenin en önemli kısımlarından biri, sensörlerden veri toplamanıza, bunları işlemenize ve analiz etmenize olanak tanıyan açık IoT platformudur. Bunu yapmak için, hesabınıza gidin ve oluşturun. Ardından, 2 aktüatörün, 5 sensörün ve bir yedek alanın olacağı bir kanal oluşturmanız gerekir.
• Alan 1: Aktüatör 1 (cihaz 1)
• Alan 2: Aktüatör 2 (cihaz 2)
• Alan 3: oC cinsinden Hava Sıcaklığı (Celsius derece cinsinden hava sıcaklığı)
• Filed 4:% olarak Hava Bağıl Nemi (% olarak Bağıl Nem)
• Alan 5: oC cinsinden toprak sıcaklığı (gr. Santigrat cinsinden toprak sıcaklığı)
• Alan 6:% olarak Toprak Nemi (% olarak toprak nemi)
• Alan 7:% olarak parlaklık (% olarak aydınlatma)
• Alan 8: Yedek

Alan 8, gelecekteki genişletme veya hata ayıklama için ayrılmıştır. Bu projede Arduino / ESP-01 ve ThingSpeak.com arasında bir iletişim hatası sayacı olarak kullanılmaktadır.

Durum Kanalı'nı oluşturduktan sonra, anahtarları fotoğrafta gösterildiği gibi kaydetmeniz gerekir.

8 Buluta sensör durumunu gönderme



Şu anda yapılandırılmış bir bulut hizmetimiz var ve sensörlerimiz yerel olarak veri topluyor. Şimdi bu verileri alıp ThingSpeak.com'daki buluta göndermeniz gerekiyor.

ThingSpeak kanalına veri yazmak için bir GET dizesi göndermeniz gerekir. Bu üç aşamada yapılacaktır.
"Start cmd" komutunu gönderin
AT + CIPSTART = "TCP", "184.106.153.149", 80

Diğer dize uzunluğu

AT + CIPSEND = 116


Son olarak, verilerimizi ayrılmış Durum Kanalı alanlarına yazacak bir GET dizesi.

ALIN / güncelleme?


Kanala 16 saniyede 1 kereden fazla veri yazmamamız gerektiğini lütfen unutmayın.

Gönderilen kod tüm bunları yapacaktır.
// Şeyler
String statusChWriteKey = "BURADA YAZI ANAHTARINIZ"; // Durum Kanalı kimliği: 385184

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

// DS18B20
#include 
#include 
#define ONE_WIRE_BUS 5 // D5 pimindeki DS18B20
OneWire oneWire (ONE_WIRE_BUS);
Dallas Sıcaklığı DS18B20 (& oneWire);
int toprakTemp = 0;

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

// LDR (Açık)
#define ldrPIN 1
int ışık = 0;

// Toprak nemi
#define toprakHumPIN 0
int toprakHum = 0;

// Zamanlayıcılarla kullanılacak değişkenler
long writeTimingSeconds = 17; // ==> Veri göndermek için örnekleme süresini saniye olarak tanımlayın
uzun startWriteTiming = 0;
uzun süre geçenWriteTime = 0;

// Aktüatörlerle Kullanılacak Değişkenler
boole pompası = 0;
boolean lambası = 0;

int yedek = 0;
boole hatası;

geçersiz kurulum ()
{
  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'yi sıfırla
  startWriteTiming = millis (); // "program saatini" başlatma
}

void loop ()
{
  başlangıç: // etiket
  hata = 0;
  
  elapsedWriteTime = millis () - startWriteTiming;
  
  if (elapsedWriteTime> (writeTimingSeconds * 1000))
  {
    readSensors ();
    writeThingSpeak ();
    startWriteTiming = millis ();
  }
  
  if (hata == 1) // Aktarım tamamlanmadıysa tekrar gönder
  {
    Serial.println ("<<<< HATA >>>>");
    gecikme (2000);
    başlama; // "start" etiketine git
  }
}

/ ********* Sensörler değerini okuyun ************* /
void readSensors (geçersiz)
{
  airTemp = dht.readTemperature ();
  airHum = dht.readHumidity ();

  DS18B20.requestTemperatures ();
  toprakTemp = DS18B20.getTempCByIndex (0); // Sensör 0, Celcius'ta Toprak Sıcaklığını yakalayacak
             
  ışık = harita (analogOkuma (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> ışık% 100
  toprakHum = harita (analogOkuma (toprakHumPIN), 1023, 0, 0, 100);

}

/ ********* Conexao com TCP com Thingspeak ******* /
void writeThingSpeak (geçersiz)
{

  startThingSpeakCmd ();

  // preparacao da string GET
  String getStr = "GET / update? Api_key =";
  getStr + = statusChWriteKey;
  getStr + = "& field1 =";
  getStr + = Dize (pompa);
  getStr + = "& field2 =";
  getStr + = Dize (lamba);
  getStr + = "& field3 =";
  getStr + = Dize (airTemp);
  getStr + = "& field4 =";
  getStr + = Dize (airHum);
  getStr + = "& field5 =";
  getStr + = Dize (toprakTemp);
  getStr + = "& field6 =";
  getStr + = Dize (toprakHum);
  getStr + = "& field7 =";
  getStr + = Dize (ışık);
  getStr + = "& field8 =";
  getStr + = Dize (yedek);
  getStr + = "\ r \ n \ r \ n";

  sendThingSpeakGetCmd (getStr);
}

/ ********* ESP'yi Sıfırla ************* /
geçersiz EspHardwareReset (geçersiz)
{
  Serial.println ("Sıfırlanıyor .......");
  digitalWrite (HARDWARE_RESET, DÜŞÜK);
  gecikme (500);
  digitalWrite (HARDWARE_RESET, HIGH);
  delay (8000); // Tempo necessário para começar a ler
  Serial.println ("RESET");
}

/ ********* ThingSpeak ile iletişime başlayın ************* /
void startThingSpeakCmd (void)
{
  EspSerial.flush (); // bir tampon bellek
  
  Dize cmd = "AT + CIPSTART = \" TCP \ ", \" ";
  cmd + = "184.106.153.149"; // apre.thingspeak.com için IP adresi
  cmd + = "\", 80 ";
  EspSerial.println (cmd);
  Serial.print ("enviado ==> Başlangıç ​​cmd:");
  Seri.println (cmd);

  eğer (EspSerial.find ("Hata"))
  {
    Serial.println ("AT + CIPSTART hatası");
    return;
  }
}

/ ********* ThingSpeak'e bir cmd GET gönder ************* /
Dize sendThingSpeakGetCmd (String getStr)
{
  Dize cmd = "AT + CIPSEND =";
  cmd + = Dize (getStr.length ());
  EspSerial.println (cmd);
  Serial.print ("enviado ==> uzunluk cmd:");
  Seri.println (cmd);

  eğer (EspSerial.find ((char *) ">"))
  {
    EspSerial.print (getStr);
    Serial.print ("enviado ==> getStr:");
    Serial.println (getStr);
    delay (500); // tempo para processar o GET, sem este gecikme apresenta meşgul no próximo comando

    String messageBody = "";
    while (EspSerial.available ())
    {
      Dize satırı = EspSerial.readStringUntil ('\ n');
      if (line.length () == 1)
      {// gerçek içerik boş satırdan sonra başlar (uzunluğu 1 olan)
        messageBody = EspSerial.readStringUntil ('\ n');
      }
    }
    Serial.print ("MessageBody alındı:");
    Serial.println (messageBody);
    dönüş mesajı
  }
  başka
  {
    EspSerial.println ("AT + CIPCLOSE"); // kullanıcıyı uyar
    Serial.println ("ESP8266 CIPSEND HATASI: YENİDEN GÖNDERME"); // Tekrar gönder ...
    yedek = yedek + 1;
    hata = 1;
    dönüş "hatası";
  }
}

İlerlemeyi Seri Monitörde görebilirsiniz.

Kaynak kodu şuradan indirilebilir:

9 Android Uygulaması - Birinci Bölüm



Öncelikle bir kullanıcı arayüzü oluşturmanız gerekir. Resim, ana görünür ve görünmez unsurları göstermektedir.



Bundan sonra bloklar oluşturmanız gerekir. Menü öğeleri ekran görüntüsü numaralarına karşılık gelir.

1 Global olarak bildirilmesi gereken durum değişkenleri

2 İki saniyede bir (Saat1'e bağlı olarak) bir prosedür çağrılır "ReadArduino"


Prosedür, ekranda görüntülenmesi gereken değişkenlerin değerini döndürür. Bu durumda, daha iyi algılama için aktüatörlerin durum değeri (0 ve 1) “AÇIK” ve “KAPALI” ya dönüştürülür.

Bu değerler (Durum) ilgili “Kısayollar” da görüntülenecektir

3 ReadArduino rutini esasen ThingSpeak'teki durum kanalını okuyacaktır. Bu nedenle, Thingspeak'e gönderilecek URL'yi belirlemeniz gerekir. Bunu yapmak için ThingSpeak'e gönderilecek URL'yi oluşturmak için 3 genel değişken bildirilmeli ve birleştirilmelidir. GET adlı bir web bileşenine gönderilmelidir «ArduFarmBotStatusCh»

4 Önceki komuttan alınan metin JSon biçiminde gelir. Bu metnin işlenmesi gerekir, böylece her alan ilgili global değişkende okunur ve saklanır.

5 Yapılacak son şey, iki toprak sensörünün durumunu analiz edecek “Alarm” prosedürünü çağırmaktır. Sıcaklık çok düşükse (bizim durumumuzda 10oC), bir mesaj gösterilmelidir. % 60'ın altındaysa nem için de aynı şey geçerlidir.

Her saniyede çalışacak şekilde programlanmış başka bir zamanlayıcı (Clock2) tanımladığımızı lütfen unutmayın. Yalnızca mesaj metninin rengini (beyazdan kırmızıya) "değiştirmek" gerekir. Mesaj yanıp sönecektir.

Uygulama kodu şuradan indirilebilir:

10 Aktüatörlerin bağlanması




Pompanın ve lambanın açılması ve kapatılması komutları uzaktan alınacaktır. Ardunio'nun çıkışı bu komutları alarak röleyi ve LED'i etkinleştirir. Resim, aktüatörlerin nasıl bağlanması gerektiğini göstermektedir. Lütfen GND röle çıkışının BAĞLANMADI GND çıkışınaUNO. Bu şekilde röle çalışırken daha az güç paraziti olacaktır.

Kanal aktüatörlerinin 11 konfigürasyonu (Aktüatör Kanalları)




Tüm eylemler, Durum kanalını yapılandırma prosedürünü tekrarlar. Cihazların her biri için iki kanal oluşturmak gerekir. Her kanal için Kanal Kimliği, Okuma ve Yazma tuşlarını yazın. Her kanalın yalnızca ilk alanına yazacağız. Bir örnek için:
Kanal Kimliği 375598 ==> LED Kırmızı (Pompa)
1 Alan1 = 0 ==> Pompa KAPALI
1 Alan1 = 1 ==> Pompa AÇIK
2. Kanal Kimliği 375599 ==> LED Yeşil (Lamba)
◦ Alan1 = 0 ==> Lamba KAPALI
◦ Alan1 = 1 ==> Lamba AÇIK

11 Ardunio'daki kod aktüatörlerini yükleme ve test etme.



Buluta veri gönderdiğimizde, bu verileri ThingSpeak Durum kanalına “yazdık”, bu verileri “gönderiyor” (yüklüyor). Şimdi Aktüatör Kanalı'ndan verileri “okumalı”, bu verileri “kabul etmeli” (indirmeliyiz).

Bunu yapmak için bir GET dizesi gönderin ve bu yordam 3 aşamadan oluşur.
"Cmd'yi başlat"
AT + CIPSTART = "TCP", "184.106.153.149", 80

Çizgi uzunluğu
AT + CIPSEND = 36

Ve GET dizesinin kendisi
GET / kanallar / 375598 / alanlar / 1 / son

Kanallar 10 saniyede bir "okunur"

GET'i gönderdikten sonra ThingSpeak'in yanıtını kabul etmeliyiz. Yanıt her kanal için 0 veya 1 olmalıdır. Başka değerler varsa, bunları görmezden geliriz.

Bu parça ile bir önceki parça arasındaki ana fark sadece işlevdedir readThingSpeak (Dize kanal kimliği)
Aşağıda açıklanan işlemleri gerçekleştiren kod bulunmaktadır.

// Şeyler
String canalID1 = "999999"; // Aktüatör1
String canalID2 = "999999"; // Aktüatör2

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

// Zamanlayıcılarla kullanılacak değişkenler
uzun readTimingSeconds = 10; // ==> Veri almak için örnekleme süresini saniye cinsinden tanımlayın
long startReadTiming = 0;
uzun süre geçtiReadTime = 0;

// Röleler
#define AKTÜATÖR1 10 // KIRMIZI LED ==> Pompa
#define AKTÜATÖR2 12 // YEŞİL LED ==> Lamba
boole pompası = 0;
boolean lambası = 0;

int yedek = 0;
boole hatası;

geçersiz kurulum ()
{
  Serial.begin (9600);
  
  pinMode (AKTÜATÖR1, ÇIKIŞ);
  pinMode (AKTÜATÖR2, ÇIKIŞ);
  pinMode (HARDWARE_RESET, OUTPUT);

  digitalWrite (AKTÜATÖR1, YÜKSEK); // o Módulo relé é ativo em LOW
  digitalWrite (AKTÜATÖR2, YÜKSEK); // o Módulo relé é ativo em LOW
  digitalWrite (HARDWARE_RESET, HIGH);

  EspSerial.begin (9600); // Comunicacao com Modulo WiFi
  EspHardwareReset (); // Modulo WiFi'yi sıfırla
  startReadTiming = millis (); // "program saatini" başlatma
}

void loop ()
{
  başlangıç: // etiket
  hata = 0;
  
  elapsedReadTime = millis () - startReadTiming;

  if (elapsedReadTime> (readTimingSeconds * 1000))
  {
    int command = readThingSpeak (canalID1);
    eğer (komut! = 9) pompa = komut;
    gecikme (5000);
    command = readThingSpeak (canalID2);
    if (komut! = 9) lamba = komut;
    takeActions ();
    startReadTiming = millis ();
  }
  
  if (hata == 1) // Aktarım tamamlanmadıysa tekrar gönder
  {
    Serial.println ("<<<< HATA >>>>");
    gecikme (2000);
    başlama; // "start" etiketine git
  }
}

/ ********* ThingSpeak Komutlarına dayalı olarak harekete geçin ************* /
void takeActions (geçersiz)
{
  Serial.print ("Pompa:");
  Seri.println (pompa);
  Serial.print ("Lamba:");
  Seri.println (lamba);
  eğer (pompa == 1) digitalWrite (AKTÜATÖR1, DÜŞÜK);
  başka digitalWrite (AKTÜATÖR1, YÜKSEK);
  eğer (lamba == 1) digitalWrite (AKTÜATÖR2, DÜŞÜK);
  başka digitalWrite (AKTÜATÖR2, YÜKSEK);
}

/ ********* Aktüatörler komutunu ThingSpeak'ten okuyun ************* /
int readThingSpeak (Dize kanal kimliği)
{
  startThingSpeakCmd ();
  int komutu;
  // preparacao da string GET
  String getStr = "GET / channel /";
  getStr + = kanal kimliği;
  getStr + = "/ alanlar / 1 / son";
  getStr + = "\ r \ n";

  Dize messageDown = sendThingSpeakGetCmd (getStr);
  if (messageDown [5] == 49)
  {
    command = messageDown [7] -48;
    Serial.print ("Komut alındı:");
    Serial.println (komut);
  }
  başka komut = 9;
  dönüş komutu;
}

/ ********* ESP'yi Sıfırla ************* /
geçersiz EspHardwareReset (geçersiz)
{
  Serial.println ("Sıfırlanıyor .......");
  digitalWrite (HARDWARE_RESET, DÜŞÜK);
  gecikme (500);
  digitalWrite (HARDWARE_RESET, HIGH);
  delay (8000); // Tempo necessário para começar a ler
  Serial.println ("RESET");
}

/ ********* ThingSpeak ile iletişime başlayın ************* /
void startThingSpeakCmd (void)
{
  EspSerial.flush (); // bir tampon bellek
  
  Dize cmd = "AT + CIPSTART = \" TCP \ ", \" ";
  cmd + = "184.106.153.149"; // apre.thingspeak.com için IP adresi
  cmd + = "\", 80 ";
  EspSerial.println (cmd);
  Serial.print ("enviado ==> Başlangıç ​​cmd:");
  Seri.println (cmd);

  eğer (EspSerial.find ("Hata"))
  {
    Serial.println ("AT + CIPSTART hatası");
    return;
  }
}

/ ********* ThingSpeak'e bir cmd GET gönder ************* /
Dize sendThingSpeakGetCmd (String getStr)
{
  Dize cmd = "AT + CIPSEND =";
  cmd + = Dize (getStr.length ());
  EspSerial.println (cmd);
  Serial.print ("enviado ==> uzunluk cmd:");
  Seri.println (cmd);

  eğer (EspSerial.find ((char *) ">"))
  {
    EspSerial.print (getStr);
    Serial.print ("enviado ==> getStr:");
    Serial.println (getStr);
    delay (500); // tempo para processar o GET, sem este gecikme apresenta meşgul no próximo comando

    String messageBody = "";
    while (EspSerial.available ())
    {
      Dize satırı = EspSerial.readStringUntil ('\ n');
      if (line.length () == 1)
      {// gerçek içerik boş satırdan sonra başlar (uzunluğu 1 olan)
        messageBody = EspSerial.readStringUntil ('\ n');
      }
    }
    Serial.print ("MessageBody alındı:");
    Serial.println (messageBody);
    dönüş mesajı
  }
  başka
  {
    EspSerial.println ("AT + CIPCLOSE"); // kullanıcıyı uyar
    Serial.println ("ESP8266 CIPSEND HATASI: YENİDEN GÖNDERME"); // Tekrar gönder ...
    yedek = yedek + 1;
    hata = 1;
    dönüş "hatası";
  }
}


Şuradan indirebilirsiniz:

Cihazlara 12 komut gönderme



Bu aşamada, her cihaz için alan 1'in değerini değiştiren yapılandırılmış bir aktüatör kanalımız vardır. Aygıtların komutları düzgün çalıştığını doğrulamamız gerekir. Projenin sonunda, bunun için bir android uygulaması kullanılacak, ancak bir tarayıcı aracılığıyla da yapılabilir.

Pompayı açın (kırmızı LED açık)
https://api.thingspeak.com/update?api_key=Сохраненный_ключ_канала_1&field1=1

Pompa kapalı (kırmızı LED kapalı)
https://api.thingspeak.com/update?api_key=Kaydedilen Kanal_key_1 & field1 = 0

Lambayı açın (yeşil LED yanar)
https://api.thingspeak.com/update?api_key=Kaydedilen Kanal_key_2 & field1 = 1

Lambayı kapatın (yeşil LED kapalı)
https://api.thingspeak.com/update?api_key=Kaydedilen Kanal_key_2 & field1 = 0


14 Android programını sonlandırma




Önceki bölümde, verileri kanaldan “okuyan” ve ekranda görüntüleyen basit bir program vardı. Şimdi programın Aktüatör Channal'daki komutları “yazması” gerekiyor, böylece bu komutlar kontrolör tarafından okunabilir ve pompalı lamba buna göre çalışır.

Kullanıcının komut gönderebilmesi için uygulamanın her cihaz için iki düğmesi olacaktır. Açıksa mavi, kapalı ise kırmızı.

Uygulamadaki düğmeleri tıklatarak sonucu Seri Monitörde görebilirsiniz.

Kod şu adresten indirilebilir:

15 Son montaj



Bu aşamada, tamamen tamamlanmış bir android uygulaması, tamamen monte edilmiş bir donanım parçası vardır, ancak denetleyicide sürekli olarak veri okuyacak ve buluta komutlar gönderecek bir kod yoktur. Daha önce yazılan kodun tüm parçalarını birleştirmeniz yeterlidir.Tabii ki, kodun ek doğrulama seçenekleri vardır (örneğin, ESP-01 donarsa). Bunu yapmak için, periyodik olarak, her okuma veya yazma komutundan önce bir AT komutu gönderilir.Ve eğer cevap OK modülden gelmediyse, modül zorla programlı olarak yeniden başlatılır.

Proje kodunun tamamı şu adresten indirilebilir:

Adreste program dosyaları için güncellemeler alabilirsiniz.

Açık olmayan bir şey varsa, kaynak bağlantıyla ilgili yorumları da okuyabilirsiniz.
8.3
8.6
8.4

Yorum ekle

    • gülümsegülümsemelerxaxatamamdontknowyahoonea
      patronçizikaptalevetevet-evetagresifgizli
      üzgünümdansdance2dance3pardonyardımiçecekler
      Durarkadaşlariyigoodgooddüdükbaygınlıkdil
      dumanzırıltıcraybeyanalaycıDon-t_mentionindir
      ısıöfkelilaugh1mdatoplantımoskingnegatif
      Not_ipatlamış mısırcezalandırmakokumakkorkutmakkorkutuyorarama
      alaythank_youbuto_clueumnikakutanlaşmak
      kötübeeeblack_eyeblum3kızarmakövünçcan sıkıntısı
      sansürlüşakasecret2tehdit etmekzaferyusun_bespectacled
      shokrespektlolPrevedkarşılamaKrutoyya_za
      ya_dobryiyardımcıne_huliganne_othodiFludyasakyakın

Okumanızı tavsiye ederiz:

Akıllı telefon için verin ...