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

Arduino kullanımında şu ana kadar sadece DHT22 ve LCD kullanımını gördük bu örnekte bu iki elemanı ortak olarak bir uygulamada kullancağız. DHT22 sıcaklık nem sensöründen okunan değeri LCD de ekrana yazdıran kodu göreceğiz böylece serial monitörden değil LCD den değerlerimizi okuyabileceğiz.

İlk olarak bağlantıları yapalım daha önce iki elemanında bağlantısını ayrı ayrı göstermiştik. Tek tek göstermek gerekirse

LCD nin

scl pini -> Arduino scl giriş

sda pini -> Arduino sda giriş

VCC pini -> Arduino 5v çıkış

GND pini -> Arduino GND çıkışı

DHT22 ->

 

 

 

 

 

 

 

 

 

 

Bağlantıları yaptıktan sonra sözü fazla uzatmadan kodlarımıza geçelim arkadaşlar zaten önceki örneklere bakmışsanız kodlara aşinasınız demektir.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
LiquidCrystal_I2C lcd(0x3f, 16, 2);
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
	lcd.begin();
  dht.begin();
	lcd.backlight();
}
void loop()
{
 delay(2000);
 float h = dht.readHumidity();
 float t = dht.readTemperature();
 if (isnan(h) || isnan(t)) {
    lcd.println("Deger Okunamadi");
    return;
  }
  //setcursor ile yazıya başlayacağımız kısmı lcd nin 0.satır 0.sutun olarak ayarlıyoruz.
  lcd.setCursor(0,0);
  lcd.print("H: ");
  lcd.print(h);
  lcd.print(" %");
   //setcursor ile bu sefer bir alt satıra iniyoruz lcd nin 1.satır 0.sutun olarak ayarlıyoruz.
  lcd.setCursor(0,1);
  lcd.print("T: ");
  lcd.print(t);
  lcd.print(" *C ");
}

Evet benzer kodları bütün sensörler için yazabiliriz sadece değişkenleri değiştirerek lcd ye istediğimiz değerleri yazdırabiliriz. Evet arkadaşlar bu örneğide burada noktalıyoruz sorunuz olursa yorumlarda sorunuzu sorabilirsiniz elimden geldiğince cevaplamaya çalışırım kolay gelsin 🙂

Küçük bir seranız olduğunu düşünelim ve sıcaklık çok arttığı zaman fanlar yardımıyla içeriyi havalandırsın toplamda 2 tane fan bulunsun sürekli olarak ortam sıcaklığını ölçsün sensör olarak DHT22 sıcaklık nem sensörünü kullanalım fan olarakta elinizde varsa küçük fanlardan bağlayabilirsiniz yoksa bir led bağlayarak test edebilirsiniz. Programda if deyimini kullanacağız size yabancı geldiyse buradan konu anlatıma buradan ise örneklere bakabilirsiniz. Hemen kodlara geçiyorum sorularınız olursa yorumlardan iletebilirsiniz arkadaşlar.

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22 
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  Serial.println("Basit Sera Uygulamasi");
  dht.begin();
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
}

void loop() {
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("DHT sensorunden veri okunamadi!");
    return;
  }
  if(t>=40)
  {
      Serial.print("Sera sicakligi=");
      Serial.print(t);
      Serial.print("Fanlar calistiriliyor...");
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
  }
  else
  {
      Serial.print("Sera sicakligi=");
      Serial.print(t);
      Serial.print("Fanlar durduruluyor...");
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
  }
}

Uygulamanın Proteus programındaki çizimi aşağıda verilmiştir benzer bir çizimi yapıp sizde kodunuzu deneyebilirsiniz

Arduino nun en temel uygulamalarından biri olan DHT22 sıcaklık nem sensörüyle ortamın sıcaklığını ve nemini ölçme uygulamasıyla başlıyoruz. Yemek tarifi gibi tarif olacak ama sonunda iyi anlayacağımıza inanıyorum 🙂

Gerekli malzemeler:

1 adet Arduino

1 adet DHT22 sıcaklık nem sensörü

3 adet dişi erkek jumper kablo

Hazırlanışı:

DHT22 nin VCC pinini yani + ucunu arduinonun 5V girişine bağlıyoruz. GND pinini yani – ucunu ise arduinonun GND girişine bağlıyoruz DHT22 dijital çıkış veren bir sensör o yüzden data pinini arduinonun dijital 2.girişine bağlıyoruz. 3.ping boş kalacak.

Arduino yu USB kablosu ile bilgisayara bağlıyoruz.

Kod yazımı için:

Kodumuzu yazmadan önce DHT22 kütüphanesini indirmemiz gerekiyor bunun için taslak sekmesinden library ekle kısmında libraryleri düzenleyi seçiyoruz.arama kısmında DHT22 yazıyoruz ve DHT sensor library kütüphanesinin 1.2.3 sürümünü kuruyoruz. Sürüme dikkat etmenizi öneririm aksi takdirde kodunuz çalışmayabilir.

Kod:

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22 
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");
  dht.begin();
}

void loop() {
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("DHT sensorunden veri okunamadi!");
    return;
  }
  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);
  Serial.print("Nem: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Sicaklık: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Sicaklik index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}

Evet gördüğünüz gibi C++ örneklerine yazım çok çok benzer burada yabancı kelimeler

dht.begin dht kütüphanesinden gelir ve sensörü çalıştırır. Aynı şekilde dht.readHumidity(), dht.readTemperature(), dht.readTemperature(true) ifadeleri de kütüphaneden gelmektedir. sıcaklık ölçüm, nem ölçüm ve sıcaklıüı fahrenheit cinsinden ölçüm anlamına gelmektedir dht.computeHeatIndex ifadesin de sıcaklık indexini bulmak için kullanılan fonksiyondur.

if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(“Failed to read from DHT sensor!”);
return;
}

kısmında yapılan işlemde şu sensörden sıcaklık, nem yada fahrenheit cinsinden sıcaklık değerleri alınamazsa sensörden değer alınamadığını söyleyip tekrar denenmesini sağlayan kısımdır.

evet arkadaşlar arduino da ilk örneğimiz bu şekilde takıldığınız bir kısım olursa yorumlarda belirtebilirsiniz. kolay gelsin