Funpack第12期 - 基于 Wio Terminal 实现的网络天气预报助理
Funpack第12期的活动,完成的是任务二, 项目是基于 Wio Terminal 实现的网络天气预报助理。
标签
嵌入式系统
Arduino
显示
Funpack参赛
Seeed
天气预报
YGL
更新2021-12-29
1139

一、项目概述

本项目实现如下功能:

- 制作一个自动联网的天气预报仪,在设计界面显示温湿度、天气情况、空气质量以及未来三天内的天气变化。

- 同时显示一个电子时钟信息,方便查看时间。

实现该项目的使用的套件是 Seeed 推出的 Wio Terminal,Wio Terminal 使用功基于SAMD51的微控制器,使用Realtek RTL8720DN 提供的无线连接,同时支持蓝牙和WIFI,为物联网项目提供了平台。与Arduino 和 MicroPython 兼容。

image-20211223224008500

该套件有大量丰富的模块,对于这个项目我们主要使用到的模块和对应实现的功能如下:

2.4英寸的 LCD 屏幕 --> 显示信息

RTL8720DN 模块 --> 连接网络,获取天气和时钟信息

五向按键 --> 切换显示界面

二、功能实现

首先我们将要获取的数据定义为一个结构体,方便在各个模块中调用,包括的数据如下:

struct futureWeatherDef{
 char date[11];
 char weather[12];
 char humidity[5];
 char lowTemperature[5];
 char highTemperature[5];
};
​
struct weatherDef{
 char nowWeather[10];    //当前天气
 char nowTemperature[5]; //当前温度
 char nowHumidity[5];    //当前湿度
 char airQuality[10];    //空气质量
 char PM2_5[5];          //PM2.5
 char aqi[5];            //aqi指数
 struct futureWeatherDef futureDays[3];//未来三天的天气
};

2.1、获取天气数据

本项目要获取的数据包括当前的天气情况、温度、湿度和空气质量,以及未来三天的天气情况。

这里选取的天气 API 接口是心知天气,其提供的试用版完全满足我们这个项目的要求。

其使用说明可以看官方手册:《心知天气 API 使用手册》

下面我们分别说明如何获取所要的当地的天气信息(本文以我所在的深圳为例)。

(值得注意的是,下文中的http请求所用到的秘钥(key=)要使用自己注册的心知天气提供的秘钥,不然会失败。)

2.1.1、获取当前天气

在浏览器可以使用 https://api.seniverse.com/v3/weather/now.json?key=STsH4Cit44tZIFsMn&location=shenzhen&language=zh-Hans&unit=c 来请求深圳现在的天气,结果如下,

image-20211223230429195

由上可知获取当前的天气数据是成功的。

2.1.2、获取当前空气质量

在浏览器可以使用 https://api.seniverse.com/v3/air/now.json?key=STsH4Cit44tZIFsMn&location=shenzhen&language=zh-Hans&scope=city 来请求深圳现在的天气,结果如下,

image-20211223231551437

由返回的 json 数据我们可以知道很多有用的天气数据,比如 aqi、pm2.5等数据。

2.1.3、获取未来三天的天气情况

在浏览器可以使用 https://api.seniverse.com/v3/weather/daily.json?key=STsH4Cit44tZIFsMn&location=shenzhen&language=zh-Hans&unit=c&start=1&days=3 来请求深圳现在的天气,结果如下,

image-20211223231809269

我们可以得到未来三天的天气状态,包括天气情况、温度、湿度等比较重要的数据。

2.1.4、具体到 arduino 如何获取?

首先,我们需要让套件连接网络,按照这篇官方文档实现即可:https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/

接下来就是使用该套件 arduino 库调用,具体内容可以参考这篇文章:《获取并解析心知天气数据》,已经描述地很清楚了。

这篇文章提供了将返回数据转换成 json 格式的方法,至此,我们已经成功获取到了所要的天气数据。

2.2、获取时间信息

这里要使用到 RTC 结合网络获取当天具体的时间,官方提供的这篇文章已经解决所有问题了:https://wiki.seeedstudio.com/Wio-Terminal-RTC/

2.3、五向按键的使用

还是献上官方文档:https://wiki.seeedstudio.com/Wio-Terminal-Switch/,我们目前只实现了两个界面的切换,只使用了左右两个按键,就是简单的来回切换

if (buttonState != WIO_BUTTON_NONE) //如果有按键按下
{
   if (buttonState == WIO_5S_LEFT_EVENT)//向左
  {
       menu_index -= 1;
       if (menu_index < 0) menu_index = 1; //界面1
  }
   else if (buttonState == WIO_5S_RIGHT_EVENT) //向右
  {
       menu_index += 1;
       if (menu_index > 1) menu_index = 0; //界面0
  }
​
   buttonState = WIO_BUTTON_NONE;//清除状态
}

2.4、显示界面设计

对于这块模块提供的2.4寸彩色屏幕,如果颜色不搞地丰富点,都对不起它?

如何使用这个套件的LCD屏幕?官网的资料就很丰富了,请看:https://wiki.seeedstudio.com/Wio-Terminal-LCD-Overview/,我就无需赘言了。

首先先设计一个背景图片,我用 PS 大概做了一下如下的图片,大小就是这块屏幕的大小(320X240)-,由于美工不行,做的有点丑,勿喷。

image-20211224185614518

然后在获取数据之后往界面对应位置填充即可,下面是实际的效果图:

image-20211225095321306

至于上文中所使用的天气图片,也是通过加载图片的方式实现的。

image-20211225094842589

而对于要显示的未来三天的天气情况,我们直接在另外一个界面显示即可:

image-20211225100257769

三、功能展示

对于本项目的源代码,我已经上传到 github,有兴趣的可以去查看一下:https://github.com/Eureka1024/weather-forecast-assistant

效果演示:

四、对本活动的心得体会

说来显得我见识少,这是我第一次使用 arduino 进行开发,除了编译巨慢体验极差以外,开发起来真的很简单,很多功能直接调用库就可以,完成简单功能的验证很方便。

说到 Wio Terminal 这款套件,体型虽小但是功能还算蛮强大的,重要的是外形好看,谁买板子不是主要看颜值呢?

至于最大的收获嘛,还是通过项目接触了更多的东西,比如开发方式,也从很多参考资料学会不少东西。

感谢Funpack 这个活动,这一期已经是今年的最后一期,不知道后面还有没有这样优秀的(可以白嫖的)活动。

如果还有的话,我建议增加多人合作的环节,可以把项目弄得难一点,然后多人合作做出来,这样作品兴许质量能再高一点,又想起了大学那段被大腿们带飞我躺平的美好时光。

附件下载
weather-forecast-assistant.zip
团队介绍
个人团队
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号