ESP8266-01, Firebase database, Pic+Arduino+Stm …

Daha önce dünyadan evinizi kontrol edebilirsiniz konulu bir yazı yazmıştım. O yazıda, web sitemde mysql database ve php kullanıyordum. PHP bilmeyenler veya database açmayı bilmeyenler için biraz karmaşık gibi görünse de kolay şekilde nasıl yapılacağını anlatmıştım.
Dünyadan evinizi kontrol edin yazımı buradan okuyabilirsiniz. 

Şimdi ise bütün bunları bir kenara atıp database ihtiyacınızı kolayca, web sitesine bile gerek kalmadan nasıl karşılayacağınızı anlatmaya çalışacağım. Bunu nasıl kullanacağız derseniz ESP8266-01 modülü nodemcu gibi tek başına kullanılacak ve database ile haberleşip istediğiniz bilgiyi size aktaracak.
Esp8266-01 modülü ile seri port haberleşmesi yaparak. Hangi işlemciyi kullanacağım derseniz, PIC, ARDUINO, STM, RASPberry pi gibi seri port haberleşmesi yapan herhangi bir ortamdan database bilgilerinize ulaşıp kontrol edebilirsiniz.
Hatta yeni bir sensör eklemek istediğinizde, seri port üzerinden sensörün ismini tanımlamanız yeter. Sensör bilgilerinizi kolayca gönderip alabileceksiniz.

Nasıl yapabileceksiniz: 
Öncelikle şunu söylemeliyim bir FT232RL ( usb seri çevirici), ESP8266-01 modül ve arduino ide üzerinden ESP8266-01 programlamasını kullandım. Sizler FT232 usb seri çeviriciye sahip olmak zorunda değilsiniz. Kendi Arduino modülünüzü usb seri çevirici olarak kullanabilirsiniz. Arduino’nun USB seri çevirici olarak kullanılmasını ve ESP8266-01 in nasıl programlanacağını buradan okuyabilirsiniz.

Şimdi adım adım google firebase sitesinde, nasıl database açabileceğimizi görelim.
Buradan siteye gidelim. Sitenin sağ üst köşesindeki konsola git butonuna basalım. Sizden google hesabınızda oturum açmanızı isteyecek. Oturum açın. Gelen ekranda PROJE EKLE butonuna basın.
Proje isminizi yazıp devam edin.
İlk çalışmanızda google analytics kısmını sürgülü butondan kapatın.
Proje oluştur butonuna basın. Oluştuğunda devam edin.
Ekranın sol tarafındaki menüden Database’i seçin.
Size ekranda seçenekler gelecek. ( cloud firestore, Realtime database) Siz Realtime database seçeceksiniz. ( Cloud firestore biraz daha detaylı ve ESP ile erişimde realtime database kadar kolay değil. Bundan dolayı realtime database ile çalışmasını anlatacağım)
Realtime Database seçtiğinizde gelen ekranda 2 seçenek var. Biri test amaçlı ve 30 gün süreli. Bunu seçerseniz, gizli anahtara bile ihtiyacınız olmaz. Deneme içindir.
Bu çalışmada kilitli modda başla seçeneğini seçeceğiz. Gizli anahtara ihtiyacımız olsun.
Detaylar ilk videoda pratik olarak gösterilmiştir. 
İlk database oluştu artık burada istediğimiz bilgilerin yerlerini ayırabiliriz. İlk veri girişi bu şekildedir. 
yukarıdaki gibi veri girişi yapılacak fakat gördüğünüz gibi bir grup oluşturuldu bu nasıl oluşur. Aşağıdaki resimde olduğu gibi açılan kutunun yanındaki + ya bastığınızda bir kutu daha açar. önce grup adını sonrasında veri adını yazıp bir kerede EKLE butonuna basın.

Database hazır. Bunu kullanmak için ESP8266-01 modülünü programlama moduna alın.
( Programlama modu: GPIO-0 ucunu GND ile birleştirmektir. )
Tx,  RX, 3.3V, GND uçlarını FT232RL nin uçlarına bağlayıp FT232RL modülünü 3.3V çalışma moduna alabilirsiniz. ( Ben 5V besleme için powerbank ve 3.3V için ise ams1117 3.3V regülatör kullandım. Kartımı ona göre dizayn ettiğimden sizler arduinonun 3.3V kısmından alabilirsiniz. Arduino kullanıyorsanız esp Rx pimi için seviye dönüşüm dirençleriyle gelen sinyal seviyesini 3.3;V seviyesine düşürebilirsiniz. ESP8266-01 kategorisine baktığınızda ESP ye giriş konusunda detaylı bilgiler bulabilirsiniz.)

Bağlantılarınız tamam ise Arduino ide ye programı yükleyebilirsiniz. Ayrıca şu yazıyı da okumalısınız. Nedeni ise arduinoyu usb seri çevirici kullanmak ve arduino ide için ESP kart ayarlarını bu yazıda bulacaksınız.
Arduino USB seri çevirici olarak kullanmak ve ESP8266-01 programlamak.

Yüklediğiniz program Firebase kütüphanesini kullanıyor. Bu kütüphaneyi de buradan bulabilirsiniz. Kütüphaneyi buradan zip olarak indirip, Arduino program dizininizde library dizinine eklemeniz gerekir. İsterseniz ide üzerinden ekleyin, isterseniz kendiniz kopyalayın.
FIREBASE Kütüphanesi. 

Databese’in son durumu bu şekildedir. Dikkat etmeniz gereken yer veri tipleridir. Verileriniz integer ve string olabilir. Veya daha farklı modlarda olabilir. Buna göre de verilerinizi gönderip almak zorundasınız. Ben programda String ve integer kullandım fakat boolean da kullanabilirsiniz. Kütüphaneye bakıp nasıl kullanılacağını öğrenebilirsiniz.

Program ile database içerisinde belirlediğimiz anahtar içerisindeki bilgi değiştirilebilir. Yeni anahtarlar oluşturulabilir, Denemedim ama açtığınız anahtarlarını da remove komutuyla silebilirsiniz. Kütüphanesini incelediğinizde görebilirsiniz.
Programın çalışması esnasında bazı kontroller yapılmaktadır. Vereceğiniz anahtar ve değerin aralarında virgül olması gerekir. Ayrıca veri okunacak mı yazılacak mı bunun belirtilmesi gerekir. Bununla birlikte veri tiplerinin, (int ve string gibi) önemli olmasından dolayı veri tipine göre yazmak gerekir. Örnek: yazstr,mutfak/priz1,on   Burada komut ve diğerlerini ayırmak için virgülden faydalanılır. Arduino  komutu olan index of komutunu kullanarak, ESP modülümüz gelen veriyi parçalar ve gönderilecek hale getirir.

Gönderilebilecek veriler : Veri yapısı : Komut,anahtar,değer şeklindedir. 
yazstr,mutfak/priz1,on  anlamı: string olarak yaz ve mutfak dizinindeki priz1 verisini değiştir.
yazint,oturma_odasi/lamba1,200   anlamı: int olarak yaz ve oturma_odası içerisindeki lamba1 değerini değiştir. ( Burada gördüğünüz gibi türkçe karakter yanlışlıkla kullandım. Database sitesinde sorun olmaz ama, bunun ismini seri port üzerinden göndermeniz sorun olabilir. Database sayfasında gördüğünüz oturma_odası aslında nasıl görünüyor derseniz, database içerisinde görünen  şekli budur. (oturma%20odas%C4%B1) Türkçe karakter kullanmamaya özen göstermelisiniz. 
oku,mutfak/priz2,x  
burada X önemsiz bir karakter. Sadece substring ile string içerisinde parça alırken sıfır çıkmasın diye herhangi bir karakter konulması sağlanmalı. Program içerisinde bu karakter zaten kullanılmayacak.
Şöyle olma-malı.oku,mutfak/priz2,  

Program içerisindeki kontroller. 
Seri port üzerinden göndereceğimiz bilgide 2 adet virgül olmalı. bunlardan biri bile eksik olsa veriler yanlış olur. Bu durum kontrol ediliyor.
yazstr ve yazint ile yaz kelimesi gelebilir. bu da kontrol ediliyor. Yanlış yazılabilir diye.
oku,mutfak/priz2,x    X herhangi bir karakter. bunun olup olmadığını program kontrol ediyor.
Program bunlar için geri bildirim veriyor. Diğer öngörülmeyen hatalardan dolayı kayıt işlemi yapmıyor veya okumuyor bunu size bildirmiyor. Programı geliştirmek isteyenler bu geri bildirimleri de yine kütüphane komutu olan firebase error bilgisine göre geri bildirim verebilir.

Programın ihtiyacı olan bilgileri nasıl sağlayabiliriz:
Birinci bilgi internete çıkmak için modeminizin kullanıcı ismi ve şifresi. ( SSID , PASSWORD)
İkincisi ise Firebase database yolu ve gizli anahtar.
#define WIFI_SSID “SSID”
#define WIFI_PASSWORD “PASSWORD”
#define FIREBASE_HOST “esp8266-4140a.firebaseio.com”
#define FIREBASE_AUTH “2NaRXXwRefCCxTx9KBarrDm957KKDJsN4nJj1Dqq”

Yukarıdaki firebase HOST ve AUTH kısmını denemek için kullanabilirsiniz. Fakat kendi database’iniz oluştuğunda bunları da değiştirmeniz gerekecek. Aşağıdaki resimde Firebase HOST nerede yazar bunu görüyorsunuz.

Gizli anahtarımıza ulaşmak için sol menü üstünde ayar ikonu var. Onu tıkladığınızda Proje ayarları seçeneğini seçin. Veri anahtarını göster deyip kopyalayın.

ESP programı aşağıdadır.

#include <ESP8266WiFi.h>

#include <FirebaseArduino.h>

#define WIFI_SSID "ESP_REPEATER"
#define WIFI_PASSWORD "12345678"
#define FIREBASE_HOST "esp8266-4140a.firebaseio.com"
#define FIREBASE_AUTH "2NaRXXwRefCCxTx9KBarrDm957KKDJsN4nJj1Dqq"
String strgel="";
String dataname="";
String datadeger="";
int saydatdeg=0;
//int LED1 = 4;
int serbak=0;
int virbak=0;
int virbak1=0;
String komut="";
int  temp=0;
void setup()
{
Serial.begin(115200);

//pinMode(LED1, OUTPUT);

  delay(2000);
  Serial.println('\n');
  // **********************  seri porttan gönderilen bilginin arkasına CRLF eklenecek. \r\n gibi. ESP böyle çalışır. *******************
  
  wifiConnect();    // wifi bağlantı alt programına gider. 

  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);    

  delay(10);
}

void loop()  // ***********  INT ve STRING değerler önemli SET ederken de önemli. yoksa database yanlış olacak ve değerleri boşluk olarak okursunuz. ***
{ 

 while (Serial.available() > 0) {   // kullanıcı girişi bekler. arduinodan ,picten stmden ya da PC den. 
  strgel=Serial.readStringUntil('\n');    // kullanıcıdan gelen dizilimi alır. yazstr,led1,25 gibi. "," önemlidir.data ismi ve datayı ayırır unutulursa uyarır.  
    serbak=1;  

  }
// string ayırma *******  data ismi ve datatyı birbirinden ayırır.yazint,led1,25 olsun  led1=data ismi   25= datadır. ve data integer ya da string ayırımı vardır. dikkat

if (serbak==1){    // sadece seri portttan bilgi geldiyse kontrol edilir. mesela otomatik almak için gitmek yerine seri komutu gönderen istediği anda git oku desin. 
                    // *******************  bu database trafiğini rahatlatır. *******************

virbak=-1;    // virbak=virgül bak demek. indexof ile "," işaretinin kaçıncı sırada olduğuna bakılarak substring ile data ismi ve data birbirinden ayrılır.

virbak=strgel.indexOf(",");
virbak1=strgel.indexOf(",",virbak+1);
if (virbak==-1 || virbak1==-1){   // "," yoksa burada seri porttan bilgiyi kim gönderdiyse uyarır. çünkü database bunu uyarmıyor ve hatalı kayıt yapar. 
                                  // || işareti lojik OR işlemidir. virbak ya da virbak1=-1 ise hata ver gibi okunur. 
  serbak=0;    // serbak=0 yapıldığında hiç bir işlem olmaz. serbak=2 yazma komutu serbak=3 okuma komutudur.
  Serial.print("kayip STRGEL : ");Serial.println(strgel);
  Serial.print("kayip serbak ");Serial.println(serbak);
  Serial.println(" Yazdiginiz bilgide virgül hatası");
  
}
// ********************* seri porttan gelen dizinin ayrılması  ****************************
komut=strgel.substring(0,virbak);  // yazstr, yazint, oku komutlarıdır.
Serial.print("KOMUT: ");Serial.println(komut);
Serial.println("virbaklar : ");Serial.println(virbak);Serial.println(virbak1);
if (virbak>-1 && virbak1>-1){   // bilgi doğru gelmiştir artık ayrılabilir komut ve data olarak. YAZSTR,LAMBA1,"oda1" gibi yazılabilir.
  
  dataname=strgel.substring(virbak+1,virbak1);
  Serial.print("dataname: ");Serial.println(dataname);
  datadeger=strgel.substring(virbak1+1);
  temp=datadeger.length();  // burada gönderiğimiz dizilimdeki \r karakterini string içinden çıkarıyoruz.
  datadeger=datadeger.substring(0,temp-1);
  Serial.print("datadeger: ");Serial.println(datadeger);
  saydatdeg=datadeger.toInt();    // gelen STRING değişken INT değişkenine çevriliyor. database de int olarak saklandığı için. 
                                  // şayet STRING olarak kalsın derseniz YAZ komutunu yazint ve yazstr yapıp bu ayrımı yapabilirsiniz. 
  Serial.print("saydatdeg: ");Serial.println(saydatdeg);
  Serial.print("uzunluk: ");Serial.println(datadeger.length());
   if (datadeger.length() < 1) { serbak=0; Serial.print(" yazdiginiz komut hatali ");Serial.println(strgel); } } } //************************** KOMUT AYRIMI YAPILIR ************************************* if (serbak==1){ // seri porttan gelen bilgiyi yazdırır istenirse silinir. Serial.print("STRGEL : ");Serial.println(strgel); Serial.print("serbak ");Serial.println(serbak); if (komut=="yazstr" || komut=="yazint" ) { serbak=2; } if (komut=="oku"){ serbak=3; } if (serbak==1){ serbak=0; Serial.print(" yazdiginiz komut hatali:==>  ");Serial.println(strgel);
   }
}

// ********************* DATA OKUMA ****************************
if (serbak==3){ //*********** okuma modundadır. *******************
  dataname="diz0/LED3";  // bu silinecek. yanlışlık olursa diye
// *****  burada aşağıdaki okuma ve yazma satırlarını strbak=1 ve strbak=2 olması durumuna göre if cümlesinin içerisine al. 
 Serial.println(Firebase.getInt(dataname));  // OKUMAK için kullan 
 delay(1000);
 Serial.println(Firebase.getString("lamba_isim"));  // 2. data okuma string olarak okuma özelliğini gösterir. ***** silinecek***
 delay(1000);
}
if(Firebase.failed())    //   firebase herhangi bir sebeple hata döndürdüyse mesela internet kesildiyse hata verir. 
{
Serial.println("Internet lost");
delay(5000);

}
 
 

// ********************* DATA YAZDIRMA ****************************
 
 if (serbak==2){   // data yı değiştirmek için SET edilir. şayet data ismi database içerisinde yoksa database'e ekleme yapar. 
                   // örnek : LED1,15 varken siz LED2,16 dediğinizde database'e LED2,16 dataismini ekler ve değerini yazar. 
                   // nasıl bir şeyde kullanacağız derseniz. Yeni sensör eklediğinizde sensör için firebase sitesine gidip 
                   // isim yeri açmanıza gerek yok. Seri port üzerinden ESP ye söylersiniz o sizin için açar. 


if (komut=="yazstr") {
  Serial.print("gelen yazstr"); Serial.print(dataname);Serial.println(datadeger); 
     Firebase.setString(dataname,datadeger);   // SET etmek için kullan LED1 database değişkeni
                            // ****  DİKKAT **** bu değişkenleri anlamsız yaparsanız bir anda database içeriği silinebiliyor. tüm değerler sıfırlanıyor.
                            // saydatdeg olan bilgi int bilgidir. String ayırmadaki gibi buraya int ve string yazmak için if cümlesiyle str ve int için ayrılmalı. 
}
if (komut=="yazint"){
Serial.print("gelen yazint"); Serial.print(dataname);Serial.println(saydatdeg);                 
  Firebase.setInt(dataname,saydatdeg);   // SET etmek için kullan LED1 database değişkeni
                            // ****  DİKKAT **** bu değişkenleri anlamsız yaparsanız bir anda database içeriği silinebiliyor. tüm değerler sıfırlanıyor.
                            // saydatdeg olan bilgi int bilgidir. String ayırmadaki gibi buraya int ve string yazmak için if cümlesiyle str ve int için ayrılmalı. 
}

delay(1000);
 }
//******************************* DATA YAZDIRMA SONU *************************************************

if(WiFi.status() != WL_CONNECTED)   // zaman zaman internet kopabilir koparsa bunu kontrol eder ve yeniden bağlanmaya gider. 
{
  wifiConnect();  // wifi tekrar bağlanacak.
}
delay(10);
atlason:
serbak=0;
}

void wifiConnect()    // ****************    internet bağlanma alt programı. ******************************
{
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);             // Connect to the network
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID); Serial.println(" ...");

  int teller = 0;
  while (WiFi.status() != WL_CONNECTED)
  {                                       // Wait for the Wi-Fi to connect
    delay(1000);
    Serial.print(++teller); Serial.print(' ');
  }

  Serial.println('\n');
  Serial.println("Connection established!");  
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());         // Send the IP address of the ESP8266 to the computer
}

Konu ile ilgili faydalı linkler :

1-)Firebase Realtime Database

2-) App inventor ile firebase database çalışması.

3-)MIT App Inventor Firebase Authentication Kullanımı

App inventor programı ile ilgili açıklama yapmıyorum Proje hocam sitesine bağlı olan 2. linkte gerekli açıklamaları bulabilirsiniz. 2. video ise bunu pratik olarak anlatıyor.


 

 

4 Comments

  1. Hocam elinize sağlık , gerçekten faydalı bir içerik olmuş.Ek olarak JSON formatıyla bilgileri çekip , bu bilgileri android uygulaması üzerinde grafiksel olarak görebilseydik çok güzel olabilirdi.Yine de elinize sağlık.

    1. json formatı ile bilgileri almak için programda değişiklik yapıyorum. bilgileri alabilirim fakat grafik dediğiniz zaman firebase analytics aktif edilirse oradan geçmiş verileri ve tabloları alınabilir diye düşünüyorum. ben proje dosyasını hazırlarken istatistik bilgi istemediğim için kapatmıştım. istenirse yapılabilir diye düşünüyorum.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.