{"code":1,"msg":"成功","time":"1793358169","data":{"title":"〖2026嵌入式大赛〗基于 GD32H7 的多功能环境监测与本地数据记录仪系统","content":"# 基于 GD32H7 的多功能环境监测与本地数据记录仪系统\r\n\r\n作品开发报告\r\n\r\n硬件平台：GD32H759I-EVAL\r\n软件平台：RT-Thread 5.3.0、LVGL 8.3.11\r\n文档日期：2026 年 10 月 10 日\r\n\r\n## 一 作品简介\r\n\r\n本作品是一套能够脱离电脑独立工作的环境监测与本地数据记录系统。系统以 GD32H759I-EVAL 开发板为硬件平台，使用 RT-Thread 调度传感器采集、触摸显示、日志管理和声光报警任务，通过板载 LCD 展示温度、相对湿度、光照、等效二氧化碳浓度 eCO₂ 和总挥发性有机物 TVOC。用户可直接在中文触摸界面查看当前数值、调整报警阈值、设置日期时间、浏览趋势和翻阅历史记录。\r\n\r\n数据按用户选择的周期写入 SD 卡 CSV 文件，电脑端配套离线解析工具完成表格浏览、曲线分析、统计与导出。作品聚焦本地监测与记录，当前版本不包含以太网、TCP 上传或云端服务。\r\n\r\n系统适用于温室大棚、机房、实验室以及小型车间的环境观察和教学演示。SGP30 输出的 eCO₂ 是根据气体响应推算的等效值，不能视为专用 CO₂ 传感器的直接测量结果；本作品也未进行安全报警仪器认证。\r\n\r\n## 二 需求与设计目标\r\n\r\n现场监测需要同时解决“看得到当前环境”“发现超限”“留下历史记录”和“方便现场调整”四类问题。本作品将这些操作集中在开发板上：日常使用无需连接上位机，记录分析时再通过读卡器把 SD 卡数据交给电脑。\r\n\r\n| 需求         | 当前实现                                                   |\r\n| ------------ | ---------------------------------------------------------- |\r\n| 多参数监测   | SHT40 采集温湿度，BH1750 采集光照，SGP30 提供 eCO₂ 与 TVOC |\r\n| 本地人机交互 | 中文首页、曲线、设置、历史四个主页面，电容触摸操作         |\r\n| 参数配置     | 温湿度和光照上下限，气体上限，日期时间，两种独立记录间隔   |\r\n| 声光提醒     | 超限后 LED2 闪烁，蜂鸣器间断鸣叫                           |\r\n| 数据留存     | FAT16\/FAT32 SD 卡 CSV 日志，双槽配置文件                   |\r\n| 趋势观察     | 五种指标切换，144 个时间桶，采样间隔可调                   |\r\n| 离线分析     | Python\/Tkinter 上位机读取记录、校验配置、显示曲线和导出    |\r\n\r\n曲线采样间隔与 SD 保存间隔分别设置，范围均为 1 秒至 24 小时，界面提供秒、分钟和小时单位。默认两者均为 10 分钟。144 个曲线时间桶在默认配置下约覆盖 24 小时，修改采样间隔后显示跨度随之改变，因此不能把所有配置下的曲线都称为“24 小时曲线”。\r\n\r\n## 三 系统总体方案\r\n\r\n系统由传感器、GD32H7 主控、LCD 触摸屏、RTC、SD 卡、LED2 和蜂鸣器组成。主控通过 I2C 采集环境数据，完成有效性检查后发布 RAM 快照。LVGL 界面读取快照；后台日志服务负责阈值判断、曲线组织、配置持久化和 SD 文件访问；报警线程根据报警状态控制声光输出。\r\n\r\n```text\r\nSHT40 \/ BH1750 \/ SGP30\r\n          │ I2C\r\n          ▼\r\n     sensor 采集线程 ────► RAM 数据快照 ────► LVGL 中文触摸界面\r\n                               │                    │ 参数和操作请求\r\n                               ▼                    ▼\r\n                     envlog 后台日志服务 ◄──── RT-Thread 事件\r\n                       │       │       │\r\n                       │       │       └────► RTC 时间管理\r\n                       │       └────────────► SDIO \/ FAT \/ SD 卡\r\n                       ▼                                │ 读卡器\r\n                    报警标志                            ▼\r\n                       │                       电脑离线解析工具\r\n                       ▼\r\n                  alarm 输出线程\r\n                       │\r\n                LED2 + 蜂鸣器\r\n```\r\n\r\n\r\n\r\n## 四 硬件设计\r\n\r\n### 4.1 主控与显示\r\n\r\nGD32H759IMK6 使用 Arm Cortex-M7 内核，最高主频为 600 MHz。工程基于 RT-Thread 原有 `bsp\/gd32\/arm\/gd32h759i-eval` BSP 扩展，保留原工程结构，便于使用 Keil MDK 或 GCC 构建。\r\n\r\nLCD 采用官方 `29_TLI_Touch_Draw` 示例对应的 TLI RGB 并行接口，分辨率为 480×272，像素格式为 RGB565。GT911 电容触摸控制器通过软件 I2C 访问，并注册为 LVGL 指针输入设备。本工程没有使用 SPI LCD。\r\n\r\n| 功能           | 引脚或连接                               | 设计说明                                          |\r\n| -------------- | ---------------------------------------- | ------------------------------------------------- |\r\n| LCD 时序       | PE15 HSYNC、PA7 VSYNC、PG7 PCLK、PF10 DE | RGB 数据线按 `board\/drv_tli_lcd.c` 与官方例程连接 |\r\n| LCD 背光       | PG13                                     | 屏幕背光控制                                      |\r\n| GT911          | PH7 SCL、PF9 SDA、PF6 RST、PH6 INT       | 软件 I2C，轮询触点                                |\r\n| 传感器 I2C1    | PH4 SCL、PB11 SDA                        | 设备名 `hwi2c1`，共地及 3.3 V 上拉                |\r\n| SDIO0          | PB13 D0、PC12 CLK、PD2 CMD               | 单数据线模式，避免占用 LCD 数据脚                 |\r\n| 调试串口       | PA9 TX、PA10 RX                          | USART0，115200、8-N-1、无流控                     |\r\n| 报警 LED2      | PA6                                      | JP66 连接 2-3                                     |\r\n| 默认无源蜂鸣器 | PC6                                      | 使用模块或驱动级，空闲为高电平                    |\r\n| 备用有源蜂鸣器 | PE2                                      | 当前代码高电平有效，编译开关选择                  |\r\n\r\nLCD 与 SD 共用板上复用资源：JP52 置于 1-2，JP65 置于 2-3；SD 使用单线模式，不将 LCD B4 所需的 PC11 改为 SD 数据线。PB8\/PB9 已用于 LCD，不能再次作为传感器总线。PF10 是 LCD DE，报警因此选择 LED2，而不使用该引脚对应的 LED1。PC5 连接以太网 PHY 输出，即使软件没有启用网络，也不适合用作蜂鸣器输出。\r\n\r\n### 4.2 传感器\r\n\r\n| 器件   | I2C 地址     | 数据及用途                     |\r\n| ------ | ------------ | ------------------------------ |\r\n| SHT40  | 0x44         | 温度、相对湿度                 |\r\n| BH1750 | 0x23 或 0x5C | 光照强度，单位 lux             |\r\n| SGP30  | 0x58         | eCO₂，单位 ppm；TVOC，单位 ppb |\r\n\r\n三类模块共享传感器 I2C 总线。软件检查 SHT40、SGP30 数据 CRC，并将通信失败、预热和数据过期与有效读数区分。SGP30 启动约 15 秒内显示预热状态；无效数据不作为零值参与展示或报警。传感器精度仍取决于具体器件、模块供电、安装环境和校准条件，不能用界面小数位数代替实际测量精度。\r\n\r\n### 4.3 RTC 与报警输出\r\n\r\nRTC 采用片内 IRC32K 时钟，使用备份寄存器标识已初始化和已校时状态。正常启动时尽量保留有效日历，避免每次复位重新写入默认时间。掉电走时依赖 VBAT 电池和跳线供电路径，板上 JP0 应按电池供电连接 2-3。长期走时误差尚需实测。\r\n\r\n当前默认保留 PC6 无源蜂鸣器路径。在鸣叫窗口内输出约 500 Hz 方波，250 ms 鸣叫与 250 ms 静音交替，LED2 同步闪烁。备用有源模块由 PE2 控制，修改 `applications\/alarm.h` 中 `GD32_ALARM_USE_ACTIVE` 后重新编译即可切换。GPIO 仅负责控制信号，蜂鸣器负载由模块或外部驱动级供电；软件间断鸣叫不构成电气限流措施。\r\n\r\n## 五 软件实现\r\n\r\n### 5.1 RT-Thread 任务组织\r\n\r\n| 线程   | 优先级 | 栈大小 | 主要职责                            |\r\n| ------ | ------ | ------ | ----------------------------------- |\r\n| main   | 10     | 2048 B | 服务启动及有限诊断输出              |\r\n| tshell | 20     | 4096 B | MSH 串口命令                        |\r\n| LVGL   | 21     | 4096 B | 触摸读取、控件更新、屏幕绘制        |\r\n| sensor | 23     | 2048 B | I2C 采集与快照发布                  |\r\n| alarm  | 24     | 1536 B | LED 与蜂鸣器节拍输出                |\r\n| envlog | 25     | 4096 B | RTC 请求、曲线、配置、SD 日志与历史 |\r\n\r\nRT-Thread 中数值越小代表优先级越高。传感器线程完成一轮转换后延时 1000 ms，实际采集周期还包含器件转换和通信时间，不是严格的 1 Hz 采样。界面约每秒刷新读数。设置 1 秒保存周期可能写入相邻的相同快照，不代表硬件采样速度同步提升。\r\n\r\n采集服务基于 RT-Thread I2C 设备接口封装，并对应用提供统一快照。目前没有把每颗传感器注册为 RT-Thread 标准 Sensor 设备类；后续新增 pH、噪声等通道时，需要同步扩展驱动、快照字段、有效位、界面、日志格式及电脑端解析。\r\n\r\n### 5.2 中文触摸界面\r\n\r\n首页以四张卡片展示温度、湿度、光照和空气指标，并显示传感器、存储及报警状态。无效、预热或超时数据以 `--` 表示，防止把离线误判为环境数值降低。设备状态面板用于查看各传感器状态。\r\n\r\n曲线页可切换五种指标。数据按所选周期分桶，保留最近 144 个桶，空缺桶保留为缺失。改变曲线周期时清空 RAM 中旧时间桶，防止不同时间尺度混用；SD 卡已有 CSV 不随之删除。重启后可恢复的曲线仅来自已写入 CSV 的样本，较慢的 CSV 保存周期可能使恢复后的曲线出现空缺。\r\n\r\n设置页包含温度、湿度、气体、光照、时间、存储和曲线设置。温湿度、光照支持上下限；eCO₂、TVOC 设置上限。当前判定条件为严格小于下限或大于上限，数值恰好等于阈值时不触发报警。\r\n\r\n历史页以每页四条记录显示最新数据，支持翻页、详情、刷新及二次确认后的清空。清空仅针对应用日志和趋势，保留阈值配置及 SD 卡其他文件。\r\n\r\n\r\n![dashboard-preview.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/0e8cf9cf6e6f96610344687749efed45.png)\r\n\r\n图 1 首页桌面模拟预览。数值为模拟数据，仅说明布局，不作为传感器实测结果。\r\n\r\n![trend-preview.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/b83ee5c7fb5a5bef404a7e2cd58bb9c1.png)\r\n\r\n图 2 默认周期下的曲线桌面模拟预览。预览图生成于开发阶段，实际周期以当前设置为准。\r\n\r\n### 5.3 SD 卡日志与配置\r\n\r\n系统通过 RT-Thread 块设备、DFS 与 FatFs 访问 SD 卡。当前支持 FAT16\/FAT32，未启用 exFAT，不执行自动格式化。经过测试 64 GB FAT32 卡在启动输出中识别为 59638 MiB，并成功挂载到根目录；卡容量识别和挂载成功。\r\n\r\n记录写入根目录 `envlog.csv`，字段如下：\r\n\r\n```csv\r\ntimestamp,temperature_x100,humidity_x100,lux_x10,eco2_ppm,tvoc_ppb,valid_flags\r\n```\r\n\r\n| 字段             | 含义与转换                                            |\r\n| ---------------- | ----------------------------------------------------- |\r\n| timestamp        | UTC 日历文本；界面默认按 UTC+8 显示                   |\r\n| temperature_x100 | 温度整数除以 100 得 °C                                |\r\n| humidity_x100    | 相对湿度整数除以 100 得 %                             |\r\n| lux_x10          | 光照整数除以 10 得 lux                                |\r\n| eco2_ppm         | 等效二氧化碳，ppm                                     |\r\n| tvoc_ppb         | 总挥发性有机物，ppb                                   |\r\n| valid_flags      | bit0 为 SHT40，bit1 为 BH1750，bit2 为 SGP30 有效标志 |\r\n\r\n无效通道以空字段表示，并结合有效位解析。CSV 时间采用 UTC，避免文件保存随本地显示时区变化而失去一致性。\r\n\r\n配置使用 `ecfg0.bin` 与 `ecfg1.bin` 双槽交替保存，记录版本、序号、阈值、两种间隔和校验值。当前 v4 配置长度为 56 字节，并兼容旧版 v1、v2、v3 配置。启动时选择有效且较新的槽；保存时进行同步和读回校验。参数先在 RAM 中生效，后台成功写入后才具有掉电保持能力，无卡状态下不能认为参数已永久保存。\r\n\r\n文件保存执行同步操作，并处理未完整换行的尾部记录。突然掉电仍可能丢失正在写入的数据或损坏 FAT 元数据，因此“本地存储”不等于任何时刻断电都能保证零损失。历史恢复按需启动并分片扫描，避免每次进入系统立即扫描全部日志。\r\n\r\n### 5.4 时间设置与存储调度\r\n\r\nHMI 时间保存回调只检查输入并提交请求，RTC 写入和后续处理由后台执行。RTC 内部按 UTC 组织时间，界面使用本地时区显示，校验日期范围为 2000 至 2099 年。自动保存和曲线采样使用独立的 RT-Thread tick 截止时间，避免改变日历时把两个周期混为同一计划。\r\n\r\n开发中曾出现“保存时间后界面和串口无响应”，且拔出 TF 卡后校时正常的现象。这支持继续检查校时后的 SD 路径。现有代码已增加 SD 等待上限、挂载重试退避及后台状态诊断。\r\n\r\n### 5.5 内存与异常处理\r\n\r\nRGB565 帧缓冲占用 261120 字节，固定地址为 `0x24005000`。链接区从 `0x24045000` 开始，避开 LCD 帧缓冲。AXI SRAM 的堆上限按器件配置使用 `0x240D0000`，不能把其他 SRAM 区域或整片 SRAM 总容量直接加到该连续地址空间。\r\n\r\nLVGL 使用两个 40 行绘制缓冲，共 76800 字节，并在更新显示区后执行对齐的 D-Cache 清理。线程栈、趋势桶和读取缓冲采用固定容量，控制内存增长；LVGL 控件仍需动态内存，长期稳定运行应通过持续页面操作和堆统计验证。\r\n\r\n传感器快照锁、SD 互斥锁和 SD 命令等待设置了时间上限；挂载失败采用退避重试。GT911 通信错误后释放触点状态并尝试恢复。报警线程不直接访问 I2C 和 SD。构建标签中的 `SD watchdog` 表示 SD 超时防护，不代表已启用独立硬件看门狗。\r\n\r\n## 六 电脑端离线解析工具\r\n\r\n上位机由 `tools\/envlog_parser.py` 和 `tools\/envlog_gui.py` 实现，使用 Python 3.9 及以上版本和 Tkinter。用户将 SD 卡通过读卡器接入电脑后，可选择卡目录或 CSV 文件，查看分页记录、时间范围、五类曲线、统计及坏行提示，也可导出换算为实际单位的 CSV。\r\n\r\n工具能够解析配置版本和双槽校验结果，按序号选择当前有效配置。输入文件保持只读，导出目标不能覆盖原日志和配置。曲线按真实时间间距绘制，在坏行、数据缺失和时钟回退处断开，减少误导性的连线。\r\n\r\n\r\n```powershell\r\n# 在 BSP 目录执行；F:\\ 仅为读卡器盘符示例\r\npython tools\\envlog_parser.py F:\\ --gui\r\npython tools\\envlog_parser.py F:\\ --show 20 --config\r\npython tools\\envlog_parser.py F:\\ --export decoded_envlog.csv\r\n```\r\n或者选用打包好的上位机解析工具 GD32_SD_Viewer\r\n![screenshot_image.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/3de9106a7455df4c4b3a7a4ebd5d309e.png.webp)\r\n将sd卡内部的数据文件导入即可解析\r\n\r\n![screenshot_屏幕截图 2026-10-05 222335.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/be6287913065d7760e527064a6b556d5.png.webp)\r\n具体演示查看视频\r\n\r\n## 七 实物照片\r\n\r\n![screenshot_1.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/33f1ed2fd417f6b0bb2e1d4afd7d8085.png.webp)\r\n![screenshot_4.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/023d2a756307340b422744325f2e1506.png.webp)\r\n![screenshot_3.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/38295561e49043bee131b60e07453e46.png.webp)\r\n![screenshot_6.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/3845dc65799a8f2b4571b36338e5b1e0.png.webp)\r\n![screenshot_2.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/69152e017d125059cbf68ec46f54a800.png.webp)\r\n![screenshot_5.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/46c0e3c3391dc452a93bcfd818b26ede.png.webp)\r\n![screenshot_7.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261010\/1c54aff294c1ba75403bb1b875a0a77b.png.webp)\r\n\r\n\r\n\r\n## 八 作品特点与后续改进\r\n\r\n本作品把中文触摸操作、多参数采集、可配置报警、RTC 时间和 SD 记录组合成一个可独立使用的终端。曲线与日志周期分别配置，让现场观察与存储容量可以按不同需求取舍；统一快照接口和电脑解析工具则把板端显示与离线分析连接起来。\r\n\r\n当前主要限制是单线低速 SDIO 访问、IRC32K 长期时间精度、报警判定可能受后台 I\/O 延迟影响，以及历史日志未保存报警事件和当时阈值。后续可在实板验证基础上改善 SD 超时恢复，把报警判定放入独立且有界的刷新流程，增加事件日志，并评估高精度 RTC 时钟与传感器校准。新增传感器时应明确数据格式版本，避免板端与上位机对字段含义理解不一致。\r\n\r\n\r\n## 十 参考资料\r\n\r\n1. RT-Thread 5.3.0 源码、GD32H759I-EVAL BSP 及[官方文档](https:\/\/www.rt-thread.org\/document\/site\/)。\r\n2. GigaDevice GD32H759I-EVAL V2.1 原理图、评估板使用指南 Rev2.2。\r\n3. GigaDevice 官方示例 `29_TLI_Touch_Draw`、`18_SDIO_SDCardTest`、`22_RTC_Calendar`。\r\n4. [LVGL 8.3 文档](https:\/\/docs.lvgl.io\/8.3\/)。\r\n5. SHT40、BH1750、SGP30 数据手册及当前工程对应驱动实现。\r\n## 十一 项目演示\r\n演示视频：\r\nhttps:\/\/www.bilibili.com\/video\/BV1WypQ6CEEp\/?spm_id_from=333.1387.upload.video_card.click&vd_source=637bc72437f6f4f0e6aca0ca81493ac7\r\n开源代码：\r\nhttps:\/\/github.com\/jxgfc\/rt-thread-gd32h7-environment-monitor-keil","updatetime":"2026-10-13 08:37:07","author":"jxgfc"}}