İnternetten Kontrollü Sera (Arduino – Esp8266 – Json)

Bir önceki yazıda esp8266 ailesinden bahsetmiştik. Esp8266 ile röle kullanımını anlatmıştık. Bu yazımızda ise sizlere geçen sene Tubitak 4006 projesinde tasarladığımız akıllı sera otomasyonunun internetten kontrollü hale getirmeye çalıştık. Bu çalışmamı sizlere de faydası olsun diye buraya koymaya karar verdim 🙂

Arduino ile tasarladığımız sera otomasyonunu Esp8266-01 ile internete bağlayıp sera içi sıcaklık, nem, toprak nem, çatı durumu ve havadaki ışık değerlerini gösteren aynı zamanda sıcak-soğuk havalandırmayı açıp kapatan, sulamayı çalıştıran ve sera çatısını otomatik açıp kapatan sistem olacak.

Bu projede Arduino ve Esp8266 birbirinden bağımsız olarak çalışıp haberleşiyorlar. Arduino ile Esp8266 birbirleriyle pek uyumlu çalıştığı söylenemez. Ben de bu yüzden bağımsız çalıştırdım. Arduino serayı kontrol edip değerleri seri haberleşmeyi kullanarak Eps8266’ya aktarıyor. Esp8266 ise internete bağlanıp Arduino’dan aldığı değerleri sitede gösteriyor siteden aldığı komutları Arduino’ya gönderiyor. Böylece çalışması zor olan Esp8266-01 düzgün bir şekilde çalışmış oluyor.

Serayı Kontrol Edecek Web Site Arayüzü
Esp8266-01 ile Arduino Haberleşiyor

Esp8266 ile oluşturduğumuz serverda değerleri json olarak gösteriyoruz. Çünkü kendi tasarladığımız web sitesinde Esp8266 serverdan aldığım json değerlerini kullanıyorum. Eğer herhangi bir komut çalıştıracaksam GET methodu ile bunu yapıyorum. Ben burada Esp8266’nın kodlarını ve Arduino’nun Esp8266 ile gerekli kodlarını paylaşacağım. Sera otomasyon kodlarını şimdilik paylaşmayacağım. Sera bölümlerini çalıştırmak yerine led yakıp söndüreceğiz. Esp8266’yı programlamanın yolunu daha önceki yazımda anlatmıştım programlamak için oradan yardım alabilirsiniz.
Arduino – Esp8266 bağlantısını yaparken;
VCC ve CH-PD > 5V
Rx > Tx, Tx>Rx
GND > GND
Biz bu projede Arduino’nun 2 ve 3 pinlerinden haberleştirdik. Esp8266’ya 3,3 volt yerine Arduino’nun 5V pinine bağladık.
Aşağıda kodları paylaşıyorum umarım işinize yarar. Sizler de bu kodlardan yola çıkarak internetten kontrol edilebilen istediğiniz birşeyi yapabilirsiniz. Faydası olması dileğiyle…

//Esp8266 Kod Blokları
#include <ESP8266WiFi.h>
const char* ssid = "tbz";
const char* password = "Wifi_Şifresi";
String str1,yenistr;
int oto = HIGH;
int sicak = LOW;
int soguk = LOW;
int sulama = LOW;
int cati = LOW;
// http server oluşturuyoruz
WiFiServer server(80);
int val;
void setup() {
Serial.begin(9600);
delay(10);
// Wifiye bağlanıyoruz
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Server başlıyor
server.begin();
Serial.println("Server started");
// IP adresi yazırılıyor
Serial.println(WiFi.localIP());
}
void loop() {
String str;
//Arduino'dan gelen bilgileri okuyoruz 
yenistr = Serial.readStringUntil('\n');
//Eğer gelen varsa str1 değişkeninde akyarıyoruz.
if (yenistr.length()>0) {
//Gelen değerin sonundaki alt satır kodunu çıkartıyoruz.
str1 = yenistr.substring(0,yenistr.length()-1);
}
//Arduino'ya değerleri gönderiyoruz.  str="$"+String(oto)+"|"+String(sicak)+"|"+String(soguk)+"|"+String(sulama)+"|"+String(cati)+"-"+WiFi.localIP().toString();
//$0|1|1|1|0-192.168.1.5 şeklinde değer gönderiyoruz.
Serial.println(str);
// Herhangi birinin bağlanıp bağanmadığını kontrol ediyoruz.
WiFiClient client = server.available();
if (!client) {
return;
}
// İstemciden veri gelene kadar bekliyoruz.
while(!client.available()){
delay(1);
}
// İstemciden gelen ilk satırı okuyoruz.
String req = client.readStringUntil('\r');
client.flush();
//gelen değerde eğer '?id=oto' ifadesi varsa otomatiği kapatıyor ya da açıyor.
if (req.indexOf("/?id=oto") != -1)
{
oto=!oto;
}else if (req.indexOf("/?id=sicak") != -1)
{
sicak=!sicak;
}else if (req.indexOf("/?id=soguk") != -1)
{
soguk=!soguk;
}else if (req.indexOf("/?id=cati") != -1)
{
cati=!cati;
}else if (req.indexOf("/?id=sulama") != -1)
{
sulama=!sulama;
}
client.flush();
//Json değerlerini Server'a yazdırıyoruz.
String Content = "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nAccess-Control-Allow-Origin: *\r\n\r\n{\"gelen\":\""+String(str1)+"\",\"otomatik\":\""+ String(oto)+"\",\"sicakhava\":\""+ String(sicak)+"\",\"sogukhava\":\""+ String(soguk)+"\",\"sulama\":\""+ String(sulama)+"\",\"cati\":\""+ String(cati)+"\"}\r\n\r\n";
// Server'a bilgileri yazdırıyoruz
client.print(Content);
delay(1);
Serial.println("Client disonnected");
}


//Arduino kodları
#include <SoftwareSerial.h>
int i=0;
String header;
//Arduino 2(RX) ve 3(TX) pinleri ESP8266 ile haberleşecek
SoftwareSerial esp(2, 3); 
char gelen[7];
void setup()
{
Serial.begin(9600);
Serial.println("Begin");
esp.begin(9600);
pinMode(8, OUTPUT);
}
void loop()
{
//Arduino ile eps8266 seri portttan haberleşiyorlar.
if (esp.available())
{

  header=esp.readStringUntil('\n');
  //Esp8266'dan gelen veriyi kontrol ediyoruz
  if(header.substring(10,11)=="-")
  {
  Serial.println(header.substring(0,10)+'-'+header.substring(11,header.length()));
   ////$0|1|1|1|0-192.168.1.5 şeklinde gelen değerden veri alıyoruz
  gelen[0]=header.charAt(1);
  gelen[1]=header.charAt(3);
  gelen[2]=header.charAt(5);
  gelen[3]=header.charAt(7);
  gelen[4]=header.charAt(9);
  header="";
  }
//25|65|256|100|658| şeklinde Esp8266 ya değer gönderiyoruz. sicaklik|nem|topraknem|servo|ldr
esp.println("25|65|256|100|658");

//Düzelttiğimiz verilere göre ledleri yakıp söndürüyoruz.
if(gelen[0]=='1') digitalWrite(7, HIGH); else digitalWrite(7, LOW);
if(gelen[1]=='1') digitalWrite(8, HIGH); else digitalWrite(8, LOW);
if(gelen[2]=='1') digitalWrite(9, HIGH); else digitalWrite(9, LOW);
if(gelen[3]=='1') digitalWrite(10, HIGH); else digitalWrite(10, LOW);
if(gelen[4]=='1') digitalWrite(11, HIGH); else digitalWrite(11, LOW);
}
}

2 yorum

  1. sera konusunda bana da yardımcı olabilirmisiniz acaba biz röle kontrolü ve nem değerlerini görmek istiyoruz sadece sizinki daha genel

    1. sera nemini alacaksanız dhtc11 kullanmanız lazım. hangi aşamada olduğunuz bilmiyorum. açarsanız yardımcı olabilirim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir