- 简介
本项目的硬件平台是Seeed公司的WioTerminal,采用的软件开发平台是Arduino IDE,在官方通过的标准库的基础上,配合Arduino社区大量的第三方库,开发的难度得到的显著的降低。开发者不必要在具体的底层实现细节上耽误过多的时间,集中精力实现快速设计开发即可。
同时,Arduino IDE集成串口监视器和烧录功能于一体,给程序设计与开发节省了不少宝贵的时间。WioTerminal自带彩色LCD显示屏,只需调用官方对应的接口,就可以实现显示,这在我调试的过程中,通过将一些参数输出到显示屏,就可以快速判断程序有无异常。
更多这块板子库函数开发的相关细节,可以去官方文档仔细查阅(在左侧的目录里面可以切换各种你感兴趣的部分),上面还有关于各种模块和网络方面的丰富例程。虽然文档是英文的,还是推荐大家去阅读。
- 实现的功能
使用WioTerminal板载的WiFi模块,连接上指定的无线网,配合GET指令,以JSON格式获取我们想要的信息。为了提高这个系统的灵活性,先通过腾讯提供的IP地理位置查询的API,获取当前网络IP对应的地理位置(经纬度),在此基础上,通过天气网站API依次获取当前经纬度下的当日天气、未来三天天气和空气质量等信息。最后,将上述的数据解析完成后,将结果显示在LCD显示屏上。这里,我为了美观,额外添加了从SD卡读取素材图片并显示的操作。这里要注意,图片需要进行格式转换,才可以显示。
先来看一下程序的主体框架,首先是初始化部分:
void setup() {
// put your setup code here, to run once:
Data_Init(); //数据初始化
TFT_Init(); //显示屏和显示相关外设(SD卡)的初始化
WiFi_Init(); //WiFi的初始化
strcpy(sysTime1,Get_Time()); //通过网络获取本地时间
while(sysTime1[0]==' ')
{
strcpy(sysTime1,Get_Time());
delay(500);
}
delay(500);
strcpy(location,Get_Location()); //通过网络获取本地经纬度信息
while(location[0]==' ')
{
strcpy(location,Get_Location());
delay(500);
}
Update_Future(location); //基于位置,更新未来三天的天气数据
Update_Current_Temp(location); //基于位置,更新现在的天气数据
Update_Current_AQI(location); //基于位置,更新现在的空气质量数据
const char* sysTime = sysTime1; //备份时间
}
上述的延时是必要的,我试过更短的延时,那样做会导致因为访问频率过高,而使得对方的服务器拒绝响应。接下来再看看程序的主体循环部分:
void loop() {
// put your main code here, to run repeatedly:
static int loop_daily = 0;
static int future_flag = 1;
delay(1000);
strcpy(sysTime1,Get_Time());
Update_Current_Temp(location); //更新当地的温度
delay(2000);
Update_Current_AQI(location); //更新当地的空气质量
delay(2000);
if(future_flag || loop_daily%7 == 0)
{
int flag = Update_Future(location); //更新未来三天的空气质量
if(flag == 1)
{
future_flag = 0;
}
loop_daily %= 7;
}
else
{
delay(2000);
}
loop_daily++;
Update_Display((const char*)sysTime1, web_Signal); //更新显示信息,其中web_Signal是信号
delay(1000);
}
注意,该天气API对于访问的频率有严格的限制,如果相邻两次请求的间隔过短,会导致对面一直拒绝响应。因此,如果要仅仅只是测试JSON数据的解析,可以先用浏览器打开相应的API,复制其中的JSON数据,上传到自己的服务器或者网站上面,进行测试。这里我使用了我学校提供的个人主页服务,完成了测试。大家如果一直被拒绝访问,可以尝试一下我的这个网页,网址为:http://home.ustc.edu.cn/~tongkang/test.json。
- 功能演示
在开始演示前,需要在My_Web.h中完成对WiFi账号密码的配置,以便后续功能可以正常的执行。
const char* ssid = "1209"; //替换成你的WiFi名称
const char* password = "ustc1209"; //替换成你的WiFi密码
1.WIFI连接与程序初始化时的界面
2.网络正常时所显示的界面(此时,注意右上角的是小绿点)
3.网络异常时所显示的界面(此时,注意右上角的是小红点)
异常情况出现时,意味着本次显示的结果仍然是上一次网络正常时获取的值,只不过没有更新到最新。
- 心得体会
这次是我第三次参加硬禾学堂的活动了,很开心这次可以接触到这样一款带有彩色LCD显示屏且还有蓝牙和无线网络支持的板子。之前接触的板子主要集中在如STM32最小系统板或是Arduino这类相对基础的,一直对网络这块不太了解,这次我终于接触并实现了整个完整的网络应用流程。
非常感谢电子森林所提供的视频讲解,让我学会配置网络和解析数据,尽管目前对于HTML的学习还有待加强,但是我学会了通过网页API获取JSON格式的数据,并从中提取有效的信息。得益于Arduino IDE,我可以把主要的精力放在功能实现而非底层细节上,这是我之前用MDK开发所体验不到的乐趣。
最后,非常感谢电子森林和Digikey举办的此次活动,也很感谢交流群里的大佬和主办方的老师,帮助我们解决各种疑问。