昨天做的地震發推按鈕主要參考這篇 “Arduino to Twitter over USB“,雖然標題上是寫透過 USB ,不過要改成藍牙或是 WiFi 也是沒問題的。
這個方案主要是透過在電腦上運作的一隻 python 腳本來監聽 serial port,如果有接收到訊息的話,就把該訊息透過 twitter API 發佈。然後我們透過 Arduino 來製作一個按鈕裝置,觸動按鈕後會將預先定義的字串傳到 serial port。
要實作這個小專案,需要準備的材料如下:
- 一台有 USB port,已經安裝好 python 和 Arduino IDE 的電腦,作業系統不拘。
- Arduino 板子,我手上的是 Arduino Duemilanve,不過任何一塊都可以。
- Arduino USB 連接模組,有些版本是內建的,可以不用另外準備。
- 麵包板。
- 10K歐姆電阻一個。
- 觸碰式按鈕一個。
- 單心線數條
Arduino 板子的配置如上圖(用 Fritzing 畫的)所示,設置完成後連接到電腦,然後將下面程式碼寫入板子裡:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | int buttonPin = 10; //定義按鈕連接腳位 int val = 0; //按鈕狀態 void setup() { pinMode(buttonPin, INPUT); //將按鈕腳位設定為輸入模式 Serial.begin(9600); //設定 serial 傳輸速率 } void loop() { val = digitalRead(buttonPin); //讀取按鈕狀態 if(val == HIGH) { //如果按鈕被觸發 Serial.println("改成你想發推的字串"); //將預先設定的字串傳到 serial port delay(1000); //延遲等待一秒鐘,避免連續觸發 } } |
程式寫入完成後,可以透過 Arduino IDE 上的 “Serial Monitor” 進行測試,按一下按鈕看是否有正常運作,如果沒有的話就再檢查一次電路的配置。
接下來要準備電腦端的程式,首先去 http://dev.twitter.com/ 申請註冊一個 app,待會我們會用到 twitter API key。
申請好 twitter API 後,要在機器上安裝幾個 python 套件 – pySerial 套件讓 python 可以監聽 serial port 事件,Python-Twitter 則可以讓我們使用 twitter API 發推。Python-twitter 會用到 simpleJason, httplib2 和 python-oauth2 三個套件,請務必在 Python-twitter 套件之前安裝好。
然後修改一下 “Arduino to Twitter over USB” 作者所提供的 python 腳本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #**************# # Brad Wells # # wellsb.com # # *************# ##Import Libraries import twitter import serial import time ##Authenticate with Twitter API api = twitter.Api(consumer_key='your key here', consumer_secret='your key here', access_token_key='your key here', access_token_secret='your here here') ##Configure Serial Port arduino = serial.Serial('/dev/ttyUSB0', 9600) while 1: ##Infinite Loop status = arduino.readline() ##Wait for new line to come across Serial api.PostUpdate(status) ##Post message to Twitter time.sleep(3600) ##Wait 3600 seconds del status ##Clear status |
除了把剛才申請到的 twitter API key 填入外,需特別注意的是把’/dev/ttyUSB0′改成你的配置,如果不確定的話,可以開啟 Arduino IDE,在”Tools”選單裡的”Serial port”可以看到你目前可用的配置。
改完後存檔,檔名隨便,我是存成 “twitterButton.py”。然後我們就可以在命令行輸入 “python twitterButton.py” 來執行腳本,要終止執行的話請按”Ctrl+c”。
在腳本執行期間,只要按一下已經連接到電腦上的 Arduino 按鈕,系統就會把預先設定好的訊息發送到 twitter 上了。
其他可以實作的延伸計畫
- 將 python 腳本編譯成常駐程式或服務
- 將 Serial port 發送的方式改成直接透過 web api 呼叫
- 配置多個按鈕及其他感測器來觸發不同事件
- 透過 python-twitter 過濾特定條件 tweet,經由 serial port 反饋到 Arduino 上觸發實體裝置
- 發送到 plurk 和 facebook
- 無線化
結語
一直都是自己悶著頭玩的,這次有機會可以和大家分享也頗開心,一起來玩吧。:)


3 Comments
你好,我有照著你的步驟做,但在最後觸發按鈕的時候出現了以下的錯誤(執行python twitterButton.py時都正常),
Traceback (most recent call last):
File “twitterButton.py”, line 20, in
api.PostUpdate(status) ##Post message to Twitter
File “/home/bravo/下載/python-twitter-0.8.2/twitter.py”, line 2766, in PostUpdate
data = self._ParseAndCheckTwitter(json)
File “/home/bravo/下載/python-twitter-0.8.2/twitter.py”, line 3668, in _ParseAndCheckTwitter
self._CheckForTwitterError(data)
File “/home/bravo/下載/python-twitter-0.8.2/twitter.py”, line 3691, in _CheckForTwitterError
raise TwitterError(data['error'])
twitter.TwitterError: Could not authenticate you.
看起來是 twitter 認證的問題,
你有去 twitter.com 申請 API key 並且在程式裡填入正確的位置嗎?
您好,我是在consumer_key和access_token_key的地方填入已申請的帳號及密碼,但卻還是發生錯誤…