Funpack12:Wio Terminal实现一个天气预报仪
制作了一个自动联网的天气预报仪,在设计界面显示温湿度、天气情况、空气质量以及未来三天内的天气变化。
标签
显示
hebmagic
更新2022-01-11
920

一. 任务目的

完成任务二的要求,使用Wio Termina制作一个自动联网的天气预报仪,在设计界面显示温湿度、天气情况、空气质量以及未来三天内的天气变化。

二. 硬件介绍

 

Wio Terminal的运行速度为 120MHz (最高可达200MHz), 4MB 外部闪存和 192KB RAM。

Wio Terminal自身配有一个2.4英寸 LCD屏幕, 板载IMU(LIS3DHTR),麦克风,蜂鸣器,microSD卡槽,光传感器和940nm红外发射器。 除了这些它还有两个用于Grove生态系统的多功能Grove接口和兼容Raspberry pi的40个GPIO引脚,用于支持更多附加组件。

img

三、实现总体思路

通过

#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
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号