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

Merhaba arkadaşlar bugün lcd ekrana nasıl yazı yazdırırız bunu göreceğiz. İlk olarak şunu söylememde fayda var benim kullandığım lcd i2c iletişimini kullanıyor size de bunu tavsiye ederim aksi takdirde çok fazla bağlantı kablosu ortaya çıkıyor.

Kullandığımız i2c iletişimli lcd nin 4 bacğı var arkadaşlar bular GND VCC SCL SDA bacaklarıdır. VCC bacağı arduino 5v çıkışına bağlanacak diğerleri yine arduino üzerinde yazılı yerlere bağlanarak bağlantı tamamlanacak arkadaşlar

I2c iletişimini kullanarak lcd ekranı çalıştırmak istediğimizde yapmamız gereken ilk iş i2c adresimizi öğrenmek bu farklı arduino tipleri için farklı değerler alabilir bunu yapmak için i2cscanner kodumuzu arduinoya ilk olarak yüklemeliyiz ve i2c adres bilgimizi almalıyız.

//wire kutuphanesi i2c haberleşme için gerekli
#include <Wire.h>
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

//Evet arkadaşlar kodumuz bu bu kodu bende arduino forumdan aldım kaynak linki sizinle de paylaşırım
//sizin yapmanız gereken kodu çalıştırmak ve adres bilggisini almak kodlarda bazı satırlar
//kutuphaneye has satırlar oldugu için anlamak biraz zor olabilir ama özünde bulduğu i2c adresleri
//ekrana yazdıran bulamazsa bulunamadı diye uyarı veren bir kod dizisi :)

https://playground.arduino.cc/Main/I2cScanner kodun bulunduğu kaynak burası arkadaşlar

bu kodu çalıştırdığınızda serial monitorde karşılaşacağınız ekran şu şekilde olacak

evet gördüğünüz gibi 0x3F adresi benim i2c adresim sizde bu farklı bir değer olabilir bu değeri not alalım biraz sonra ihtiyacımız olacak arkadaşlar.

 

 

 

i2c bağlantı adresimizi öğrendikten sonra lcd mizin kutuphanesini indirmemiz gerekiyor. Kütüphane yöneticisinden resimde vermiş olduğum kütüphaneyi kurabilirsiniz arkadaşlar

 

 

 

 

 

 

 

 

 

 

 

 

Kütüphanemizi kurduktan sonra kodlarımız geçiyoruz arkadaşlar

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

//evet arkadaşlar lcd mizin kaç satır ve sütundan olduğunu burada belirtmemiz gerekiyor
//benimki 2 satır 16 sutun seklinde ve 0x3F deaz önce öğrendiğimiz i2c adresi sizde kendi adresinizi 
//yazmalısınız
LiquidCrystal_I2C lcd(0x3f, 16, 2);

void setup()
{
	// Lcd ekrnı çalıştırıyoruz ve arka ışık fonksiyonumuzu çağırıyoruz
	lcd.begin();
	lcd.backlight();
	//lcd.print ile lcd ekrana istediğimizi yazdırabiliriz arkadaşlar
	lcd.print("Ornek Yazilim!");
}

void loop()
{
	//surekli dondurecek bir kod olmadığı için loop fonksiyonu boş kalacak
}

Evet arkadaşlar bu örneği de burada noktalıyoruz kolay gelsin arkadaşlar soruları yorum kısmından sorabilirsiniz.

Arduino Serial monitor dediğimizde aklımıza gelmesi gereken iletişimdir çünkü serial port üzerinden yapılan işlemler serial monitorde gözükür nedir bu işlemler. veri gönderme, yazı yazdırma bilgi verme gibi nedenlerle kullanabiliriz. Örneklerde bunu çok daha iyi anlayacağız. Öncelikle arduino programlayabilmemiz için arduino idesini kurmamız lazım Buradan indirebilirsiniz kolay bir kurulumu var dikkat etmeniz gereken kurulum sonunda arduino driverini kurmak için size soracak kurulmasına izin vermelisiniz. Arduino klon kullanıyorsanız eğer googledan aldığınız klon ürün hangisiyse (uno, mega gibi) klon driver yazarak ulaşabilirsiniz.

Arduino ideyi açarak ilk örneğimizi hemen yapıyoruz ve serial monitor kullanarak sonuca bakıyoruz.

Kod yazmaya geçmeden önce birkaç ayar yapmamız gerekiyor. File menüsünden prefences e giriyoruz. Karşımıza gelen ekrandan isterseniz dil olarak Türkçe’yi seçebilirsiniz. “Show verbose output during” bölümünden upload ve compilation kısımlarını işaretliyoruz böylece daha detaylı çıktı görebileceğiz.

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

İlk defa programı açtığınızda sizi bu yazılar karşılayacak kısaca özetlemek gerekirse Arduino da iki temel fonksiyon vardır bunlar setup fonksiyonu ve loop fonksiyonu. Setup fonksiyonunda yazdığımız kodlar sadece bir kere çalaıştırılırken loop fonksiyonunda yazılan kodlar sürekli tekrar eder yani bir döngü fonksiyonudur. açıklama satırlarını artık silip kodlarımızı yazabiliriz.

void setup() {
Serial.begin(9600);
Serial.print("Burada yazilan kodlar bir kere tekrarlanır");
Serial.println("println yazarsak alt satira yazdiririz.");
}

void loop() {
Serial.print("Merhaba Dunya");
}

“begin” başlatmak anlamındadır serial monitor kullanacaksak ilk olarak seri haberleşmeyi başlatmalıyız. Serial.begin yazarak bunu yapıyoruz 9600 değeri ise baund rate değerimiz normal uygulamalarda 9600 değeri işimizi görecektir. Seri haberleşmeyi başlattıktan sonra Serial.print yada Serial.println yazarak Serial monitore yazı yazdırıyoruz peki bunları nasıl göreceğiz.

Ekranın sağ üstünde gördüğümüz merceğe benzer işaretten serial monitoru açabilirsiniz dikkat etmeniz gereken iki nokta var birincisi serial monitorde sağ alttan baund rate yi kodda yazdığımız değerler aynı yapmak diğer dikkat edilmesi gereken ise arduino nun buyuk kucuk harfe duyarlı olması. Sonraki yazımızda görüşmek üzere 🙂