这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 「M5STACKTAB5测评」M5StackTab5时钟App完整构建ESP‑I

共1条 1/1 1 跳转至

「M5STACKTAB5测评」M5StackTab5时钟App完整构建ESP‑IDF+LVGL9实战

助工
2026-05-09 17:38:05     打赏

0. 前言

   本文基于 M5Stack Tab5 硬件平台与 ESP‑IDF 开发环境,完整复现时钟应用从架构设计、核心模块实现、网络天气同步到编译烧录的全流程。项目沿用 Tab5 四层架构与 Panel 组件化思想,兼容 LVGL9RTC 硬件时钟、SNTP 网络授时、IP 自动定位与天气获取,可直接用于中大型 GUI 项目的时间模块参考。

 1ec97369dcc0212af5a7b5bdc082f9d2.jpg



1. 项目概述

1.1 硬件平台

 主控:ESP32‑P4RISC‑V

 屏幕:5.0 1280×720 MIPI DSI LCD

 触摸:GT911 电容触摸

 RTCRX8130CE

 传感器:BMI270IMU + 温度)

 电源:INA226 电量监测

 存储:SD 卡、NVS 闪存


1.2 软件环境

 ESP‑IDFv5.4.1+

 LVGLv9.3.0

 架构:应用层 框架层 → HAL 抽象层 平台驱动层

 生命周期:Mooncake 框架(Created → Opening → Running → Sleeping → Destroyed

1.3 核心功能

 公历 / 农历 / 星期 / 秒表实时显示

 RTC 硬件计时 + SNTP 网络自动同步

 多时区切换(POSIX 时区字符串)

 电池电量、温度、WiFi 状态显示

 IP 自动定位 + 实时天气获取

 屏幕截图保存到 SD

 触摸交互、设置入口集成

 

image.png

2. 整体架构设计

┌─────────────────────────────────────────┐
│              Clock App(应用层)         │
├───────────────┬─────────────────────────┤
│  UI 渲染模块  │ 逻辑/时间/天气/存储模块  │
├───────────────┴─────────────────────────┤
│             Mooncake 生命周期框架        │
├─────────────────────────────────────────┤
│               HAL 硬件抽象层             │
├─────────────────────────────────────────┤
│  RTC | LCD | Touch | IMU | Power | WiFi  │
└─────────────────────────────────────────┘

2.1 数据流

1. 1s 定时器触发 读取 RTC / 系统时间

2. 时间解析 更新公历 / 农历 / 星期 UI

3. 网络就绪 后台任务请求天气 解析 JSON → 异步刷新 UI

4. 电量 / 温度 / 网络状态实时轮询更新

 

3. 核心模块实现

3.1 时间获取与 RTC 驱动

// 读取 RX8130 硬件时钟

struct tm timeinfo;
if (board->IsRX8130Initialized()) {
    board->GetRTCtime(&timeinfo);
} else {
    time_t now;
    time(&now);
    localtime_r(&now, &timeinfo);
}

3.2 时区管理(POSIX 标准)

typedef struct {
    const char *name;
    const char *tz_str;
    int offset;
    const char *desc;
} timezone_config_t;

static const timezone_config_t tz_list[] = {
    {"UTC+8", "CST-8", 8, "东八区(北京)"},
    {"UTC+0", "UTC0", 0, "零时区"},
    // ... 更多时区
};

void apply_timezone(int idx) {
    setenv("TZ", tz_list[idx].tz_str, 1);
    tzset();
}

3.3 农历计算(简化工程版)

// 天干地支
int gan = (year - 4) % 10;
int zhi = (year - 4) % 12;
// 农历月日估算(生产建议用专业库)
int lunar_month = month - 1;
int lunar_day = day;

3.4 SNTP 网络授时

esp_sntp_config_t sntp_cfg = ESP_NETIF_SNTP_DEFAULT_CONFIG("pool.ntp.org");
esp_netif_sntp_init(&sntp_cfg);
// 同步成功后写入 RTC
if (esp_netif_sntp_sync_wait(pdMS_TO_TICKS(10000)) == ESP_OK) {
    struct tm timeinfo;
    time_t now = time(NULL);
    localtime_r(&now, &timeinfo);
    board->SetRTCtime(&timeinfo);
}

3.5 天气 + IP 定位(双 API

1. 高德 IP 定位 获取城市 adcode

2. sojson 天气 API → 获取天气 / 温度 / 风向

3. 缓存 1 小时避免频繁请求

// 天气获取后台任务
xTaskCreate(fetch_weather_task, "weather", 8192, NULL, 5, NULL);
// UI 异步更新
lv_async_call(update_weather_display, NULL);

3.6 LVGL UI 面板组件化

class ClockPanel : public PanelBase {
public:
    void init() override;
    void update(bool force) override;
private:
    lv_obj_t *label_time;
    lv_obj_t *label_date;
    // ... 其他控件
};

优点:解耦、可复用、易维护、支持热插拔

 

4. 项目文件结构


main/apps/tools/clock/
├── clock_app.cc       # 主逻辑、定时器、UI、事件
├── clock_app.h        # 结构体、枚举、对外接口
└── README.md

修改文件:
- app_config.h         # 注册应用
- settings_app.cc      # 加入设置菜单

 

5. 编译与烧录

bash
idf.py menuconfig   # 开启 LVGL、NVS、WiFi、HTTP 客户端
idf.py build
idf.py flash monitor

 

6. 功能使用说明

1. 主菜单 时钟 进入表盘界面

2. 显示:时间、日期、农历、电量、温度、天气

3. 触摸刷新:重新获取天气与定位

4. 设置 系统时钟:手动同步 NTP、切换时区

 

snap_20260404_162010.jpg


7. 总结

   本时钟 App 完整落地ESP‑IDF + LVGL9 M5Stack Tab5 上的工程化开发,覆盖 RTC硬件计时、SNTP网络授时、农历天干地支计算、多时区适配、网络天气同步、触摸交互、组件化架构等核心实战要点,是一套轻量化、高可用的嵌入式时间系统解决方案。整体代码结构清晰、资源占用极低,可直接移植到各类ESP32系列硬件项目中,能够作为嵌入式GUI开发、物联网时间与天气应用搭建的标准化参考模板,同时也为后续功能迭代优化预留了充足的拓展空间。 最后还把宠物应用也插入到了 时钟应用里面。 

项目地址,欢迎复现,走过路过,不要错过。 

https://gitee.com/genvex/m5stack_-osystem





关键词: 时钟     M5STACK     测评报告     LVGL9    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]