前言:最近稍微有点忙,陆陆续续完成了项目,拖到现在才开始写文档材料,录视频。不知道说什么好。
最终完成的效果
我以任务二为模板,在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初始化,麦克风初始化等。接下来的就是各种数据刷新。这么多函数都是不同种类数据以及不同刷新频率数据的刷新。
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时钟。
程序运行逻辑整个程序运行的逻辑就是,每隔一个小时从网上获取数据跟新本地数据库,每隔一段固定的时间更新本地数据,不同的数据有不同的更新频率,比如时间是按秒跟新的,天气是按小时跟新的。
功能展示时间显示与当天天气
未来天气(通过按键切换)
噪声指标
心得体会
第一次使用面向对象的思维编程,发现面向对象的c++在各个类的数据交互中存在着一些问题,需要花费体力去解决,不像c语言那样,所有的数据以及函数基本上都是互通的,不过c++在接口问题上写的更加专业,而且在数据较多同种类型的数据较多时c++就体现出了其优势。