通过Temboo实现从Arduino获取雅虎天气信息

本文介绍了如何通过物联网云平台Temboo连接Arduino,获取雅虎天气信息,并根据温度数据控制LED灯的颜色。首先,讲述了Arduino控制LED灯的基础知识,然后详细说明了如何获取城市WOEID,利用Temboo的Choreos和GetTemperature获取温度数据,最后展示了将温度转化为RGB值以控制LED颜色的代码实现。
摘要由CSDN通过智能技术生成

如果问我未来的科技行业发展有哪些亮点的话,我必须说物联网一定是其中之一。物联网技术发展迅速,现在我们已经看到非常多的设备通过互联网互相通信了。物联网技术的发展背后的推动因素之一是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
责编:周建丁(IoT技术投稿请联系zhoujd@csdn.net,优稿优酬)

当然可以,以下是一个基本的示例代码,用于Arduino Uno配合ESP01模块获取天气信息: ```c #include <SoftwareSerial.h> SoftwareSerial espSerial(2, 3); // 将ESP01的TX引脚连接到Arduino的D2引脚,RX引脚连接到D3引脚 void setup() { Serial.begin(9600); // 初始化串口通信 espSerial.begin(9600); // 初始化ESP01串口通信 delay(2000); // 等待ESP01启动 } void loop() { // 发送AT指令以检查ESP模块是否正常工作 espSerial.println("AT"); delay(1000); while (espSerial.available()) { Serial.write(espSerial.read()); } // 发送AT指令以连接WiFi网络 espSerial.println("AT+CWJAP=\"Your_SSID\",\"Your_Password\""); delay(5000); while (espSerial.available()) { Serial.write(espSerial.read()); } // 发送AT指令以获取天气信息 espSerial.println("AT+CIPSTART=\"TCP\",\"api.openweathermap.org\",80"); delay(5000); while (espSerial.available()) { Serial.write(espSerial.read()); } espSerial.println("AT+CIPSEND=47"); delay(1000); while (espSerial.available()) { Serial.write(espSerial.read()); } espSerial.println("GET /data/2.5/weather?q=Your_City&appid=Your_API_Key HTTP/1.1"); espSerial.println("Host: api.openweathermap.org"); espSerial.println("Connection: close"); espSerial.println(); delay(5000); while (espSerial.available()) { Serial.write(espSerial.read()); } // 关闭ESP01模块 espSerial.println("AT+CIPCLOSE"); delay(1000); } ``` 请确保将代码中的`Your_SSID`替换为您的WiFi网络名称,`Your_Password`替换为您的WiFi密码,`Your_City`替换为您要获取天气信息的城市名称,`Your_API_Key`替换为您的OpenWeatherMap API密钥。 此代码通过Arduino Uno与ESP01模块进行串口通信,使用AT指令与ESP01进行通信。它首先检查ESP01是否正常工作,然后连接WiFi网络。然后,它发出HTTP请求以获取天气信息,并将响应打印到Arduino串口监视器。 请注意,此代码仅作为示例,可能需要根据您的具体情况进行修改和调试。您可能需要安装并使用ESP8266库来支持ESP01模块。 希望这可以帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值