内容介绍
内容介绍
一. 任务目的
完成任务二的要求,使用Wio Termina制作一个自动联网的天气预报仪,在设计界面显示温湿度、天气情况、空气质量以及未来三天内的天气变化。
二. 硬件介绍
Wio Terminal的运行速度为 120MHz (最高可达200MHz), 4MB 外部闪存和 192KB RAM。
Wio Terminal自身配有一个2.4英寸 LCD屏幕, 板载IMU(LIS3DHTR),麦克风,蜂鸣器,microSD卡槽,光传感器和940nm红外发射器。 除了这些它还有两个用于Grove生态系统的多功能Grove接口和兼容Raspberry pi的40个GPIO引脚,用于支持更多附加组件。
三、实现总体思路
通过
#include <rpcWiFi.h>
#include <HTTPClient.h>
实现网络链接。
通过
#include <xinzhi_Seniverse.h>
实现实时天气和未来三天天气预报。
通过
#include "Free_Fonts.h"
#include "TFT_eSPI.h"
将获取的信息显示在屏幕上。
各功能对应的主要代码片段及解释一、网络连接
设置网络名称和密码:
const char* ssid = "MAGIC";`
const char* password = "XXXXXXX";
连接网络:
void connectWiFi(){
WiFi.begin(ssid, password);
Serial.print("Connecting to ");
Serial.print(ssid); Serial.println(" ...");
int i = 0;
while (WiFi.status() != WL_CONNECTED) {
tft.setFreeFont(FF24);
tft.drawString("Connecting ", 20, 50);
delay(1000);
Serial.print(i++); Serial.print(' ');
}
Serial.println("");
Serial.println("Connection established!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
二、通过心知天气API获取实时天气和未来三天天气预报
设置初始信息:
String reqUserKey = "SgnqvKOBwBVgSvFFM"; // 私钥
String reqLocation = "xingtai"; // 城市
String reqUnit = "c"; // 摄氏/华氏
创建对象:
WeatherNow weatherNow; // 建立WeatherNow对象用于获取心知天气实时信息
Forecast forecast; // 建立Forecast对象用于获取心知天气预报信息
配置心知请求信息:
weatherNow.config(reqUserKey, reqLocation, reqUnit);
forecast.config(reqUserKey, reqLocation, reqUnit);
获取实时天气并显示:
if(weatherNow.update()){
tft.setFreeFont(FF24);
TN = weatherNow.getDegree();
tft.drawString(TN, 20, 20); // 显示实时温度
tft.drawString("°C", 20+(TN.length())*24, 20);
tft.setFreeFont(FF10);
tft.drawString(weatherNow.getWeatherText(), 120, 20); // 显示实时天气情况
HN = weatherNow.getshidu();
tft.drawString("H:", 120, 50);
tft.drawString(HN, 148, 50); // 显示实时湿度
tft.drawString("AQI:", 200, 50);
tft.drawString(AQINOW, 258, 50);
} else { // 更新失败
Serial.println("Update Fail...");
Serial.print("Server Response: "); // 输出服务器响应状态码供用户查找问题
Serial.println(weatherNow.getServerCode()); // 心知天气服务器错误代码说明
}
获取未来三天天气并显示
if(forecast.update()){
tft.setFreeFont(FF10);
//预报第一天天气
tft.drawString(forecast.getDayText(0), 20, 100); //显示第一天天气详情
Text0 = forecast.getDayText(0);
L0 = forecast.getLow(0);
H0 = forecast.getHigh(0);
tft.drawString("T:", 30+(Text0.length())*14, 100);
tft.drawString(L0, 58+(Text0.length())*14, 100); //显示第一天最低温
tft.drawString("~", 62+(Text0.length()+L0.length())*14, 100);
tft.drawString(H0, 74+(Text0.length()+L0.length())*14, 100); //显示第一天最高温
//预报第二天天气
tft.drawString(forecast.getDayText(1), 20, 150);
Text1 = forecast.getDayText(1);
L1 = forecast.getLow(1);
H1 = forecast.getHigh(1);
tft.drawString("T:", 30+(Text1.length())*14, 150);
tft.drawString(L1, 58+(Text1.length())*14, 150);
tft.drawString("~", 62+(Text1.length()+L1.length())*14, 150);
tft.drawString(H1, 74+(Text1.length()+L1.length())*14, 150);
//预报第三天天气
tft.drawString(forecast.getDayText(2), 20, 200);
Text2 = forecast.getDayText(2);
L2 = forecast.getLow(2);
H2 = forecast.getHigh(2);
tft.drawString("T:", 30+(Text2.length())*14, 200);
tft.drawString(L2, 58+(Text2.length())*14, 200);
tft.drawString("~", 62+(Text2.length()+L2.length())*14, 200);
tft.drawString(H2, 74+(Text2.length()+L2.length())*14, 200);
}
三、通过openweather获取实时空气质量
获取空气质量数值aqi:
void AQI_JsonDate(){
HTTPClient http;
http.begin("http://api.openweathermap.org/data/2.5/air_pollution?lat=37.073331&lon=114.486667&appid=3543e30958134fe3edaeb79327a93f53");
int httpCode = http.GET();
• if(httpCode > 0) {
• Serial.printf("[HTTP] GET... code: %d\n", httpCode);
• if(httpCode == HTTP_CODE_OK) {
• GetAQIJSON = http.getString();
• }
• }
• http.end();
StaticJsonDocument<600> doc;
deserializeJson(doc, GetAQIJSON);
JsonArray list_AQI = doc["list"];
JsonObject list_A = list_AQI[0];
JsonObject list_main = list_A["main"];
aqi = list_main["aqi"];
}
显示空气质量:
AQI_JsonDate();
AQINOW = aqi;
tft.drawString("AQI:", 200, 50);
tft.drawString(AQINOW, 258, 50);
四、心得体会
wio 高度集成特性非常方便开发,非常建议入门或者有显示需求的人使用这款产品。
附件下载
test.ino.wio_terminal.bin
wifi 名称为“ssid" 密码为:”password“
团队介绍
一个喜欢DIY的入门极客。
团队成员
hebmagic
评论
0 / 100
查看更多