Spark Core push notifications

Bir Internet of Things (IoT) yazısı daha yazmak galiba yerinde olacak. İlk yazıdan bu yana pek bi süre geçmedi ama bu konuda yaptığım çalısmalar bir yazı yazabilecek kadar daha yol kat etti. ilk yazıda Spark Core wifi sıcaklık ölçer yapıp değerleri google docs a kaydedip bir grafik çizmiştik. Bu yazıda bir sensorden bilgi aldığımızda bir olayı nasıl tetikleyeceğimizi anlatmaya çalışacağım. Yine sensörümüz Spark Core‘a bağlı olacak. Burada da IoT olarak Spark Core kullanıyoruz. İleride çok fazla seçenek olacağını düşünüyorum. Bu modüllerin fiyatları 5-6 Dolara düşüyor. Yeni çıkan bir modülden sipariş verdim (fiyatı 6 Dolar) gelince sizlerle burada paylaşacağım.

Push Notification bir olay olduğunda bize bilgi gelmesi olarak özetlenebilir. Yani biz sensör değerini sorgulayıp cevap almıyoruz. Sensör değeri değiştiğinde bize otomatik bilgi geliyor. Bunu gerçek uygulama olarak bu yazıda şöyle örneklemek istiyorum. Ev kapısının açıldığını iphone’umdan olay olduğu an görmek istediğimizi düşünelim. Ben bunu bana temizlik için yardıma gelen Selda ablanın eve ne zaman girip ne zaman çıktığından haberdar olmak için kullanacağım. Bunu bir güvenlik sistemi olarak da düşünüp kullanabilirsiniz. Ayrıca hareket sensörleri oldukca ucuzladı aynı mantıkla kapı sensörü yerine hareket sensörü de sisteme bağlanabilir. PIR Sensörü olarak bilinen bu sensörü alıp testlerimde kullanıcam. IoT PIR sensörleri piyasaya cıktımı bilmiyorum ama güvenlik sistemleri satan arkadaşlar için ciddi bir fark yaratma fırsatı ticari olarak açıkca görünmekte. Ev wifi ağına bağlanan kapı pencere ve hareket sensörlerinden cep telefonunuza gelen uyarı sistemleri. Bunu bizde gnexlab’da düşünmeliyiz. Bu yazı da ilk proof of concept olsun.

Artık projeye geçelim isterseniz.

Bu yazıda notification sağlamak amacıyla  http://www.pushingbox.com/ sitesini kullanmak ve sizlere tanıtmak istiyorum. Pushingbox IoT cihazlar için bir notification center (Yani tam aradığımız şey. IoT de oluşan durumu bize uyarı ile haber veriyor.) Durumu size eposta, tweet, iphone notification gibi bir çok yolla haberdar ediyor. Üyelikle başlıyoruz. Daha sonra My Services den bir prowl servisi yaratıyoruz.

prowl’u iphone app store dan satın alıyoruz fiyatı 2.99 Dolar 🙁

prowl web sitesinden de bir uyelik yapıyor ve API Key ürettiriyoruz. Bu Keyi Pushingbox da yarattığımız servise girip kaydediyoruz. Bundan sonra yine Pushingbox da bir senaryo yaratıyoruz. Gerekli bilgileri girip bu senaryo ya action olarak tanımladığımız Prowl servisini ekliyoruz. Dilerseniz başka servislerde ekleyebilirsiniz. Olay olduğunda hem eposta alabilir hem de bir tween yayımlayabilirsiniz. Birden fazla servis aktive edilebilir.

Devre bu şekilde:

 

 

spark_kapi

 

resmide böyle:

photo (10)

 

Aşağıdaki kodu Spark Core a yüklüyoruz. Bunu https://www.spark.io/build üzerinden yaptığınızı daha önce anlatmıştık.

////
//
// General code from http://www.pushingbox.com for Spark Core v1.0
//

const char * DEVID1 = "Sizin DEVID niz";         // Scenario: "The mailbox is open"


const char * serverName = "api.pushingbox.com";   // PushingBox API URL
             // Save the last state of the Pin for DEVID1
TCPClient client;
boolean pinDevid1State = false; 

void setup() {
              // Start the USB Serial
   pinMode(D4, INPUT); 
  

   
}

void loop() {

  
     
      if (digitalRead(D4)) {
           sendToPushingBox(DEVID1);
           delay(2000);
      }
      
    
}

void sendToPushingBox(const char * devid)
{
   
   
    client.stop();
  
    if (client.connect(serverName, 80)) {
       
        client.print("GET /pushingbox?devid=");
        client.print(devid);
        client.println(" HTTP/1.1");
        client.print("Host: ");
        client.println(serverName);
        client.println("User-Agent: Spark");
        //client.println("Connection: close");
        client.println();
        client.flush();
                
    } 
    else{
       
    }
}

Artık Ev kapısı açıldığında cep telefonunuza uyarı gelecektir. Pushbox.com adresinde de tarihsel bir history tutuluyor. Tarih saat bilgisini oradan görebilirsiniz.

 

 

 

Internet of Things (IoT)

Gelecek vadeden bir teknoloji halkkında bilgi edinmek ve sizleri bilgilendirmek istiyorum. Iot internet of things genelde wifi bağlantısına sahip mikro işlemcilerdir. Bu teknoloji, düşük hesap hapasiteleri ve işlem güçleri olan mikroişlemcileri internete bağlayarak cloud denilen çok yüksek veri depolama ve işlem gücü olan makinaların kabiliyetlerinden yararlandırılması prensibi ne dayanmaktadır. Cloud daki bilgisayarlara bilgi gönderen ucuz ve az enerji tüketen bu minik cihazların çıktılarına başka makinalardan tabletlerden ve cep telefonlarından ulaşmak mümkün olmaktadır.

 

cloud-and-things

 

Bu teknoloji ile sınırsız uygulamalar yapmak mümkün aslında. En değerli olan işte bu kısım. Yani bir teknolojinin ne işe yaradığını anlamak ve bunu kimsenin düşünmediği bir şekilde kullanarak bir sorunu çözmek ve değer yaratmak. Gnexlab genel yaklaşımı tüm teknolojiler için bu şekilde işlemektedir. Teknolojinin nasıl işlediğini anlamak için basitde olsa bir uygulama yapmak gerekli en iyi öğrenme yolu bu. Daha sonra bu teknoloji aklımızda iken günlük hayatta bizim yada çevremizdekilerin yaşantısında bu teknolojiyi nasıl kullanabileceğimizi düşünmemiz gerekli. Aklınıza gelen fikirleri gnexlab proje gruplarında hayata geçirebilir ve bir iş modeline kadar projenizi götürebilirsiniz.

 

Bu yazıda Spark Core olarak bilinen bir IoT ile basit bir uygulama yapmaya çalışacağım. Spark Core bir kickstarter projesi

(https://www.kickstarter.com/projects/sparkdevices/spark-core-wi-fi-for-everything-arduino-compatible) arkasında eski makerbotun kurucularından (şimdi ayrıldı ve kendisi çinde yaşıyor) Zach Hoeken var. Çok başarılı ve örnek aldığım bir makerdır 🙂

kickstarterda 550.000 Dolardan fazla kaynak toplayınca bu güzel ve başarılı çalışma ortaya çıktı. Zach dan aldığım son e-postada bir yatırım grubu kendilerine 14 milyon dolar yatırım yapmış. Çok yakında büyük gelişmeler olacağını düşünüyorum. Bu mebla bize bu teknolojinin bir sonraki büyük şey (Next Big Thing) olabileceği izlemini veriyor. O zaman çalışmaya değer bir konu. Hadi Başlayalım!!!

 

46e46bdc7e2640ff5eecaa335992046e_large

 

Spark Core böyle birşey.

Temel olarak aslında wifi olanağına sahip bir Arduino. Ne var ki bunda çok gördük bunlardan demeyin. Spark Core donanım olarak basit görünse de arkasındaki yazılım gücü ve mimari ile fark yaratıyor. Spark Core’u aldıktan sonra (Ben kickstarter kampanyasına destek olmuştum ilk üretilenlerden bana bir tane geldi) Spark.io adresinden bir account oluşturuyorsunuz. Daha sonra cihazı ev wifi si ile tanıştırmanız gerekiyor. Ben bu kısımda Saprk Coru un iphone uygulamasını kullandım ve ev networkunun bilgilerini girdim. Cihaz üzerindeki çok renkli led bir çok renge büründü ve sonunda yeşil yanıp sönmeye başladı. Cihaz artık internetteydi. Buraya kadar olan kısımları için yapılacaklar burada ayrıntıları ile bahsediliyor. Problemlerle karşılaşan arkadaşlar olursa bu kısımı daha açık anlatabiliriz.

Yapmak istediğim basit proje evde bir oadanın sıcaklığını devamlı ölçerek belli aralıklarla bu değerleri kaydetmek ve nasıl seyrettiğini gözlemlemek. Bir fabrikada bir kazanın yada önemli bir ekipmanın ısısını takip etmek çok daha önemli olabilir. Ama bunların hiç biri bir Öldürücü Uygulama (Killer Application) değil. Sizleri beyin fırtınası ile iot ların ne amaçla kullanılabileceğini düşünmeye davet ediyorum. Dediğim gibi bu teknolojiyi anlama projesi.

Isıyı ölçmek için öncelikle bir ısı sensörümüzün olması gerekli bunlar thermistör yada thermocouple türü komponentler olabilir. Ben 3D yazıcılarda çok ca kullandığım thermistör kullanmak istiyorum (Elimde hazır var biraz da ondan) siz başka komponentler kullanabilirsiniz. Thermistörlerin direnci ısı ile değişmektedir. Elemanın direncini ölçerek ve bu ölçümü bir hesaplamadan geçirerek sıcaklığı bulabiliriz. Direnç ölçmek için Spark Core’un analog bacaklarından birini seçip voltaj okuyacağız. Thermistörümüz bu bacağa bağlı olacak. Direncin ısı ile ilişkisini bir matamatiksel logaritma işlemi ile derece santigrat a dönüştüreceğiz. Böylece sıcaklık değerini bulacağız.

Spark Core ile ilgili anlatılması gereken bir diğer önemli husus da “Access Token”. İnternete bağlı bir cihaza herkesin ulaşmasını engellemek gerekecektir. Spark Core’u internete bağladınız diye herkesin buna ulacağı anlamı çıkarmamak lazım. Spark Core iletişim izinleri için bir standart olan OAuth2 kullanmakta. Spark Core ile konuşurken “Access Token” ınızı da göndermeniz gerekli.  “Access Token” ınızı https://www.spark.io/build/ sayfasına login olduksan sonra settings kısmında bulabilirsiniz.

Donanım:

temp

 

 

 

 

 

Devre şamamız bu şekilde. TEMP yazan yerden Spark Core un A0 analog bacağına bağlantı yapacağız.

 

photo (9)

 

Benim Setupım bu şekilde

 

Aşağıdaki kodu Spark Core içine yuklemek için yine https://www.spark.io/build/ adresindeki IDE yi kullanabiliriz. Create new app düğmesine basıp temp isminde bir uygulama oluşturdum. ve aşağıdaki kodu içeri yapıştırdım. Flash dedim ve kod internet üzerinden Spark Core uma yüklendi. Spark Core üzerindeki led magenta renginde kalp atışı yanıp söndüğünde yükleme işleminin başarı ile gerçekleştiğini anlıyoruz.

 

 

// Read temperature
// -----------------
#include "math.h"
// Create a variable that will store the temperature value
double temperature = 0.0;

void setup()
{
  // Register a Spark variable here
  Spark.variable("temperature", &temperature, DOUBLE);

  // Connect the temperature sensor to A0 and configure it
  // to be an input
  pinMode(A0, INPUT);


}

void loop()
{
  const float Rinf = 0.0173; // thermistor constants for 100k thermistor
  const float B = 4573.5;
  const float Rup = 100000.0; // pullup resistor value
  
  float reading = 0.0;
  
  reading = analogRead(A0);
  
  temperature = B / log(Rup * reading/(4096 - reading)/Rinf) - 273;


}

 

Yükleme işlemi başarılı olduktan sonra Spark Core a ve sensör değerimize Http üzerinden ulaşabiliriz. Şu şekilde:

curl “https://api.spark.io/v1/devices/{Sizin Device ID niz}/temperature?access_token={SizinAccess Token ininz}”

{parentezler yok}

Gelen Cevap:

{

  “cmd”: “VarReturn”,

  “name”: “temperature”,

  “result”: 20.296923598751448,

  “coreInfo”: {

    “last_app”: “”,

    “last_heard”: “2014-10-02T17:02:47.349Z”,

    “connected”: true,

    “deviceID”: “48ff6c065067555023502387”

  }

bir json formatlı bilgi. result kısmında oda sıcaklığı yazıyor. Bu degeri yani sıcaklığı daha hasas ve doğru alma ihtiyacınız olursa thermistor kullanmamanız daha doğru olur. Bu tür bir uygulama yapmak istiyenler temasa geçebilir. Zira thermistör de hata payı olmaktadır.

Ben Macintosh kullandığım için terminalden direkt olarak curl komutunu kullanabiliyorum. Windows kullanıcıları için curl ün executable burada mevcut http://curl.haxx.se/dlwiz/?type=bin&os=Win64

win64 için bunu kurup curl komutunu kullanabilirsiniz. Buna aslında kontrol amaçlı ihtiyacımız olacak. Çok şart değil. Amacım bir google spreadsheet oluşturup sıcaklık değerlerini ona okutup dosyada saklamak. Server kurmak yerine mevcut bedava kaynakları kullanalım 🙂 kaybetme maliyetini düşük tutmak lazım.

Sensörümüzden bilgi aldığımıza göre artık bu değerleri belli aralıklarla okuyup saklamak kısmına geçebiliriz. Dediğim gibi goolge docs bu iş için biçilmiş kaftan. Google App Engine (https://cloud.google.com/appengine/) yine üzerinde durulması gereken bir başka teknoloji artık başka bir yazıda inşallah.

 

Google Docs dan yeni bir spreadsheet oluşturup aşağıdaki adımları yapalım.

  • Create -> Spreadsheet
  • Tools -> Script Editor
  • Aşağıdaki kodu buraya yapıştıralım
  • Resources -> Current Project’s Triggers
  • collectData  foksyonunu her saatte bir çağıralım (siz istediğiniz sıklıkta ayarlayabilirsiniz dokumanın cok buyumemesine dıkkat edin)

 

function collectData() {
  var  sheet = SpreadsheetApp.getActiveSheet();
  var sensor = UrlFetchApp.fetch("https://api.spark.io/v1/devices/{Sizin Device ID niz}/temperature?access_token={SizinAccess Token ininz}");
  // parse the JSON the Core API created
  var sensor = JSON.parse(sensor.getContentText()); 
  // you'll need to unescape before your parse as JSON
  var sensor_result = unescape(sensor.result); 
  // create a time stamp
  var d = new Date();
  // append data to spreadsheet
  sheet.appendRow([d, sensor_result]);
}

Sonuç:

 

excel_spark_temp

 

Ben bu testi yaparken dakikada bir fonksiyonu çağırdım. 3. sıradaki tepe yapan değer sensoru elimle tutup ısıttığım an okunan değer. Çalıştığından emin olabilirsiniz.

Umarım yaralı olmuştur. Spark Core satın almak isteyen arkadaşlar mesaj atabilir. Bu teknoloji ile ilgili fikir ve önerileinizi bekliyorum.