Arduino ile Azure Mobile Services Bağlantısı IoT

Bu yazımda, Arduino ile aldığımız verileri bulut ortamına aktarmayı göstermeye çalışacağım. Yani bu yazıyla birlikte IoT konusuna da girmiş olacağız.

IoT (Internet of Things = Nesnelerin İnterneti) adından da anlaşılacağı üzere fiziksel ağ üzerindeki nesnelerin; cihazlar, araçlar ve binalarda bulunan elektronik gömülü sistemler sayesinde birbiriyle bağlantı kurması ve veri alışverişi yapması olayıdır. 1970’lerden itibaren kurulan ATM’ler ilk IoT cihazları kabul edilmektedir. Günümüzde de bu tarz cihazların sayısı artmaya devam etmektedir. Cisco firmasının öngörüsüne göre 2020 yılında tüm dünyadaki IOT cihazlarının sayısı 50milyar’a ulaşması beklenmektedir[1]. Bunun anlamı bir kaç yıl içerisinde IoT teknolojisi hayatımızın her alanına girmesi demektir. Örneğin internete bağlı buzdolabımızdaki yumurtanın bittiğinin tespit edilmesi ve otomatik olarak marketten yumurta siparişinin edilmesi, sağlık alanında kritik hastaların takibi ve olası kriz öncesi mühahale yapılarak yaşam kalitesinin arttırılması, araçlarımızdaki arızanın büyük boyutlara ulaşmadan tespiti gibi sınırı olmayan bir alan olarak görebiliriz.

Internet of Things Video[2]

Biz de bu yazımızda yapacağımız basit bir örnekle IoT dünyasına ufak bir adım atmış olacağız. Örneğimde Arduino Uno R3 ve internet bağlantısını gerçekleştirmek için de Ethernet Shield kullanacağım.

Arduino Uno hakkında kısa bir bilgi verecek olursak, üzerinde ATMEL firması tarafından geliştirilen Atmega328 mikrodenetleyicisi bulunmaktadır. Arduino üzerindeki programı yürüten asıl mikrodenetleyici budur. Program belleği 32KB olup, veri belleği ise 2KB’dır. Kart üzerinde bulunan diğer entegre ise Atmega16u2 ise USB bağlantısı için kullanılmaktadır. Ayrıca 14 adet dijital giriş/çıkış pini, 6 adet de analog giriş/çıkış pini bulunmaktadır.

Ethernet Shield ve kütüphanesi hakkında şu linkten ayrıntılı bilgiye ulaşabilirsiniz.

https://www.arduino.cc/en/reference/ethernet

Kodumuzu yazacağımız ortam ise Arduino için Java dilinde hazırlanmıştır. Kodlamada kullanılan kütüphaneler ise C ve C++ dillerinde yazılmıştır. Bu IDE’yi https://www.arduino.cc/en/Main/Software adresinden indirip, bilgisayarınıza kurabilirsiniz.

Örneğimizdeki senaryo, oda ısısının ve neminin belli aralıklarla okunması ve bulut ortamına aktarılması olacak. Oda sıcaklığını ölçmek için DHT11 sensörünü, verilerimizi bulut ortamında barındırma işlemini ise Azure Mobile Services’i kullanacağım.

Eğer Azure Mobil Services 'in oluşturulması hakkında bilgi sahibi değilseniz; Azure Mobil Services Nasıl Oluşturulur? yazımı okuyabilirsiniz.

1. Devrenin Kurulması: Malzemeler:

  • Arduino UNO R3
  • Ethernet Shield
  • DHT11 ısı ve nem sensörü
  • 1 adet 10K direnç
  • 5 adet kablo (Tasarımınıza göre sayı değişebilir.)

 

DHT11 ısı ve nem sensörü:



Devre prototipi:



DHT11’in kullanım klavuzunda bellirttiği şekilde devreye bağlantısını gerçekleştiriyoruz. DHT11’in ikinici bacağını yani veri bacağını Arduino’nun 2 numaralı dijital girişine bağlıyoruz. 

(Şekildeki devreyi Fritzing programıyla oluşturdum. Fritzing programını http://fritzing.org/download/ bu adresten ücretsiz olarak temin edebilirsiniz.)



2. Kodun yazılması ve Arduino’ya yüklenmesi:

Öncelikle DHT11’in kütüphanesini indirip, C:Program Files (x86)Arduinolibraries ‘deki kütüphane klasörümüze kopyalıyoruz. Daha sonra bu kütüphanemizi include komutuyla kodumuza dahil ediyoruz.

DHT11 Kütüphanesini İndir.

Sensördeki değerleri serial monitor’de görüntülemek için aşağıdaki kodu Arduino’ya yükleyelim.

// omereryilmaz.com Arduino ile Azure Baglantisi

#include <dht11.h> // DHT11 kütüphanesini dahil ediyoruz.
#define dataPIN 2 // dataPIN olarak Dijital 2'yi belirliyoruz.

dht11 DHT11;

void setup()
{
  Serial.begin(9600); // Seri iletişimi başlatıyoruz.
}

void loop()
{
  Serial.println("n");
  // Sensörün okunup okunmadığını konrol ediyoruz.
  // kontrol 0 ise sorunsuz okunuyor demektir.
  int kontrol = DHT11.read(dataPIN);

  if(kontrol==0){
  // Sensörden gelen verileri serial monitörde yazdırıyoruz.
  Serial.print("Nem (%): ");
  Serial.println((float)DHT11.humidity, dataPIN);

  Serial.print("Sicaklik (Celcius): ");
  Serial.println((float)DHT11.temperature, dataPIN);
  }
  else{
    Serial.print("Sensor Okunmuyor.");
    }
  // 2 saniye bekliyoruz.
  delay(2000);

}



Serial monitor’ü açmak için kırmızı işaretli yeri tıklamamız yeterli;



Serial Monitor;



Eğer adımları doğru şekilde yaptıysak yukarıdaki şekildekine benzer ekran çıktısı almamız gerekiyor. Buradaki önemli noktalardan biri seri iletişimi başlattığımız değer, serial monitordeki baud değeriyle aynı olması gerekiyor.

Baud: Seri haberleşmede iletişim hızının ifade edildiği bir değerdir.

Baud rate: Uzak iletişim ve elektronikte kullanılan saniyedeki atım oranını gösteren birimdir. [3]

Bu aşamadan sonra artık verilerimizi bulut ortamına aktarabiliriz. Bunun için öncelikler Azure hesabımıza giriş yapıp bir Mobile Service oluşturmamız gerekmektedir. Bu işlemi önceki yazımızda göstermiştik.

Mobile Servisimiz ile alakalı şuan için bize lazım olan bilgiler;

  • server: Mobile Service URL
  • table_name: Mobil Service’de oluşturduğumuz tablo ismi
  • app_key: Manage Keys’deki Application Keys





Resimlerdeki gibi Arduino’ya Ethernet Shield’i ilave edip, daha önceki devre prototipiyle aynı olacak şekildeki bağlantılarımızı güncelliyoruz.

Devremizi tamamladıktan sonra Arduino’yu bilgisayara bağlayıp aşağıdaki kodu yükleyelim. Kodu yükledikten sonra internet bağlantısını gerçekleştirip uygulamamızı çalışmasını serial monitorden veya Azure > Mobil Services > “Mobil Servisimizin İsmi” > Data kısmından gelen verilerimizi görebiliriz.

Senaryomuz şu şekilde gerçekleşecek; İlk önce belirlediğimiz mac adresine göre Ethernet Shield başlatılacak, Arduino DHT11 sensöründen aldığı değerleri Ethernet Shield aracılığıyla ilgili adresteki mobil servisimize gönderecek. Ben uygulamanın basitliği açısından her 5 saniyede verinin gönderilmesini istedim. Tabiki bu tarz birşey veritabanını gereksiz bir şekilde şişmesine neden olacaktır. Bunu önlemek için sadece değerlerin değiştiği zamanlar verinin gönderilmesi sağlanabilir. Bu şekilde gereksiz aynı verinin gönderilmesi engellenmiş olurdu veya daha farklı senaryolar da düşünebilirsiniz orası sizin algoritmanıza kalmış.

// omereryilmaz.com Arduino ile Azure Baglantisi

#include <SPI.h>
#include <Ethernet.h>
#include <dht11.h> // DHT11 kütüphanesini dahil ediyoruz.
#define dataPIN 2 // dataPIN olarak Dijital 2'yi belirliyoruz.
dht11 DHT11;

// Ethernet shield MAC adresi tanimliyoruz.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// Azure Mobile Service adresi
const char *server = "omerarduino.azure-mobile.net";

// Azure Mobile Service tablo ismi
const char *table_name = "omerev";

// Azure Mobile Service Application Key
// Dashboard kisminda alt tarafta 'Manage Keys'
const char *app_key = "UYgmWZxxxxxxxxxxxxxxxxxx";

char* jsonKodu = "";


EthernetClient client;

char buffer[64];

void send_request(int sicaklik, int nem)
{


  if (client.connect(server, 80)) {
    Serial.println("-----------------------");
    Serial.print("Sicaklik (Celcius): ");
    Serial.println(sicaklik);
    Serial.print("Nem (%): ");
    Serial.println(nem);
    Serial.println("-----------------------");
    // POST URI
    //tirnak icindeki %s yerine table_name i yaz, buffer degiskenine at
    sprintf(buffer, "POST /tables/%s HTTP/1.1", table_name);
    //bufferdaki post islemini baslat
    client.println(buffer);

    // Host basligini tanimla
    sprintf(buffer, "Host: %s", server);
    client.println(buffer);

    // Azure Mobile Services application key
    sprintf(buffer, "X-ZUMO-APPLICATION: %s", app_key);
    client.println(buffer);


    //verinin json olarak gonderilecegini belirtiyoruz
    client.println("Content-Type: application/json");

    jsonKodu = "{"sensor_tipi":"Oda_isi_nem" ,"sicaklik": %d,"nem": %d}";
    // POST edilecek veriler
    sprintf(buffer, jsonKodu, sicaklik, nem);

    // Icerik uzunlugu
    client.print("Content-Length: ");
    client.println(strlen(buffer));

    // Basliklarin sonu
    client.println();

    // Istek govdesi
    client.println(buffer);

  } else {
    Serial.println("Baglanti Hatasi! :(");
  }
}

/*
** Yanit bekleniyor
*/

void wait_response()
{
  while (!client.available()) {
    if (!client.connected()) {
      return;
    }
  }
}

/*
** Yanit okunuyor ve yigina ekleniyor
*/

void read_response()
{
  bool print = true;

  while (client.available()) {
    char c = client.read();
    // Sadece ilk satir basina kadar yazdir
    if (c == 'n')
      print = false;
    if (print)
      Serial.print(c);
  }
   Serial.println(""); //bosluk
}

/*
** Baglantiyi kapat
*/

void end_request()
{
  client.stop();
}


void setup() {
  Serial.begin(9600);
  Serial.println("Seri iletisim baslatildi.");
  while (!Serial) {
    ; // serial port baglantsi icin bekle
    Serial.println("Seri iletisim hata.");
  }

  Serial.println("Ethernet ayarlari yapiliyor..");

  if (Ethernet.begin(mac) == 0) {
    delay(100);
    Serial.println("Ethernet Hatasi");
    for (;;) ; //sonsuz dongu prog kitle
  }
  //ethernet shield'in başlatılması (initialize) icin bekletiliyor
  delay(1000);
  Serial.println("Ethernet ayarlari yapildi.");

}

void loop() {

  int kontrol = DHT11.read(dataPIN);

  if(kontrol==0){
    int sicak = (int)DHT11.temperature;
    int ne = (int)DHT11.humidity;
    send_request(sicak,ne);
    wait_response();
    read_response();
    end_request();
  }
  else{
    Serial.print("Sensor Okunmuyor.");
    }

  delay(5000); //5 saniye bekletiyoruz.
}



Kodumuzdaki önemli noktalardan bahsedecek olursak;

Bir önceki koda ilave olarak kulladığımız kütüphaneler; SPI ve Ethernet.

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

Bu kodu ethernet shield’e mac adresi atamak için kullanıyoruz. Bazı ethernet shield’lerde bu adres üzerinde yazılı olarak gelmesine karşılık bazılarında gelmiyor. Bu yüzden mac standartlarına uygun kendi belirlediğimiz bir adresi de atayabiliriz.

jsonKodu = "{"sensor_tipi":"Oda_isi_nem" ,"sicaklik": %d,"nem": %d}";

Bu kodda ise verilerimizi Json formatında gönderiyoruz. “kolon_ismi1:veri1, kolon_ismi2:veri2” şeklindeki tanımlama mevcuttur. İki noktadan önceki kısım kolon adımnı sonraki kısım isi o kolona aktarılacak veriyi temsil etmektedir.

Eğer adımları başarılı bir şekilde gerçekleştirdiysek;

Serial Monitor;





Yukarıdaki resimde görüldüğü gibi verilerimizi bulut ortamına aktarmış olduk.



Kaynakça:

  • [1] http://www.cisco.com/c/en/us/solutions/internet-of-things/overview.html
  • [2] http://www.forbes.com/sites/jacobmorgan/2014/05/13/simple-explanation-internet-things-that-anyone-can-understand
  • [3] https://tr.wikipedia.org/wiki/Baud

You might also enjou