Funpack第12期-Wio Terminal-自动联网的天气预报仪_LVGL
Funpack第12期-Wio Terminal-自动联网的天气预报仪_LVGL
标签
嵌入式系统
奈奎斯特不稳定
更新2021-12-27
哈尔滨理工大学
1577

前言:最近稍微有点忙,陆陆续续完成了项目,拖到现在才开始写文档材料,录视频。不知道说什么好。

最终完成的效果

我以任务二为模板,在LVGL的UI基础上实现了天气预报,空气质量检测。以及在多出来的UI界面中实现了环境噪声检测功能。

硬件介绍

Wio Terminal 是基于SAMD51的微控制器,具有 Realtek RTL8720DN 支持的无线连接,与Arduino和MicroPython兼容。它的运行速度为 120MHz (最高可达200MHz), 4MB 外部闪存和 192KB RAM。它同时支持蓝牙和Wi-Fi,为物联网项目提供了骨架。Wio Terminal自身配有 a 2.4” LCD屏幕, 板载IMU(LIS3DHTR),麦克风,蜂鸣器,microSD卡槽,光传感器和红外发射器(IR 940nm)。 最重要的是它还有两个用于Grove生态系统 的多功能Grove端口和40个Raspberry pi兼容的GPIO引脚,用于支持更多附加组件。

代码展示以及功能介绍

我先创建了两个类:Local_Data和NETWORK_DATA。

这两个类分别用于本地数据分析和投影,以及网络数据采集与传输。其中基于LVGL的UI就嵌入于Local_Data这个类中。

Local_Data

这里是他的头文件

/*
本地数据交换中心:
网络数据->LVGL
        ->RTC
        ->本地数据库
传感器数据->LVGL数据库
*/
#ifndef LOCAL_DATA_H_
#define LOCAL_DATA_H_

#include <Arduino.h>
#include <lvgl.h>
#include "RTC_SAMD51.h"
#include "gui_guider.h"

const unsigned int num_day = 5; //定义天气天数
class Local_Data
{
private:
    String m_rtc_time; // 2021-11-20T15:45:50

    String m_city;

    String m_date[num_day];                  //天气日期
    String m_text_day[num_day];              //白天天气文本
    String m_text_night[num_day];            //天气文本
    String m_code_day[num_day];              //白天天气代码
    String m_code_night[num_day];            //白天天气代码
    String m_high[num_day];                  //最高温度
    String m_low[num_day];                   //最低温度
    String m_wind_direction[num_day];        //风向
    String m_wind_direction_degree[num_day]; //风向角度
    String m_wind_speed[num_day];            //风速
    String m_wind_scale[num_day];            //风级
    String m_humidity[num_day];              //湿度

    String m_air_quality[num_day]; //空气质量

public:
    Local_Data();
    ~Local_Data();

    void init(void);
    void ntp_fresh_rtc(unsigned long ntp_device_time);
    void fresh_lvgl_data(int _num);
    void fresh_weather_data(const String &w_Answer);
    void fresh_air_quality(const String &w_Answer);
    void fresh_lvgl(void); //需要在loop里一直调用
    void _df_second(void);
    void _df_minute();
    void _df_hour();

    void set_rtc_alarm(rtcCallBack callback1, rtcCallBack callback2);
};

#endif

其中私有变量存储的都是相应的天气数据。初始化函数主要是屏幕的初始化,文件系统初始化,内置rtc时钟初始化,UI初始化,麦克风初始化等。接下来的就是各种数据刷新。这么多函数都是不同种类数据以及不同刷新频率数据的刷新。

FmY0oVMJAXa29gq-6yuLondw2snd

NETWORK_Data
class NETWORK_DATA
{
private:
    String m_ssid;
    String m_password;

public:
    NETWORK_DATA(const String ssid, const String password);
    void init();
    unsigned long get_ntp_EpochTime();
    const String get_net_data(const char *host, const String url);
};

network_data的私有变量存储着连接wifi的用户名称与密码,初始化主要初始化wifi以及连接,weather_api,这里我用的是心知天气的api,还有ntp服务器,用来跟新本地的rtc时钟。

程序运行逻辑

整个程序运行的逻辑就是,每隔一个小时从网上获取数据跟新本地数据库,每隔一段固定的时间更新本地数据,不同的数据有不同的更新频率,比如时间是按秒跟新的,天气是按小时跟新的。

功能展示

时间显示与当天天气

FmD49Y9-lMeXmrBfFGr_Rdcaz_Aa
 

未来天气(通过按键切换)

FqoiROaZ-0nMrqbXetoLp9smRhav
 

噪声指标

FqSCR7EDtPIa43aaKK2UpcAyNc2B

心得体会

第一次使用面向对象的思维编程,发现面向对象的c++在各个类的数据交互中存在着一些问题,需要花费体力去解决,不像c语言那样,所有的数据以及函数基本上都是互通的,不过c++在接口问题上写的更加专业,而且在数据较多同种类型的数据较多时c++就体现出了其优势。

附件下载
Wio terminal.zip
团队介绍
一个即将毕业的大四学生
团队成员
奈奎斯特不稳定
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号