2015年4月2日 星期四

Arduino 網路測試 : 發送 Twitter

今天終於有時間來玩 Arduino 最好玩的部分-網路服務了, 這是物聯網的一部份, 只要 Arduino 能上網, 各種奇怪好玩的創意都可以透過網路來實現.

第一步就來測試由 Arduino 來自動發送 Tweet. 以前我對推特沒啥特殊印象, 我覺得跟 facebook 一樣, 就是關注別人在幹啥+期待別人關注自己在幹啥. 但不管發了多少 Tweet 或按了多少讚, 事實上, 人都是孤獨的. 我沒那麼多鳥時間來上 facebook 跟 twitter 啦.

但開始做 Arduino 實驗後, 我就注意到幾本書上提到了 Twitter :
  1. Arduino 自造指南 (Arduino Workshop) :
    第 19 章 project#61 : 建造一個 Arduino Twitter 發送器.
  2. Arduino 完全實戰手冊 (Arduino in Action) :
    第 8.3 節 : 發出訊息到 Twitter
  3. Arduino 錦囊妙計第二版 (Arduino Cookbook) :
    第 15.12 節 : 傳送 Twitter 訊息
這三本翻譯書都不約而同用到 Twitter, 讓我對推特開始改變看法, 原來 Twitter 有提供 API 給第三方應用使用, 透過 OAuth 開放授權標準, 程式也能發出 Tweet.

以下是 "Arduino 自造指南" 這本書的作法. 需要的材料就是一塊 Arduino, 一塊 Wiznet5100 乙太網擴充板, 使用 UNO 的話很方便, 兩塊板子疊在一起就行了.

首先要去 Twitter 申請帳號 (自己指定的 Email) :

# http://twitter.com/

然後以帳號密碼登入 Twitter. 接著到下面這個第三方網站, 授權讓我的 Arduino 可以透過它存取我的 Twitter :

# http://arduino-tweet.appspot.com/


這網頁底下有一些關於 Twitter 的限制 : 一分鐘內只能發送一個推文, 而且前後兩筆推文內容不可雷同. 此外, 每一個推文需在 140 字以內.

如果已經登入 Twitter 的話, 點 Step 1 超連結會出現 :


按 "授權應用程式" 就會得到一個 Token (令牌), 將其記錄下來 (Arduino 程式要用) :


如果尚未登入 Twitter, 會出現帳號/郵件+密碼登入框, 請先輸入 Twitter 帳密再按 "授權應用程式" :


這個第三方網站 arduino-tweet 是一個中介的角色, 作為 Arduino 的 proxy server, 在 Arduino 與 Twitter 間建立溝通的橋樑, 溝通的憑藉就是所申請的 Token. 此令牌讓我們不需要提供自己的 Twitter 帳號密碼給此第三方網站, 它就能存取我們的 Arduino 與 Twitter 資料.

點 Step 2 的超連結下載 Arduino 的 Twitter 的函式庫 :

# http://playground.arduino.cc/Code/TwitterLibrary
http://arduino-tweet.appspot.com/Library-Twitter-1.3.zip


將 Twitter 函式庫解壓縮後是一個 Twitter 資料夾, 將其複製到 "文件/Arduino/Library" 下. 但是要注意, 若在此之前已經打開 Arduino IDE 先編輯好程式, 則編譯將會失敗, 說找不到 Twitter.h 這個函式, 請關掉 IDE 再重開就可以抓到 Twitter.h 函式了 :


這樣便可以開始寫 Arduino 程式了, 這裡將 "Arduino 自造指南" 這本書的 project 61 稍作修飾如下 :

//Arduino Tweeter
#include <SPI.h>
#include <Ethernet.h>
#include <Twitter.h> //第三方函式庫
byte ip[]={192,168,2,106};
byte mac[]={0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02};//指定網路卡 MAC 位址 (隨便設)

//建立 Twitter 物件
Twitter twitter("56122**************************************0Nuv10j");
char msg[] = "Hello World!"; //要傳送的 Tweet
void setup() {
  delay(30000);
  Ethernet.begin(mac, ip); //乙太網路介面初始化
  Serial.begin(9600); //設定 SPI 介面速率
  }
void loop() {
  Serial.println("connecting ...");
  if (twitter.post(msg)) { //傳送 Tweet 給 Twitter
    int status = twitter.wait();
    if (status == 200) { //傳送成功
      Serial.println("OK.");
      }
    else { //傳送失敗
      Serial.print("failed : code ");
      Serial.println(status);
      }
    }
  else { //無法連線 Twitter
    Serial.println("connection failed.");
    }
  do {}
  while (1);
  }


將程式編譯上傳後, 在 Twitter 網頁就會看到 Arduino 推送的訊息 "Hello World!" :


Bingo! 大功告成.

當然這只是初步實驗, 應用方面我們可以使用紅外線感測器, 當偵測到有人經過時就送出推文, 這樣透過 Twitter 就能知道是否有人闖入了.


沒有留言:

張貼留言