ESP8266-01 ve google e-tablo ile dünyanın her yerinden evinizi kontrol edin.

Bu yazımda, ESP8266-01 ile tüm arduino, pic, stm, raspberry pi vb. sistemler ile evden internete, internetten eve, google e-tablo ile bağlantı kurmanın yolunu anlatacağım.
Artık thingspeak gibi yerlere ihtiyacınız yok. Ayrıca bu yazımdaki gibi web sitesi kurayım, php öğreneyim, sonra esp modülümle site bağlantısını kurayım demenize de gerek yok.

Google E-tablolar size zaten bu imkanı sunuyor. Başka bir şey aramanıza gerek yok.
Bu yazıdaki proje neler yapar.
1-) Evin sensörlerinden gelen bilgiyi istediğiniz süre aralıklarında google e-tabloya aktarır.
2-) Evde sensörler yanlış bir durum olduğunu algılarsa, kontrolcü bunu anında karşı tarafa alarm olarak iletir. Karşı taraftaki program ise bu bilgiyi alıp size e-mail gönderir. Telefonunuzda gelen e-mail bildirimini aktif ettiğinizde, telefon sizi uyaracaktır. Bu şekilde evdeki durumu çok kısa sürede anlayıp  evdeki duruma müdahale edebileceksiniz.
3-) Evde, siz gelmeden bazı cihazların çalışmasını istiyorsanız, E-tabloya not bırakın evdeki kontrolcü, ilk kontrolünde komutunuzu algılayıp cihazı çalıştıracaktır.

Şimdilik bunları yapıyor sizin hayal gücünüzle daha birçok şey yapabilir.

ESP8266-01 modülünü arduino ide üzerinde programlayarak kullanıma hazır hale getirebilirsiniz. Daha sonrasında ise ister arduino ister başka mikro kontrol kartı ya da entegresi kullanın fark etmez. Seri port kullanan herhangi bir cihazdan veriler gönderilebilir. Seri port ile esp01’e gönderdiğiniz veriler e-tabloya gider.

Nasıl yapılıyor.
Öncelikle google hesabınız olmalı. Bu hesapla oturum açıp e-tablolardan 1 tane oluşturup ismini değiştirin.
Daha sonra bu dosyayı, videodaki gibi web de yayınla menüsünden yayınlayın. İstediğiniz sayfasını yayınlayabilirsiniz.
Daha sonra ise ara program olarak google script programına geçmek için Araçlar menüsünden komut dosyası düzenleyicisini açın ve örnek dosyayı oraya kopyalayın. Sonrasında bu programın ismini de değiştirin. Ben etkileşim yapsın diye e-tablo ismiyle aynı yapıyorum.
Son olarak da bu dosyayı da YAYINLA menüsünden WEB UYGULAMASI OLARAK DAĞIT seçeneğini seçerek web de erişilebilir duruma getirin.

E*Tablo webde yayınlama

 

 

 

 

 

 

 

Script dosyasının WEB de yayınlanması

 

 

 

 

 

 

 

Kabaca yapılacaklar bundan ibaret.  Burada dikkat edeceğiniz nokta e-tablo isminin örnek program içerisindeki yerine kopyalanmasıdır. Bu kopyalama doğru yapıldığında siz internetten bir link ile script programını çağırdığınızda, script programı da bu ismini kopyaladığınız e-tabloyu çalıştırıp bilgilerinizi oraya kayıt eder. Daha sonra ise size kayıt yapıldı ya da kontrol yapıyorsanız bırakılan notu gönderir.

e-tablo isminin bu kısmını kopyalayıp script dosyasına yapıştıracaksınız.

Programın açıklaması.
Bir çok bilgi zaten program içinde var. Kolay anlaşılabilir bir programlama. Fakat bazı yerleri açıklamam gerek.
Bu komut ( var stat = add_data(e); )  2 işlevi bir arada görüyor. Birincisi add_data(e) fonksiyonuna gidiyor. İkinci işlev ise fonksiyondan geri dönen değeri stat değişkenine aktarıyor. Sonrada dönen değeri karşılaştırıyor. Geri dönen değer (return 1;) komutundaki 1 değeridir.

Bu satır ise ( var str_koor=(‘F’+(id+2)) )  Hangi hücreye bilgi yazacaksanız bu gelen değişkene bağlı olarak değişsin derseniz bu şekilde string olarak birleştirilir. (id gelen bilgidir. F ise yazılacak hücrenin sütun değeridir. İd=2 dersek F2 hücresine bilgi yaz demektir. )
e-tabloda zaten bu işlemi görebileceksiniz. Satırdaki bilginin yanına F3, F5 gibi rakamlar bu şekilde yazılmıştır.
DoGet fonksiyonu gelen komutları alır ve komut ,veri olarak ayırır. Oluşturduğumuz istek linkinde
https://script.google.com/macros/s/AKfycbx8cDfmRNftAuMDpGASaTfZElu_bjiQ_U7wCSQ30rTjKL5EnQU/exec?func=addData&id=5&val=26.34
link sonundaki (func=addData) addData fonksiyonuna gitmesi gerektiğini söyler. Buraya func=kontrol, func=alarm komutları konuyor. Yani gelen isteğin hangi fonksiyonu kullanması gerektiğini istek satırında belirtiyoruz. Yanında bulunan &id=5&val=26.34 bilgileri ise fonksiyonda kullanılan veriler. İD=sensör numarası olarak kullandım, VAL=sensör değeri olarak kullandım.

Bu link’i web sayfasında adres çubuğuna kopyalarsanız, size sayfadaki kullanıcının eve gönderdiği bilgileri verir.
https://script.google.com/macros/s/AKfycbx8cDfmRNftAuMDpGASaTfZElu_bjiQ_U7wCSQ30rTjKL5EnQU/exec?func=kontrol&id=1&val=1

Çünkü kontrol et dedik. E-tabloda bulunan kullanıcı emirlerini al dedik. Bu fonksiyonda id ve val bilgileri kullanılmıyor. Yazmayabiliriz. Fakat programda fazla satır kullanmamak için diğerlerine uyduruldu.
Bu gelen bilgi programda tek cihaz için ayarlandı. Fakat sizler kontrol fonksiyonunu geliştirerek birden fazla cihaz bilgisini alabilecek duruma getirebilirsiniz. Buradan gönderilen bilgiler JSON koduyla geldiğinden isterseniz JSON PARSE gibi kütüphaneleri kullanabilirsiniz ya da bilgileri ayıklamak için farklı çözüm yolları bulabilirsiniz.

Önemli konulardan biri, SCRIPT programının çalışma şeklidir. Programda bir değişiklik yaparsanız bunu kayıt edersiniz. Fakat bu program web yayınlama yaparken sürüm bilgisi ile yayın yapar. Programda yapılan değişikliğin web üzerinde yayımlanması için sadece değişikliği kaydetmek yetmiyor. Yeni sürüm olarak kaydetmeniz gerekiyor. Tabii ki bu kaydettiğiniz sürümü de yeniden yayınlamanız gerekiyor. Bu yayımlama işlemi sonunda yayımlanan adresler değişmediği için hiçbir yerde paylaşılan adresin değiştirilmesine gerek kalmıyor. Sadece web de yeni sürümü yayınla demeniz yetiyor.

save new version butonunu kullandığınızda sürüm numarası 1 artar

 

 

 

 

 

 

 

Project version kısmında son verilen sürüm numarasını seçip Güncelle butonuna basılır.

 

 

 

 

 

 

 

Programın en başındaki oluşturulan değişkenler, global değişken dediğimiz programın her yerinde kullanılan değişkenlerdir. Fonksiyon içerisinde tanımlanan değişkenler sadece fonksiyon içerisinde kullanılan değişkenlerdir. Ben kullanıcıdan girilen değişkenlerin fonksiyon içerisinde oluşturulup dağıtılmasını istemediğim için bu bilgileri global olarak tanımladım.
Programda DoGet fonksiyonu içerisinde bulunan geri bildirim komut satırları vardır. Bunlar diğer fonksiyonlardan geri dönen bilgileri istek yapan kişiye geri döndürülmesini sağlarlar.
if(mo == “kontrol”)
{   kontrol(e);
var params={“Cihaz ADI”:cihazad1,”Cihaz No”:cihazno1,”Cihaz Durumu”:cihazdur1} // bu değişkenler global değişkendir. her fonksiyonda ortak kullanılabilir.
params = JSON.stringify(params);
return ContentService.createTextOutput(params).setMimeType(ContentService.MimeType.JSON);

}

Yukarıdaki karşılaştırma satırları şunu anlatır. Gelen istekte, kontrol kelimesi varsa kontrol fonksiyonuna git. Sonrasında fonksiyondan dönen cihazad1,cihazno1,cihazdur1 değişkenlerinin değerlerini istek yapan yere geri gönder.
Diğer karşılaştırma işlemleri de bu şekilde devam eder.

Programdaki, e.parameter.func gelen istek satırında func=kontrol gibi, hangi fonksiyon isminin bulunduğu bilgisini tutar.
e.parameter.id ise istek satırındaki birinci veriyi temsil eder.
e.parameter.val ise istek satırındaki ikinci veriyi temsil eder.
Şayet daha fazla değişkeni istek satırında kullandıysanız, burada da program içinde tanımlamanız gerek.

e-tablo örnek resim yukarıdadır. Bu resimde en soldaki sensör verileri 4. satırdan itibaren başlamıştır. Bunun sebebi ise script programında data eklenirken appendrow komutu kullanılması. Bu komut verilerin altındaki ilk boşluğa yaz demektir. e-tabloda sağ tarafta sarı bölge kullanıcının eve göndermek istediği bilgileri kapsadığından appendrow o bilgilerin de altından başlayacağı için 4. satırdan itibaren başlamıştır. Sizler sarı bölgeye kontrol edilecek cihaz listesini uzatacaksanız  listenizde daha alt satırlardan yazmaya başlanacaktır.

ESP programına başlarken şunu dikkate almalıyız. HTTPS SSL bağlantısı için bazı yapılması gereken şeyler vardır. Her zamanki kullandığım #include <WiFiClientSecure.h> kütüphanesi e-tabloya bilgi gönderebiliyor fakat tablodan bilgi alamıyordu. Geri gelen bilgiye baktığımızda 302 ya da 307 gibi kodlar veriyordu. Bu kodlar redirect gibi bir işlemin yapılamadığını belirtiyordu. Bunu yapamazsak evden internete bilgi gönderebiliyoruz fakat internetten eve bilgi gönderemiyordum.
Eski kütüphaneyi, aşağıda linkini verdiğim HTTPSRedirect.h kütüphanesi ile değiştirdim. Bu kütüphane bilgileri hem gönderiyor hem de alabiliyor.
ESP8266-01 modülünü Arduin0 ide ile programlamak için kullanılacak kütüphane

Arduino ide üzerinde benim esp8266-01 modülümü programlamak için kullandığım ayarlar. Sizler esp nin daha üst versiyonlarını kullanıyorsanız burada değişiklik yapabilirsiniz.

Arduino esp kart bilgilerini yüklerken farklı versiyonlar yüklemiş olabilirsiniz. Bu tabloya yakın bir tablo görünebilir. Bazı bilgiler değişik ya da eksik olabilir. Dikkat etmenizi öneririm.

ESP yi Arduino ide ile nasıl programlarım diyorsanız bu link’e bakın. 

ESP8266-01 modülüyle daha yeni tanıştım diyorsanız bu link’e bakın.

ESP8266-01 ile yazılan tüm yazılara ulaşmak isterseniz de Bu link’i kullanabilirsiniz.

Not kullanılan e-tablo google drive içerisinde görünür. Fakat script program google drive içerisinde görünmez. Sadece e-tablo dosyasının içine gömülmüştür.
Ayrıca bu tip uygulamalarda, bağlantıları esp olmadan deneyerek kontrol edebilmek için POSTMAN programını kullanabilirsiniz. Çok faydasını göreceksiniz. Hatta oradan aldığınız kodlar ESP haberleşmesinde kullanılabilecektir. Denemelerde ESP ye defalarca yükleme yapmadan e-tablo erişimini kolaylıkla sağlayacak ve script programının doğru çalıştığını kolaylıkla test edebileceksiniz. POSTMAN programını buradan indirebilirsiniz. 

Bunların yanı sıra MIT APP INVENTOR ile google e-tabloya otomatik olarak ulaşıp bilgilerinizi görmenizi sağlayan örnek programlar var. Fakat bunu gereksiz buluyorum çünkü telefon üzerinde kısa yol oluşturarak google e-tabloya kısa zamanda ulaşılabilir. ALARM konusu da g-mail bildirim ile halledildiğine göre, böyle bir uygulamaya gerek olmayacaktır. Diye düşündüğümden örnek vermedim. İnternette bu tip örnekler mevcut. Gerekiyorsa kolaylıkla yapabilirsiniz.

var b=8;

var cihazno1=0
var cihazdur1=""
var cihazad1=""
var mo=''
// ***************   bu fonksiyon işlem tamamlandığında geri bilgi gönderir.  ***************************
function doGet(e) 
{
   mo = e.parameter.func;
  if(mo == "addData")
  {
    var stat = add_data(e); // stat geri dönen değere bakıyor doğru bir şekilde işlem yapıldıysa stat 1 olacaktır. çünkü return 1 komutuyla fonksiyon bitiyor. 
    if(stat == 1)
    {
      var result = 
      {
        status : true
      };
      return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);
    }
  }
  

  
  if(mo == "kontrol")
  {
  
    kontrol(e);
    var params={"Cihaz ADI":cihazad1,"Cihaz No":cihazno1,"Cihaz Durumu":cihazdur1} // bu değişkenler global değişkendir. her fonksiyonda ortak kullanılabilir.
    params = JSON.stringify(params);
  return ContentService.createTextOutput(params).setMimeType(ContentService.MimeType.JSON);
  }  
  
  
  
   if(mo == "alarm")
  {
 
    
    var stat = alarm(e);
    b=stat;
    if(stat == 1)
   {
      var result = 
      {
        status : true,alarm_sensör : e.parameter.id,Sensor_Deger :e.parameter.val
      };
   
      return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);
    }
  }
}




// ***************   Cihaz kontrol başlangıcı ***************************
function kontrol(e)  //cihaz kontrol
{

  var sheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1JezXjzcw1T561VzaelgLmRCjStEziIa6cvzniPaqNWQ/edit#gid=0');

  cihazad1 = sheet.getRange('G3').getValue();
cihazno1 = sheet.getRange('H3').getValue();
cihazdur1 = sheet.getRange('I3').getValue();

   return

}

// ***************   Cihaz kontrol sonu ***************************




// ***************   e-mail gonderme alarm için. ***************************

function alarm(e)  // e-mail gonder. 
{
add_data(e);
  
      var emailAddress = '97safak@gmail.com'; // Sadece gmail hesabı için. 
  var message = 'ALARM '+'SENSÖR NUMARASI : '+e.parameter.id+'  SENSÖR DEĞERİ : '+e.parameter.val; // Second column
    var subject = 'EVDEKİ SENSÖR ALARM VERDİ';
    MailApp.sendEmail(emailAddress, subject, message);

  return 1;
}

// ***************   e-mail gonderme son. ***************************


// ***************   veri ekleme bölümü . ***************************
function add_data(e)
{
  var sheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1JezXjzcw1T561VzaelgLmRCjStEziIa6cvzniPaqNWQ/edit#gid=0');
 // var lastVal = sheet.getRange("A1:A").getValues();
 // var id = lastVal.filter(String).length;
var id = e.parameter.id;

  var CurrentDate = new Date() // new Date();
  
  var Date_ = Utilities.formatDate(CurrentDate, "GMT+3", "dd/MM/YYYY");
  var Time_ = Utilities.formatDate(CurrentDate, "GMT+3", "HH:mm:ss");

  if(mo == "alarm")
  {
  sheet.appendRow([ id, Date_, Time_,e.parameter.val,'ALARM']); //e.parameter.val
  }
  
  if(mo == "addData")
  {
  sheet.appendRow([ id, Date_, Time_, e.parameter.val]); //e.parameter.val
  }
// ***************   veri ekleme sonu  en alt satıra ekler.  ***************************  
  
  
  
    // burası istediğimiz hücreye değişken bağlantılı kayıt yapma örneğidir. 
// mesela F hücresinden 5. sensör bilgisi için F5 hücresine veri girilmesi gerekebilir. 
// bunun yolunu gösterir. 
  
  
 
 
  var lastVal = sheet.getRange("A1:A").getValues();
  var id = lastVal.filter(String).length;
  var str_koor=('F'+(id+2))  // bu satır string olarak hücre numarasını oluşturur. mesela F sütunu ve 5. sensör 5. satırda olacak şekilde
                         // F5 koordinatını oluşturur. 
  sheet.getRange('F2').setValue(str_koor);
  sheet.getRange('G10').setValue("deneme");
 
  sheet.getRange(str_koor).setValue('F'+(id+2));
  
  return 1;
}

ESP01 modüle gönderilecek komutlar. Aralardaki virgül önemlidir. Dikkat edin.
addData,2,34.94      // bu komut e-tabloya gidecek olan ve altalta eklenecek olan kayıtlar içindir.  2=sensör no ,   34,94 ise sensör değeridir.
Geri dönen değer :
{
“status”: true
}

alarm,3,70.1      // Bu komut sadece alarm için kullanılır bu komutla script dosyası e-mail gönderir. 3= sensör no,    70.1 ise sensör değeridir. 
Geri dönen değer :
{
“status”: true,
“alarm_sensör”: “10”,
“Sensor_Deger”: “85.34”
}

kontrol,0,0        // Bu komut ise kullanıcının internet üzerinden evdeki kontrolcüye iletmek istediği komutları alır.
Geri dönen değer :
{
“Cihaz ADI”: “klima”,
“Cihaz No”: 5,
“Cihaz Durumu”: “ON”
}

 

Faydalı linkler :
https://developers.google.com/apps-script/reference/spreadsheet/sheet

Bu sayfadaki örnek bilgi gönderiyor alamıyordu. Sonrasında farklı bir kütüphane buldum onunla denedim Hem veri gönderiyor hem de alıyor. Buradaki link sadece veri gönderen programdır. 

Buradaki link ise https olarak veri gönderip alabilen bir kütüphaneye sahip.  bu kütüphane videoda gösterilen programın kütüphanesidir.

Bu konu ile ilgili dosyalar buradadır. 

Videodaki e-tablonun internet sayfasından ulaşabileceğiniz link’i budur.
Bu linki kullandığınızda internet sayfasında tüm tabloyu görürsünüz. Fakat değişiklik yapamazsınız.

1.video : Google e-tablo ve Script dosyalarının oluşturulması ve yayınlanması.
2.video :  ESP01 modül ile google e-tabloya bilgi gönderip alma. 

Lütfen eksik kaldı dediğiniz nokta varsa ya da eklemek istedikleriniz varsa yorum kısmına not bırakın ki konuyu okuyan diğer arkadaşlar sizin yorumlarınızdan faydalansın.

 

 

 

 

6 Comments

  1. Merhaba Usta;

    Burada google sheets kodlarını kendime göre uyarlamaya çalıştım. Şöyle bir sıkıntım var. E-tabloda ki tarihi apps script ile postman da çağırdığımda bana 1 gün öncesinin tarihini veriyor. Bu konuda yardımcı olabilirmisin ??

    1. e-tablonuzun nasıl dizayn edildiğini görmediğimden size yardımcı olamıyorum. O tarihi nereden alıyor buna bakmak lazım. POstman a verdiğiniz link nasıl bunu da belirtirseniz bakarak belki daha iyi bir şey söyleyebilirim. 97safak@gmail.com adresime dosyayı yollayabilirsiniz.

  2. merhaba yapılanları birebir yapıyorum ama tek bir veri gönderemiyorum nedeni ne olabilir

    1. en sık yapılan hata bu. Script dosyasını değiştirip kaydediyorsunuz fakat tekrar paylaşıma açmadığınız için hala eski script dosyası kullanılıyor.

      yazıda bu şekilde hatırlattım.

      Önemli konulardan biri, SCRIPT programının çalışma şeklidir. Programda bir değişiklik yaparsanız bunu kayıt edersiniz. Fakat bu program web yayınlama yaparken sürüm bilgisi ile yayın yapar. Programda yapılan değişikliğin web üzerinde yayımlanması için sadece değişikliği kaydetmek yetmiyor. Yeni sürüm olarak kaydetmeniz gerekiyor. Tabii ki bu kaydettiğiniz sürümü de yeniden yayınlamanız gerekiyor. Bu yayımlama işlemi sonunda yayımlanan adresler değişmediği için hiçbir yerde paylaşılan adresin değiştirilmesine gerek kalmıyor. Sadece web de yeni sürümü yayınla demeniz yetiyor.

Şafak Ağustoslu için bir cevap yazın Cevabı iptal et

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