Funpack第十二期 -- 基于WioTerminal的联网天气预报
本项目基于WioTerminal这一便捷的嵌入式物联网开发平台,在Arduino IDE强大的开源社区支持下,实现了从联网到请求天气数据,再到数据解析与可视化的任务。
标签
嵌入式系统
Kang
更新2021-12-20
中国科学技术大学
1293
  • 简介

本项目的硬件平台是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连接与程序初始化时的界面

FoQGxTWvAP6IFFpV-lJSOQPahWlE

2.网络正常时所显示的界面(此时,注意右上角的是小绿点)

FtmjB2tmV1mJtv31XkWh9c3DNoX-

3.网络异常时所显示的界面(此时,注意右上角的是小红点)

Flek_hfu-pTJef7wNaJ3e1H24PeD

异常情况出现时,意味着本次显示的结果仍然是上一次网络正常时获取的值,只不过没有更新到最新。

  • 心得体会

这次是我第三次参加硬禾学堂的活动了,很开心这次可以接触到这样一款带有彩色LCD显示屏且还有蓝牙和无线网络支持的板子。之前接触的板子主要集中在如STM32最小系统板或是Arduino这类相对基础的,一直对网络这块不太了解,这次我终于接触并实现了整个完整的网络应用流程。

非常感谢电子森林所提供的视频讲解,让我学会配置网络和解析数据,尽管目前对于HTML的学习还有待加强,但是我学会了通过网页API获取JSON格式的数据,并从中提取有效的信息。得益于Arduino IDE,我可以把主要的精力放在功能实现而非底层细节上,这是我之前用MDK开发所体验不到的乐趣。

最后,非常感谢电子森林和Digikey举办的此次活动,也很感谢交流群里的大佬和主办方的老师,帮助我们解决各种疑问。

 

 

附件下载
my_project_final.rar
项目源码
团队介绍
嵌入式萌新
团队成员
Kang
我叫童康,中国科学技术大学信息科技学院自动化系在读研究生。我是一个嵌入式小白,平时喜欢玩单片机和树莓派,喜欢自己diy一些小项目,比如无人控制的小车、无人机等
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号