Arduino (Ethernet Shield) ile ThingSpeak API?sini Kullanarak Twitter?a Mesaj Gönderme

Problemimiz:

Arduino ile twitter?a mesaj göndermek istiyorsunuz yani tweet atacağız; örneğin bir sensör ile çalıştığınızı varsayalım.  Sensör bir hareket algıladığında bunu twitter?dan mesaj olarak görmek istiyorsunuz.

Çözüm:

  Bu taslak bir anahtar kapandığında bir twitter mesajı gönderecek.  Bunun için  http://www.thingspeak.com adresindeki bir Proxy?yi,  yetkilendirme sağlamak için kullanıyoruz  dolayısıyla free API key almak için bu siteye kayıt olmalısınız. Siteye girerek anasayfadaki Sign UP butonuna basın ve formu doldurun ( kullanıcı adı, email, zaman dilimi ve şifre).

 

 ?Create Account? butonuna tıkladıktan sonra artık sizinde bir ThingSpeak API key?iniz var demektir(sitede APPS ThingTweet tıklayın izin verin  link twitter Acoount?a tıklayın ve API keyiniz karşınızda).  ThingSpeak servisini kullanabilmek için, twitterdaki hesabınızdan   ThingTweet?a yetkilendirme  için izin vermelisiniz ki sizin hesabınıza atmaya çalıştığımız mesajı gönderebilsin(yukarıda yaptık devam?).

 

Bu ayarlardan sonra gelelim fasulyenin faydalarına, size verilen “YourThingTweetAPIKey” i kullanarak ilerideki taslaklarda gerekli yere bu key?i yazarak kullanmaya başlayabiliriz.  Tabi bu uygulamaları yaparken Arduino ile birlikte bir Ethernet shield kullandığımızı söylememize gerek yok diyoruz ama yine de söyledik.

Evet parmakları çalıştıralım?

/*

*Pin2 ?deki anahtara basıldığında(analogPin) tweet at.

* yukarıda anlatmaya çalıştığımız  api. Thingspeak.com?u twitter Proxy olarak kullanacağız.

* şuradan gözatabilirsiniz: http://community.thingspeak.com/documentation/apps/thingtweet/

*benim internette okurken en çok istediğim şey olan kodların yanında açıklamaları olmasıdır, acizane yazmaya çalışacağım.

*/

#include <SPI.h>   /*SPI.h ile Yapılmış örneklere şuradan bakabilrsiniz http://tronixstuff.wordpress.com/2011/05/13/tutorial-arduino-and-the-spi-bus/  */    

 #include <Ethernet.h> /*Ethernet shield kullanabilmek için entegre ediyoruz.*/

 

 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };/* ortam erişim kontrolü, ethernet donanım adresi:

byte server[] = { 184, 106, 153, 149 }; /* ThingSpeak API?si için IP adresi  */

char *thingtweetAPIKey = “YourThingTweetAPIKey”; /* yukarıda anlatmaya çalıştığım ve beraber aldığımız API Key?imizi burada ?? işaretleri içerisine yazıyoruz.*/

EthernetClient client; /* belirtilen bir internet IP adresi ve port?a bağlanabileceği  bir istemci oluşturuyoruz. ref: http://arduino.cc/en/Reference/EthernetClient */

boolean MsgSent = false; /* Bir boolean doğru veya yanlış iki değerden birini tutar burada false*/

const int Sensor = 2;/* bir tamsayı sabiti  demiştik ya bir sensor değer okuyacak (örneğin analog anahtar), Pin 2 için?*/

void setup()

{

Serial.begin(9600); /*9600 br hızında seri haberleşme başlatacaktır yani aktarım hızımız.  Bu haberleşme ile veri göndermek için Serial.println() komutu kullanacağız.*/

if (Ethernet.begin(mac) == 0) { /* Ethernet işlemlerini  mac ve DHCP  kullanarak başlatalım [DHCP sunucusunun DHCP istemcilere IP adresi dağıtması işlemine DHCP süreci (DHCP process) olarak adlandırılır. Bu süreç içinde, network üzerindeki istemcilere IP adresi dağıtılır ve yönetilir.] hatırlayalım daha iki satır önce EthernetClient client komutu ile bir istemci oluşturmuştuk.*/

Serial.println(“Failed to configure Ethernet using DHCP”); /* tabi yukarıda bir koşul kullandık dedik ki ey aciz program eğer bu istemcide değer sıfır ise diye buradada diyoruz ki bu koşul sağlanırsa  serial monitorde bizi ?DHCP kullanarak Ethernet yapılandırılamadı? diye uyar */

while(true)   /* bu ifade başka bir koşul gelene kadar  devamlı çalışır sonsuz döngü çünkü parantez içerisinde true değerini döndüren bir  ifade var bu bir değişken olmadığından surekli döner: */

;

}

pinMode(Sensor, INPUT);  /* Pin 2,  sensör pini olarak ayarlamıştık onu giriş olarak ayarlıyoruz */

digitalWrite(Sensor, HIGH); /* sensörü çalışır olarak ayarlayalım.*/

delay(1000);     /* 1000 milisaniye beklesin yeter  acelemiz var*/

Serial.println(“Ready”); /* serial monitöre hazırdır yazsın*/

}

 void loop()  /* döngüye başlayalım yukarıda bir sıkıntı yoktu her şey

HIGH her şey true oh ne guzel fakat artık diğer durumları göz önüne alalım hadi?*/

{

if(digitalRead(Sensor) == LOW)  

 { /* ey aciz program sensör bak eğer bir seviyesizlik varsa neler yapacağını aşağıda söyleyeceğim; yani burada mailbox açık ise*/

if(MsgSent == false){ /* döngünün içerisine bir döngü daha yazalım ey kodcuk kontrol et bakalım mesaj gönderildi mi? Eğer gönderildiyse*/

      MsgSent = sendMessage(“Mail has been delivered”);

      if(MsgSent) /* parantez içi senin için  olumlu ise bir şey değilse başka bir şey yap*/

            Serial.println(“tweeted successfully”); /*Evet hain amacımıza ulaştık*/

 else

           Serial.println(“Unable tweet); /* hımm döngü içerisinde  hiçbir koşul sağlanmadıysa boş durma ekrana bir şeyler yazdır*/

    }

}

else{ 

MsgSent = false; // Kapı kapalı,  durumunu sıfırla

}

delay(100); /*100 milisaniye bekle*/

}

boolean sendMessage( char *message) /*atacağımız tweet?in ne olduğunu zavallı programada haber verelim.*/

{

boolean result = false; //ok devam

const int tagLen = 16; // mesaj içinde kullanılan etiket karakter sayısı

int msgLen = strlen(message) + tagLen + strlen(thingtweetAPIKey); /*şimdi bir  şey tanımlayalım bunun ismi?msgLen ? olsun ve bu şey bizim mesajımız, tagLen ve taa işlemlerimizin en başında aldığımız API keyin karakter sayısının toplamına  eşit olsun*/

Serial.println(“connecting …”); //serial monitore bir şeyler yazalım

if (client.connect(server, 80) )  /*işimizi gören kendi serverimizdaki  port (kendi bilgisayarımızdaki Ethernet shieldimiz yani kendi serverimiz diyebiliriz) olan ve yerel makinemize bağlanmamızı sağlayan portumuza (port 80 )bağlanabilrsen, boş durma programcık daha yapacağın çok iş var koştur?*/

{

Serial.println(“making POST request…”); /* noluyor arka tarafta aciz dedik sana program ama kusura bakma söyle bir şeyler de anlayalım bir işe yara: evet POST isteği yapmanın vakti gelmiş biz de bir şey yapıyorsun zannettik.  */

 client.print(“POST /apps/thingtweet/1/statuses/update HTTP/1.1\r\n”); /* client.print(data)  istemcinin bağlı olduğu servera data (veriyi ) yazdır. Yazmışken aşağıda client print ile yazılan her şeyi de  yazıver bari */
client.print(“Host: api.thingspeak.com\r\n”);
client.print(“Connection: close\r\n”);
client.print(“Content-Type: application/x-www-form-urlencoded\r\n”);
client.print(“Content-Length: “);
client.print(msgLen);
client.print(“\r\n\r\n”);
client.print(“api_key=”); // msg tag
client.print(thingtweetAPIKey); // api keyi yaz
client.print(“&status=”); // msg tag
client.print(message); // bu da bizim anlamlı mesajımız
client.println(“\r\n”);

}

else {

Serial.println(“Connection failed”); /*neyi yanlış yaptık bilmiyoruz umarız failed olmaz bu çok olumsuz bir koşul hiç sevmedik?*/

}

// yanıt dizesi

if (client.connected()) {

Serial.println(“Connected”);

if(client.find(“HTTP/1.1”) && client.find(“200 OK”) ){

result = true;

}

else

Serial.println(“Dropping connection – no 200 OK”);

}

else {

Serial.println(“Disconnected”);

}

client.stop();

client.flush();

return result;

}

———– – – – –

SONUÇ

Arkadaşlar eksikler veya hatalar varsa şimdiden kusuruma bakmayın. İleriki yazılarda  birden fazla sensor için  neler yapmamız gerekiyor onlara bakacağız. Ardından değişik API’leri kullanarak Twitter ile arkadaşlığımızı ilerleteceğiz.  İyi veya kötü yorumlarınızı bekliyorum. Kolay gelsin?

 

  KAYNAKLAR:

1) http://arduino.cc/it/Reference/ClientConnect

2)http://arduino.cc/forum/index.php?topic=108217.0

3)http://arduino.cc/it/Reference/ClientPrint

4)http://arduino.cc/en/Reference/IfEthernetClient

5)http://arduino.cc/en/Reference/ClientConnected

6)http://arduino.cc/en/Tutorial/TwitterClient

7)https://www.thingspeak.com/apps/

8)Arduino Cookbook ***

 

Yücel Çetin

İstanbul Üniversitesi Elektrik-Elektronik Mühendisliği'nde öğrenci, Arduino sevdalısı, python meraklısı bir canlı...

6 comments

  1. s dedi ki:

    Ethernet shield üzerindeki bağlantılar ne olacak acaba ? A2 ye bir buton bağladım bunun tıklanmasında çalışmasını bekledim ama olmadı. Yardımcı olabilir misinz ?

  2. kazım dedi ki:

    bunu enc28j60 ethernet modülü ile nasıl uyumlu hale getirebiliriz ? ethernet shield değil,ethernet modülü..

  3. Ömer Koman dedi ki:

    moduldeki pinleri kabloyla arduinoya bağla çalışır. 6-7 kablo bağlayacaksın o kadar.

    VCC -> 3.3V ya da 5V
    GND -> GND
    SCK -> Pin 13
    SO -> Pin 12
    SI -> Pin 11
    CS -> Pin 8

    standart enj28j60 kutuphanesi ile dene uymazsa şununla dene https://github.com/jcw/ethercard

  4. veysel dedi ki:

    Benim bir sorum olacak.Şimdi benim arduino mega modülümün analog pinleri başka birşeyde kullanıyorum buradaki analag pin2 yerine benim modulümde mesela digital pin 10 u kullanmak istiyorum ne gibi bir değişiklik yapmalıyım.Teşekkürler.

E-posta adresiniz gösterilmeyecek. Gerekli alanlar * ile işaretlidir.

*



Sosyal Ağlar