ESP8266 Web Sitesine Veri Gönderme

ESP8266 çeşitli IoT uygulamasında sıklıkla kullanılan bir modüldür. Arduino ve sensörler kullanarak çeşitli sensörlerle çeşitli uygulamalar yapabilirsiniz bu işlemin bir tık üstü ise bu sensörlerden alınan değerlerin internet ortamına aktarılması veya bu sensörleri internet ortamından kontrol edebilmektir. Bu yazımızda Arduino uno da DHT22 ile sıcaklık ve nem değerlerini ölçüp ESP8266 WiFi modülü ile bu değerleri kendi edindiğimiz ücretsiz veya ücretli bir hostingin veri tabanına aktaracağız. Bu verileri istediğimiz yerden görebilecek gerekli durumlarda müdahaleler yapabileceğiz. Bu uygulamaya benzer şekilde gerçek uygulamalar yapabilirsiniz örnek olarak

  • Oda sıcaklığını ve nemini ölçüp mobil cihazınıza veya web sitenize aktarabilirsiniz.
  • Toprak nem sensörü ile bitkilerinizin nem değerlerini uzaktan görebilirsiniz.
  • Ses sensörü kullanarak bebekler için bir kablosuz dedektör yapabilirsiniz.
  • Hareket sensörü kullanarak kablosuz dedektör yapabilirsiniz.

daha da çoğaltılabilir tamamen hayal gücünüze kalmış bir durum. Sözü fazla uzatmadan uygulamaya geçelim uygulama üç adımdan ibaret

1.adımda Arduino ve ESP8266 modülümüzü hazır hale getireceğiz.
2.adımda Web sitemizin veri tabanını düzenleyeceğiz.
3.adımda Web sitemizin değerleri alabilmesi için küçük bir php kodu hazırlayacağız.

1.Adım Arduino ve ESP8266 Bağlantısı.

İlk olarak donanımı hazır hale getiriyoruz bunun için DHT22 data pinini Arduino 2.pine VCC pinini 5V GND pinini ise Arduino GND sine bağlıyoruz. ESP8266 Tx pinini Arduino Rx pinine Rx pinini Arduino Tx pinine VCC ve CH_PD pinlerini Arduino 3.3V çıkışına GND pinini ise Arduino GND pinine bağlıyoruz.

Bağlantıları yaptıktan sonra Arduinoya kod yüklememiz gerekiyor bunun için şimdilik Arduinoya bağlı olan Tx ve Rx kablolarını çıkartıyoruz aksi takdirde kod yüklenmeyecektir.

//ESP8266
#define ag_ismi "Ag_ismi" //kablosuz ağınızın adını buraya girin
#define ag_sifresi "Ag_sifresi" //kablosuz ağınızın şifresini buraya girin
#define IP "siteadiniz.com" //ornek.com şeklinde alan adınızı girin
#include "DHT.h"
#define DHTPIN 2 //DHT pinini 2.pine bağladık
#define DHTTYPE DHT22 //DHT22 kullanacağımızı belirttik 
DHT dht(DHTPIN, DHTTYPE); //DHT sensörü tanımlıyoruz
void setup() {
dht.begin(); //DHT sensörü başlattık
Serial.begin(115200); //Serial haberleşmeyi başlattık
Serial.println("AT"); //ESP çalışmasını kontrol ediyoruz.
delay(10);
if(Serial.find("OK")){   //ESP cevap olarak OK gönderirse devam
Serial.println("AT+CWMODE=1"); //ESP çalışma modunu sadece ağa bağlanabilir oalrak değiştiriyoruz.
String baglantiKomutu=String("AT+CWJAP=\"")+ag_ismi+"\",\""+ag_sifresi+"\"";
Serial.println(baglantiKomutu); //ağa bağlanıyoruz.
delay(100);
if(Serial.find("OK")) //bağlantı başarılı olursa devam
{
Serial.println("aga baglanildi");
}
else
{
  Serial.println("Ag baglantisi saglanamadi tekrar deneniyor...");
  Serial.println("AT+RST"); //bağlanamazsa ESP resetlenir
  delay(1000);
  asm volatile ("  jmp 0"); //Arduino resetlenir
}
} 
else
{
  Serial.println("ESP ile baglanti saglanamadi tekrar deneniyor...");
  Serial.println("AT+RST"); //ESP bağlanmazsa ESP resetlenir
  asm volatile ("  jmp 0"); //Arduino resetlenir
  delay(100);
}
}
void loop() {
float n = dht.readHumidity(); //DHT den nem değerini okuyoruz
float s = dht.readTemperature(); //DHT den sıcaklık değerini okuyoruz
Serial.print("Hava Sicakligi: "); //Ekrana yazdırıyoruz.
Serial.println(s); 
Serial.print("Nem Orani: ");
Serial.println(n); 
sicaklik_yolla(n,s); //Sıcaklık yolla fonksiyonuna değerleri yoluyoruz.
}
void sicaklik_yolla(float n, float s){ 
Serial.println(String("AT+CIPSTART=\"TCP\",\"") + IP + "\",80"); //TCP bağlantısını başlatıyoruz.
delay(2000);
if(Serial.find("Error")){  
Serial.println("AT+CIPSTART Error");
Serial.println("AT+RST");
asm volatile ("  jmp 0"); //Arduino resetlenir
delay(1000);
}
String yollanacakkomut = "GET /writer.php?"; //Get methoduyla sitedeki writer.php dosyasına veri göndereceğiz
yollanacakkomut += "&s="; 
yollanacakkomut += (String(s)); //Stringe dönüştürüp yolluyoruz
yollanacakkomut += "&n=";
yollanacakkomut += (String(n));
yollanacakkomut += " HTTP/1.1\n";
yollanacakkomut += ("Host: siteadi.com\n"); //alan adinizi girin
yollanacakkomut += ("User-Agent: Arduino\n");
yollanacakkomut += "\r\n\r\n";                                                                                                                        
Serial.print("AT+CIPSEND="); //veri göndermeye başlıyoruz.                  
Serial.println(yollanacakkomut.length()+2); //gönderilecek veri boyutunu giriyoruz.     
delay(4000);
if(Serial.find(">")){  //> işareti gelirse veriyi yazıyoruz                        
Serial.print(yollanacakkomut);
Serial.print("\r\n\r\n");
}
else{
Serial.println("AT+CIPCLOSE");
Serial.println("AT+RST");
asm volatile ("  jmp 0"); //veri gönderilmezse arduino resetlenir.
  delay(100);
}
Serial.println("AT+CIPCLOSE");
//delay(10000);
delay(90000); //Sürekli veri göndermemesi için bir süre bekletiyoruz.
}

Kodlarımızı Arduino uno yada başka bir sürüme yüklüyoruz. Yükleme işlemi bittikten sonra arduinonun Tx ve Rx pinlerini tekrar bağlayıp arduinoya reset atıyoruz. Herşey düzgün bir şekilde yapıldığında Arduino veri göndermeye başlamış olmalı şimdi bu veriyi alma kısmına geldi bunun için 2.adıma geçiyoruz.

2.Veri Tabanının Düzenlenmesi

Veri tabanımıza erişmek için öncelikle cPanele giriyoruz ve oradan phpMyAdmine giriş yapıyoruz. Veritabanı konusunda hosting firmanızın bir sınırlaması yoksa yeni bir veritabanı oluşturabilirsiniz. Veritabanımızın tabloları şu şekilde olmalı

  • İd (primary)
  • Tarih (TİMESTAMP)
  • Sicaklik (float)
  • Nem (float)

Veritabanımızı oluşturduktan sonra veri almak için küçük bir adımımız kaldı

3.PHP kodların yazılması

PHP kodları bizim arduinodan aldığımız veileri veritabanına kaydetmek için gereklidir. Bunun için masaüstüne writer.php adında bir dosya oluşturuyoruz. Dosya uzantısının .php olduğundan emin olalım ve kodlarımızı yazalım

<?php

$nem = $_GET['n']; // n değeri arduinonun gönderdiği değişken adı
$sicaklik = $_GET['s']; // s değeri arduinonun gönderdiği değişken adı
if (!$nem) { // eğer değerler alınmazsa 0 yazdıracak
  $nem = 0;
}
if (!$sicaklik) {
  $sicaklik = 0;
}

$db = new PDO("mysql:host=localhost;dbname=**veritabaniadi**", "**kullaniciadi**", "**sifre**");
/* Burada yildizları ve içerisini veritabanı adı,kullaniciadi,sifre ile değiştiriyoruz yildizlarida siliyoruz dbname="deneme" gibi */
if($db)
{
	echo("baglanti basarili");
}
else
	echo("baglanti basarisiz");

$now = new DateTime();
$datenow = $now->format("Y-m-d H:i:s"); //tarih saati yazdiriyoruz

$insert = $db->query("INSERT INTO `bitirme` (`id`, `tarih`,`sicaklik`,`nem`) VALUES (NULL, CURRENT_TIMESTAMP , '".$sicaklik."', '".$nem."')");
//insert komutunda önemli olan isimler ve siralamanın doğru olması
if ( $insert ){
    $last_id = $db->lastInsertId();
    print "insert islemi basarili";
}
$db = null;
?>

php kodlarımızı da yazdıktan sonra writer.php dosyasını public_HTML içerisine atıyoruz.

Bütün işlemleri başarılı bir şekilde yaptığınızda arduino çalıştıkça veritabanına veriler gönderilecektir. Sorun yaşayanlar yorum yapabilir. Kolay gelsin arkadaşlar

22 comments

  1. Merhaba
    Ellerinize sağlık ben asp.net ile bi index hazırladım posturl ile sayfa yüklenirken sql veritabanına gönderdiğim posturl değişkenleri kayıt ediliyor.ESP8622 ile ağa bağlanıyorum fakat AT+CIPSTART komutunda hata alıyorum ip : 192.168.2.75 olarak web sitesine girebiliyorum hatta nat atayarak 8000 portu da açtım zaten ISS oto 80 portunu veriyor fakat adımda error alıyorum dönüş yaparsanız sevirim

  2. Hocam bütün dediklerinizi yaptım ama ESP8266 bir türlü ağa bağlanamıyor. Nerede yanlışlık olabilir sizce?

    1. Merhaba ağ adını (SSID) ve şifreyi doğru girdiğinize emin olun yazdığınız kod bölümünde bağlantı kısmını gönderebilirseniz yardımcı olmaya çalışabilirim
      Nuh Cevdet
      cevdet9@gmail.com

  3. NCEVDET merhaba. Kodunuzu denedim arduiona da ancak esp wifi ye bağlanamıyor. Başka bir kodla harmanladığım zaman bu seferde esp bağlandı görünüyor ancak
    if(Serial.find(“>”)){ //> işareti gelirse veriyi yazıyoruz
    Serial.print(yollanacakkomut);
    Serial.print(“\r\n\r\n”);
    }
    bu kodun içine giremiyor. Yardımcı olurmusunuz?

  4. Merhaba, adımları yaptım ancak istediğim sonucu alamadım. Panelime erişim imkanı versem yardımcı olabilir misiniz ? Teşekkürler iyi çalışmalar.

  5. Merhabalar hocam. Arduino uno ile neo 6m gps modüllü kullanıyorum ve aldığım konumu webe göndermem gerekiyor yardımcı olabilir misiniz?

  6. Merhaba detayli ESP8266 ve veritabani baglantisi yaziniz icin elinize saglik. Musait oldugunuzda veritabanina kayitli verilerin web sayfasinda gosterilebilmesi icin gerekli olan (php/html) kodu eklemeniz mumkun mu? Zira bir cok kisi dogrudan cpenelden izlemek yerine bunu tercih edecektir. Takdir sizin, kolay gelsin.

  7. merhabalar. öncelikle paylaşımınız için teşekkür ederim. bir sorum olacaktı. esp8266 ile mssql veri tabanına ve aspx veriekle.aspx (bu dosyamda bir text ve buton var. butona basınca texteki yazıyı veritabanına ekliyor.)dosyası vasitasıyla(php değil) veri ekleyebilir miyim sizin kodlarla. yoksa sorumun çok farklı bir metodu mu var? cevaplarsanız sevinirim. iyi iyi günler, iyi çalışmalar dilerim. (tüm soruları da tek tek cevaplamanız güzel bir davranış. tşk..)

    1. Anladığım kadarıyla veritabanına Arduinodan aldığınız verileri aktarmak istiyorsunuz açıkçası asp le hiç çalışmadım bir blgim yok ama yapmanız gereken verileri web sitesine göndermeniz. Php ye benzer şekilde asp de de benzer operasyonlar olduğunu tahmin ediyorum. Tam olarak bu kodlar asp de çalışmaz muhtemelen ama operasyon aynı olacaktır Arduino veriyi servera gönderecek yani web sitenize server da veriyi mysql e ekleyecek. Kolay gelsin
      Nuh Cevdet Alparslan
      cevdet9@gmail.com

  8. Hocam youtube da hep nem senserü ile wepe veri göndermeyi yapmışlar .ESP8266-01 ve arduinoyu kullanarak internet aracılıyla bir aleti calıştıramazmıyız. Wep üzerinden sadece bir led yaksak gerisi bizde .

    1. Arduino ile sensörün haberleşmesi gerekiyor bu haberleşmeyi server client mantığı ile yapabilirsiniz. Bir web siteniz varsa bu siteyi aracı olarak kullanıp aradaki veri trafiğini sağlayabilirsiniz. aynı ağ üzerinde bu işleme gerek kalmadan server client ile yapılabilir fakat ağdan çıktığınızda bir aracı kullanmanız gerekir farklı API lar da kullanılabilir. Aynı ağda ise arduino ve esp arduinoyu server olarak tanımlayıp esp client olacak ve led yakmak için mesela ledYak=1 veya ledYak=0 gibi değişkende veri göndereceksiniz 1 veya 0 olma durumuna göre led yakıp söndürebilirsiniz. Farklı ağlarda ya API kullanacaksınız (kullanabileeğiniz api ler hakkında çok bir bilgim yok) yada kendinize ait bir sunucunuz olması gerekecek kolay gelsin
      Nuh Cevdet ALPARSLAN
      cevdet9@gmail.com

  9. merhaba bu projenin aynısı bitirme projem olarak yapmaya çalışıyorum ama bir türlü esp ile bağlantı kuramadım. herşey gayet güzel çalışıyor ağa bağlanıyor ama get metoduyla veriyi bilgisayarıma göndermiyor. Yardımcı olabilirmisiniz baya önemli ödevim için ?

  10. Merhaba, bu sistemi Nodemcu esp8266 ile yapmak istersek ne gibi bir fark olacaktır, bir de sisteme röle bağlayabilir miyiz

    1. Merhaba nodemcu da wifi kütüphaneleri ile aynı işlem yapılabilir ayrıca bildiğim kadarıyla AT komutlariyla da çalıştırılabilir. At komutları için ayrıca firmware yüklemek gerekebilir ama kütüphane kullanarak çok daha kolay bir şekilde yapabilirsiniz kolay gelsin.
      Nuh Cevdet Alparslan
      cevdet9@gmail.com

    1. Online olması ve her yerden erişebilmek için bir web sayfası açmak mantıklı olabilir bunun yerine ücretsiz hosting hizmeti sunan Web siteleri de işinizi görecektir ihtiyacınız olan tek şey basit bir hosting ve veritabanı. İster localhost da yapın ister ücretli hosting kullanın isterseniz ücretsiz hosting karar sizin.
      Nuh Cevdet Alparslan
      cevdet9@gmail.com

Bir cevap yazın

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