通過Temboo實現從Arduino獲取雅虎天氣資訊
如果問我未來的科技行業發展有哪些亮點的話,我必須說物聯網一定是其中之一。物聯網技術發展迅速,現在我們已經看到非常多的裝置通過網際網路互相通訊了。物聯網技術的發展背後的推動因素之一是Arduino和Raspberry PI這類廉價硬體的普及,在這些廉價硬體背後的中流砥柱則是各種物聯網雲平臺。Temboo就是眾多物聯網雲平臺中的佼佼者。下面我們就來介紹一下如何將Arduino連線到雅虎的天氣服務並用獲取的天氣資訊來控制led燈的顏色。
專案準備
開始之前我們先來看看如何通過Arduino來控制led燈的顏色。如下圖所示,我們使用PWM來控制led燈的RGB數值。
程式碼部分非常簡單,因為Arduino自己就有PWM輸出功能,圖中所示的板子PWM對應的孔是3、6和5。
int delTime = 1000; int redPin = 3; int bluePin = 6; int greenPin = 5; void setup() { pinMode(redPin, OUTPUT); pinMode(bluePin, OUTPUT); pinMode(greenPin, OUTPUT); } void loop() { String val = "120";Serial.print("Value " + val.toInt()); Serial.print("Value " + val.toInt()); analogWrite(redPin, 255); analogWrite(bluePin, 0); analogWrite(greenPin, 0); delay(delTime); }
雅虎天氣
雅虎天氣給每個城市都分配了一個單獨的woeid,有woeid就可以獲得對應城市的天氣資訊。Temboo使用的也是woeid所以我們必須把城市的名字換成對應的woeid。
獲得woeid有兩種方法,第一種是使用雅虎提供的API,不過必須有自己的賬戶和金鑰。下面是獲取woeid所呼叫的程式碼:
http://where.yahooapis.com/v1/places.q(‘City_Name’)?appid=your:key&format=json
返回的是一個JSON:
{ "places":{ "place":[ { "woeid":720187, "placeTypeName":"Cittu00e0", "placeTypeName attrs":{ "code":7 }, "name":"Perugia", "country":"Italia", "country attrs":{ "type":"Paese", "code":"IT", "woeid":23424853 }, "admin1":"Umbria", "admin1 attrs":{ "type":"Regione", "code":"", "woeid":7153347 }, "admin2":"Perugia", "admin2 attrs":{ "type":"Provincia", "code":"IT-PG", "woeid":12591817 }, "admin3":"Perugia", "admin3 attrs":{ "type":"Comune", "code":"", "woeid":12676126 }, "locality1":"Perugia", "locality1 attrs":{ "type":"Cittu00e0", "woeid":720187 }, "locality2":"", "postal":"", "centroid":{ "latitude":43.103779, "longitude":12.37542 }, "boundingBox":{ "southWest":{ "latitude":43.075531, "longitude":12.32937 }, "northEast":{ "latitude":43.121311, "longitude":12.41188 } }, "areaRank":2, "popRank":11, "timezone":"Europe/Rome", "timezone attrs":{ "type":"Fuso Orario", "woeid":28350914 }, "uri":"http://where.yahooapis.com/v1/place/720187", "lang":"it-it" } ], "start":0, "count":1, "total":3 } }
這裡我們獲取到的woeid是720187。
第二種獲取woeid的方法是在第三方網站上進行查詢,輸入城市即可獲得結果。CSDN的下載專區也有很多woeid相關的資源可以下載。
Arduino與Temboo的結合使用
Temboo通過Choreos的方式向Arduino等開發板提供服務。這裡我們要用的就是雅虎天氣Choreos以及GetTemperature來獲取溫度資訊。
現在把剛剛拿到的woeid複製進來點選執行就好了。雖然也可以通過地址來獲取天氣資訊但我還是覺得woeid最方便。圖中還有一些引數可供設定,比如說你可以指定要返回攝氏度還是華氏度。
點選執行之後你會得到一段Arduino程式碼,複製貼上執行就可以了。
使用溫度來控制led燈的顏色
程式碼方面我們還需要做點修改以便控制led燈的顏色,我們需要的資訊只有溫度這一個值。
String line;
String lines[4];
int counter = 0;
while(GetTemperatureChoreo.available()) {
char c = GetTemperatureChoreo.read();
if (c == 'r' || c == 'n') {
Serial.println("Line ["+line+"]");
lines[counter++] = line;
line = "";
}
else
line += c;
}
String tempLine;
// Clean line
for (int i=1; i < lines[3].length(); i++) {
tempLine += lines[3].charAt(i);
}
int temp = tempLine.toInt();
Serial.println(temp);
注意程式碼中將字元轉換成整型之前需要的操作。
下面的程式碼是把溫度轉換為顏色中RGB三個分量的邏輯:
...
// Now let's countrol the led
int r = ( f1(temp, 20) * 5 ) % 255;
int g = ( f1(temp, 10) * 5) % 255;
int b = ( f2(temp, 5) * 5) % 255;
setRGBColor(r,g,b);
GetTemperatureChoreo.close();
....
以及控制顏色的程式碼:
void setRGBColor(int red, int green, int blue) {
analogWrite(redPin, red);
analogWrite(bluePin, blue);
analogWrite(greenPin, green);
}
從溫度到RGB分量程式碼中的f1和f2兩個函式非常簡單:
int f1(int val, int threshold) {
if (val < threshold)
return 0;
return val;
}
int f2(int val, int threshold) {
if (val < threshold)
return abs(val);
return 0;
}
當然大家可以根據自己的喜好進行修改。
大功告成!
在這個簡單的專案中我們演示瞭如何藉助Temboo雲平臺來獲取雅虎天氣資訊並據此控制led燈的顏色,希望能夠拋磚引玉幫助大家開發出更多更好的物聯網專案。
原文連結:Internet of things (IoT): Integrate Arduino with Yahoo! using Temboo
責編:周建丁
CSDN原創文章,禁止轉載。