Rfid Ve Google Asistant İle Açılabilen Kapı Otomatiği

Tittle-Photo

Proje Hakkında

Herkese merhabalar, bu blog yazısında Google asistan, rfid kart(anahtarlık), Blynk üzerinden açılabilen aynı zamanda google tablolar üzerinde kimin giriş yaptığını ve ne zaman girdiğini log tutabilen kapı otomatiği projesinden bahsedeceğim.

Proje Gereksinimleri

Projede Kullanılan Platformlar

1. Adım Proje İçin Blynk Kurulumu

Blynk Nedir ?

Blynk nesnelerin interneti için tasarlanmış bir IOT platformudur. Donanımı uzaktan kontrol edebilir,donanıma bağlı sensörlerden gelen veriyi okuyabilir, verileri depolayabilir, görselleştirebilir ve diğer birçok şeyi yapabilen bir IOT platformudur.

Blynk Kurulumu ?

Google Play Store üzerinden Blynk uygulamasını android cihazınıza bu linkten ulaşarak kurabilirsiniz. Cihazınıza kurduktan sonra bir blynk hesabı oluşturmalısınız. Hesap oluşturduktan sonra “New Project” butonuna tıklayarak yeni bir proje oluşturmalısınız.

Blynk Google Play

“New Project” butonuna tıkliyoruzProje adı, kartı ve bağlantı tipini seçerek “create” butonuna tıklıyoruz butona tıkladığınız anda kod içerisinde kullanacağımız auth kodu emailinize gönderilecek.
New ProjectNew Project Ayarları


Widget kutusundan bir button ekliyoruzEklenen butonun pinini bir sanal pin olan V2 olarak değiştiriyoruz
ButtonButton Ayarları


Widget kutusundan bir notification ekliyoruzEklenen notification widget’ın ayarları
ButtonButton Ayarları


Eklenen widgetlar sonrası blynk paneli genel görünümü

New Project


2. Adım Proje İçin IFTTT (Google Assistant) Kurulumu

IFTTT Nedir ?

IFTTT “If This, Then That” anlamına gelir. IFTTT hem bir websitesidir hem de bir mobil uygulamaya sahiptir. Platformun sağladığı şey uygulamaları birbirine bağlamak. Kısacası servislerin ve cihazların birbirleri ile konuşması diyebiliriz. Örneğin android telefonunuzda bir arama yaparsanız, o aramanın günlüğü bir Google e-tablosuna eklenir. Bunu IfTT size sağlar. Veya evde telefonunuzu kaybettiğiniz zaman google home mini cihazınıza “Benim telefonum nerede ?” sorusunu iletirseniz telefonunuzu çaldıracaktır. Bir başka örnek ise toplantı saatiniz geldiğinde philips hue ampüllerinizi yeşil renkte yakabilirsiniz. Bu ve bunun gibi senaryoları IFTTT ile yapmanız mümkün.

Ben bu projede evinizdeki google home mini cihazına veya telefonunuzdaki google asistanınıza “hey google open the door” dediğinizde dış kapı otomatiğini tetiklettirmesini öğreteceğim.

IFTTT (Google assistant Applet) Kurulumu ?

IFTTT web sitesine buradan ulaşabilirsiniz. Siteye google hesabınızla kayıt olup giriş yaptıktan sonra sırasıyla aşağıdaki adımları izleyerek google asistan ile oluşturduğumuz sisteme komut gönderip kapyı açtırabiliriz.

İlk olarak IFTTT sitesinde ana sayfada iken sağ üst köşedeki “Create” butonuna tıklıyoruz. IFTTT Create


Gelen sayfada if kutucuğu içerisindeki “add” butonuna tıklıyoruz. IFTTT IF THIS THAN THAT


Ekrana gelen servisler içerisinden google assistant seçeneğini seçiyoruz. Google Assistant


Bu kısımda olayın tetiklenmesi için google asistanınıza ne söylemek istediğinizi ve asistanınızın size dönüş olarak ne cevap vereceğini belirliyorsunuz. Create Trigger butonuna basıp tetikleyiciyi oluşturmuş oluyoruz. google asistant ayarlar


Gelen sayfada then that kutucuğu içerisindeki “add” butonuna tıklıyoruz ve servisler arasından webhooks’u seçiyoruz. google asistant ayarlar


“authcode” yazan kısma blynk’in kayıt olunan mail adresine gönderdiği auth kodunu yapıştırıyoruz ve diğer ayarları bu şekilde değiştiriyoruz. Create action butonuna basıyoruz google asistant ayarlar


2. Adım Proje İçin IFTTT (Google Sheets Applet) Kurulumu

IFTTT (Google Sheets Applet) Kurulumu ?

Her giren kullanıcı için okuttuğu rfid kartın id’si, giriş yaptığı zaman, adı soyadı ve açılıp açılmadığı bilgilerini göndermek için google tablolarda kayıt tutuyoruz. Google sheet appletlerini eklemek için sırasıyla aşağıdaki adımları izlememiz gerekiyor. Tekrar ana sayfada “create” tuşuna bastıktan ve if kutucuğu içerisindeki “add” butonuna bastıktan sonra servisler içerisinden webhook servisini seçiyoruz.

event name kısmına logger yazıyorum bu benim yazdığım programın bir gereği siz başka bir şey yazabilirsiniz. create trigger butonuna tıkladıktan sonra then kutucuğunun içerisindeki add butonuna tıklıyoruz ve tekrardan yeni bir servis arıyoruz. google asistant ayarlar


Google sheets servisini arıyoruz ve seçiyoruz. google asistant ayarlar


Daha sonra add row to spreadsheet seçeneğine tıklıyoruz. Bunu seçmemizin sebebi tabloya her yeni bir bilgi geldiğinde yeni bir satıra ekleniyor. google asistant ayarlar


Ayarlar aşağıdaki gibi olmalıdır eğer isterseniz tablo adını değiştirebilirsiniz. google asistant ayarlar


Proje Fritzing Şeması

google asistant ayarlar


Proje Kaynak Kodları


#include <SPI.h>    // Rfid modülünün haberleşmesi için SPI kütüphanesi eklendi.
#include <MFRC522.h>  // Rfid modülü için MFRC522 kütüphanesi eklendi.

#include <WiFiClient.h> 
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

//***** KABLOSUZ AYARLARI ******* 
char auth[] = "Blynk auth code";    //Blynk auth code girilecek
const char* ssid = "Wifi SSID";     //Bağlanılacak olan wifi ağı adı
const char* pass = "Wifi Pass";     //Bağlanılacak olan wifi ağı şifresi


//************* IFTTT ****************
const char* server = "maker.ifttt.com"; 
// Kişiye özel IFTTT Url'i
const char* resource = "Google Sheet appletinden gelen link";  // Google Sheet appletinde bulunan link

//*********** RFID **************
#define RST_PIN         D8           
#define SS_PIN          D4          
#define relay           D3
#define button          D8

MFRC522 mfrc522(SS_PIN, RST_PIN);   
String readCardId = ""; // okunan kart idsi
String tempid = "";     // değişken kart idsi

//******** Led Pins and Button Pin *************
#define green           D1
#define red             D0
#define yellow          D2

unsigned long lastTime = 0;
unsigned long lastTime1 = 0;
unsigned long lastTime2 = 0;

unsigned long delayTime = 10000; 
unsigned long delayTime1 = 2500;  
unsigned long delayTime2 = 60000;

WiFiClient client;

//***** ANAHTAR LİSTESİ ***********
String Key_list[2][2] =          // Anahtar Listesi
  {
  {"örnek kullanıcı adı1","örnek kullanıcı 1 kartid"},
  {"örnek kullanıcı adı2","örnek kullanıcı 2 kartid"},
  

  };

// Google tablolar ile bağlantı sağlayan fonksiyon 
void connectGoogleSheets()
{
  int retries = 8;

  while(!!!client.connect(server, 80) && (retries-- > 0)) {
    Serial.print(".");
  }
} 
// IFTTT web servisine bir http isteği gönderir.
void makeIFTTTRequest(String name_surname,String kart_id,String durum) {
  digitalWrite(red,HIGH);
  Serial.print("Connecting to "); 
  Serial.print(server);
  
  int retries = 5;
  while(!!!client.connect(server, 80) && (retries-- > 0)) {
    Serial.print(".");
  }
  Serial.println();
  if(!!!client.connected()) {
    Serial.println("Failed to connect...");
  }
  
  Serial.print("Request resource: "); 
  Serial.println(resource);

  
  String jsonObject = String("{\"value1\":\"") + name_surname + "\",\"value2\":\"" + kart_id
                      + "\",\"value3\":\"" + durum + "\"}";
                      
            
  client.println(String("POST ") + resource + " HTTP/1.1");
  client.println(String("Host: ") + server); 
  client.println("Connection: close\r\nContent-Type: application/json");
  client.print("Content-Length: ");
  client.println(jsonObject.length());
  client.println();
  client.println(jsonObject);
        
  int timeout = 5 * 10; // 5 seconds             
  while(!!!client.available() && (timeout-- > 0)){
    delay(100);
  }
  if(!!!client.available()) {
    Serial.println("No response...");
  }
  while(client.available()){
    Serial.write(client.read());
  }
  
  Serial.println("\nclosing connection");
  client.stop(); 
  digitalWrite(red,LOW);
}
String getID()  
{
  digitalWrite(green,HIGH);
  delay(200);
  readCardId = "";
  if(!mfrc522.PICC_IsNewCardPresent())
    {
      return "";
    }
    if(!mfrc522.PICC_ReadCardSerial())
    {
      return "";
    }
    for(int i = 0; i < mfrc522.uid.size;i++)
    {
      readCardId += String(mfrc522.uid.uidByte[i],HEX);
    }
    Serial.println(readCardId);
    digitalWrite(green,LOW);
    return readCardId;
}

void openDoor()   // Kapı aç metodu kapı otomatiğini 200 milisaniye açıyor ve kapatıyor.
{
  digitalWrite(relay,HIGH);
  delay(200);
  digitalWrite(relay,LOW);
}

void decision()   //Karar fonksiyonu ile gelen kart id'nin kararı verilir.
{
  
  for(int count=0;count<11;count++)
    {
      if(Key_list[count][1] == tempid)
      {
        digitalWrite(red,HIGH);
        digitalWrite(green,LOW);
        
        Serial.print(Key_list[count][0]);
       // Serial.println(" Adli kisi giris yapti.");
        openDoor();
        if(Blynk.connected()) makeIFTTTRequest(Key_list[count][0],Key_list[count][1],"Açıldı.");
        
        digitalWrite(red,LOW);
        digitalWrite(green,HIGH);
        tempid = "";
        break;
      }
    }
     if(tempid != "")
      {
        if(Blynk.connected()) makeIFTTTRequest("Bilinmeyen Kullanici",tempid,"Açılmadı.");
        digitalWrite(red,HIGH);
        delay(250);
        digitalWrite(red,LOW);
      }
}

BLYNK_WRITE(V2) // Blynk Write(v2) ile ikinci sanal pinden okuma alınır.Alınan okuma 1 ise kapı açma izni verilir.
{
  digitalWrite(green,LOW);
  int pinData = param.asInt(); 
  if(pinData == 1){
    openDoor();
    makeIFTTTRequest("Google Asistan","Kartız","Açıldı.");
  }
  digitalWrite(green,HIGH);
}

void setup() {
  Serial.begin(9600);  // Seri haberleşmeyi başlatıyoruz.                                         
  SPI.begin();         // Spi haberleşme başlatıldı.                                       
  mfrc522.PCD_Init();  // Rfid modül başlatıldı.
  
  // röle,ledler,ve buton için giriş çıkış atandı.
  pinMode(relay,OUTPUT);
  pinMode(green,OUTPUT);
  pinMode(red,OUTPUT);
  pinMode(yellow,OUTPUT);
  pinMode(button,INPUT);
  digitalWrite(relay,LOW);
  
  Blynk.config(auth,"blynk-cloud.com", 8080);
  
}

void loop() {
  unsigned long nowTime = millis(); 
  unsigned long nowTime1 = millis();
  unsigned long nowTime2 = millis();

  if (nowTime - lastTime >= delayTime) 
  {
    lastTime = nowTime;    
    if(WiFi.status() != WL_CONNECTED) // her 10 saniyede bir internet bağlantısı kontrol edilir eğer bağlantı yok ise tekrar bağlanmayı dener. 
    {
      digitalWrite(yellow,LOW);
      WiFi.begin(ssid,pass);
      Blynk.config(auth,"blynk-cloud.com", 8080);
    } 
    else digitalWrite(yellow,HIGH);
  }

  if(nowTime1 - lastTime1 >= delayTime1) // her 2,5 saniyede bir kapı açma isteği butonuna basılıp basılmadığı kontrol ediliyor.
  {
    lastTime1 = nowTime1;
    if(digitalRead(button) == true){
      digitalWrite(red,HIGH);
      Blynk.notify("Bina içersindeki kapıdan bir kişi kapı açma isteği gönderdi."); 
    }
    else digitalWrite(red,LOW);
  }

  if(nowTime2 - lastTime2 >= delayTime2)  // bir dakikada bir google tablolar ile bağlantı sağlanıyor.
  {
    lastTime2 = nowTime2;
    connectGoogleSheets();
  }
 
  tempid = getID(); //kart üzerinde okunan kart id tempid değişkenine atılır.
  decision();  // karar metodu ile kapının açılıp açılmayacağı kararı verilir.

  Blynk.run();
}


Sonuç


·