Arduino (Ethernet Shield) ile ThingSpeak API?sini Kullanarak Twitter?a Mesaj Gönderme
Yücel Çetin // 17 Temmuz 2012 // 10 yorum // kategori: Arduino Programlama, Arduino ProjeleriProblemimiz:
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?
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 ***
Etiketler: API > arduino > Arduino Ethernet > arduino ile tweet atma > arduino programlama > arduino shield > Arduino Türkiye > arduino tweet at > arduino twitter API > Arduino Uno > arduino-twitter > ethernet > ethernet shield > ThingSpeak > ThingSpeak API > ThingSpeak API arduino > twitter > twitter arduino
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 ?
diÄŸer ethernetle ilgili yazıları da inceleyin orada bazı kodlar vardı, yardımcı olabilir size…
forum sayfamızda ethernetle ilgili sorulmuÅŸ sorular ve cevapları bulabilirsiniz…
bunu enc28j60 ethernet modülü ile nasıl uyumlu hale getirebiliriz ? ethernet shield değil,ethernet modülü..
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
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.
kod kısmında hata veriyor
tum kutuphaneleri kurdugunuzdan emin olun.
twitter a twit atma şekli yontemi toolları değişmişti son zamanlarda bu kodun geçerli olduğundan emin değiliz artık. hatalı kızmı paylaşırsanız belki neden olduğunu anlayabiliriz
‘server’ was not declared in this scope bu hatayı veriyor
thingspeak te işler değişti başka bir örneği deneyin yada aşağıdaki sayfadaki örneği denemenizi tavsiye ediyorum
https://create.arduino.cc/projecthub/Rjuarez7/arduino-and-ethernet-shield-sending-tweets-to-twitter-1d9c44
birde twittera twit atma daha güvenli hale getirildi ve bu tip otomasyon twitleri belli kurallara bağlandı twitterdeki api destek sayfalarını araştırın.