1. 程式人生 > 其它 >通過Temboo實現從Arduino獲取雅虎天氣資訊

通過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原創文章,禁止轉載。