内容介绍
内容介绍
- 任务要求
制作一个自动联网的天气预报仪,在设计界面显示温湿度、天气情况、空气质量以及未来三天内的天气变化。
2. 任务分析与准备
- 程序界面参考常规天气预报界面显示内容。比如以下界面。
- 联网和获取数据。wio terminal 有Realtek RTL8720DN 可以提供联网功能。则就可以从网络获取天气数据,并解析为jason格式,就可以在程序界面中使用了。天气数据的接口数据好用的并不多,其实也可以自己建一个接口。目前使用的是别人做好的接口。所以程序里也设置了访问的限制,一天就几次。另外,Realtek RTL8720DN目前还不支持micro python等python系的联网编程。所以只好用arduino c来写。
- 字体处理。这部分已知有两种处理方法。一种是取字模,直接写到程序数组里。然后调用数组产生汉字。另一种是这里用processing创建字体的方法。创建出vlw字体,放在SD卡里。由程序调取。这里要注意的是用到什么字就输出什么字的vlw文件。这样文件不会太大,程序才能调用显示。而且可以生成不同的大小字体。看以下vlw文件都不大。
- 图标处理。图标是从天气预报的网站取的。在LCD里处理为BMP格式显示。BMP没有透明背景。所以处理一下背景色。
3. 程序部分。
- 引入相关头文件。这里注意“WiFiClientSecure.h”,要引入才能正确连wifi。Seeed有一套教学视频介绍了使用SD卡和LCD的方法。但没有提到这个头文件。
#include "TFT_eSPI.h"
#include "Seeed_FS.h" //Including SD card library
#include "RawImage.h" //Including image processing library
#include "SD/Seeed_SD.h"
#include "rpcWiFi.h"
#include "HTTPClient.h"
#include "WiFiClientSecure.h"
#include "ArduinoJson.h"
#include "string.h"
- 连接wifi.
Serial.begin(115200);
while(!Serial);
WiFi.mode(WIFI_STA);
WiFi.disconnect();
Serial.println("Connecting to WiFi..");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
WiFi.begin(ssid, password);
}
Serial.println("Connected to the WiFi network");
Serial.print("IP Address: ");
Serial.println (WiFi.localIP());
- 联接天气接口。
/////////Connect wifi successfully.////////////////////
if (http_client.begin(req))
{
Serial.println("HTTPclient setUp done!");
}
int http_code = http_client.GET();
Serial.println(http_code);
if (http_code > 0)
{
Serial.printf("HTTP get code: %d\n", http_code);
if (http_code == HTTP_CODE_OK)
{
rsp = http_client.getString();
Serial.println(rsp);
}
else
{
Serial.printf("fail to get cityWeather,code:%d\n", http_code);
}
}
- Jason解析。
DynamicJsonDocument doc(2048);
deserializeJson(doc, rsp);
JsonObject obj = doc.as<JsonObject>();
- 屏幕写字。
tft.loadFont("SimSun20"); //指定tft屏幕对象载入SimHei20字库
tft.setTextColor(TFT_WHITE);
String city= obj["cityInfo"]["city"];
tft.drawString(city,10,15);
String ymd=obj["data"]["forecast"][0]["ymd"];
tft.drawString(ymd,90,50);
tft.unloadFont();
- 屏幕画图。
void drawGraph(String s, int a, int b){
if (s=="霾") {
drawImage<uint16_t>("mai.bmp",a,b);
}else if(s=="多云") {
drawImage<uint16_t>("duoyun.bmp",a,b);
}else if(s=="晴") {
drawImage<uint16_t>("qing.bmp",a,b);
}else if(s=="雪") {
drawImage<uint16_t>("xue.bmp",a,b);
}else if(s=="阴") {
drawImage<uint16_t>("yin.bmp",a,b);
}else if(s=="雨") {
drawImage<uint16_t>("yu.bmp",a,b);
}
}
4.功能展示。如下是实现的界面。
5.心得体会。
Wio terminal 是适合作为入门arduino的开发板。功能比较多。官网的不足是中文网站资料做的不如英文网站。另外资料不够深入,比如python网络编程还不支持。如果这些能解决,会更有应用市场。
附件下载
whether_forecast.zip
团队介绍
团队成员
MMA
评论
0 / 100
查看更多
猜你喜欢
Funpack第12期Wio Terminal自动联网的天气预报仪Funpack第12期Wio Terminal自动联网的天气预报仪完成任务
voncg
937
Funpack第12期-Wio Terminal-自动联网的天气预报仪_LVGLFunpack第12期-Wio Terminal-自动联网的天气预报仪_LVGL
奈奎斯特不稳定
1577
【Funpack第12期】基于Wio Terminal的自动联网天气预报仪基于Wio Terminal的自动联网天气预报仪,基于Arduino IDE及VSCode开发,可以连接WiFi后通过HTTP获取和风天气提供的天气API数据,通过JSON解析,并显示在LCD上,以及一些杂七杂八的实用功能。
葉SiR
1098