所选任务:入门级题目2——智能植物监护器
1. 项目描述
养护盆栽时,我们常常根据土壤表面和经验判断是否需要浇水,但植物的生长环境还受到温度、空气湿度和光照等因素影响。这个项目希望将这些信息集中显示,让使用者能够直观了解盆栽当前的环境,并在土壤偏干时收到提醒。
“植护小圆屏”以 MAX32650FTHR 开发板为核心,使用 AHT20 采集环境温湿度,使用 BH1750 采集光照强度,通过土壤湿度模块的 DO 输出判断土壤干湿状态,并在一块 1.28 英寸圆形 TFT 液晶屏上显示结果。当土壤达到设定的干燥阈值时,系统显示 DRY,并通过蜂鸣器进行间歇提醒。
项目使用 CodeFusion Studio 2.3.0 与 MSDK 开发,采用裸机 C 和状态机组织程序,通过 MAX32625PICO 完成下载与调试。
当前版本实现了以下功能:
- 环境温度、空气相对湿度和光照强度采集。
- 土壤干湿状态检测,阈值通过土壤模块上的电位器设置。
- 单块圆形屏显示环境数据、干湿状态和报警状态。
- 土壤干燥时蜂鸣提醒,支持按键静音。
- 按键切换实时页面与输入诊断页面。
- 对土壤输入进行防抖,对 I2C 通信异常进行超时处理。
土壤模块当前使用数字输出,因此显示的是是否越过设定的干湿阈值,不提供土壤含水率百分比。温度、空气湿度和光照则显示对应的测量数值。
本次成品以环境监测与缺水提醒为主要功能,未加入自动浇水执行机构和 SD 卡记录功能。
2. 硬件介绍

硬件 | 用途与说明 |
|---|---|
MAX32650FTHR 开发板 | 主控制器,负责传感器读取、状态判断、屏幕显示和报警控制 |
MAX32625PICO | 通过 CMSIS-DAP/SWD 下载程序和调试 |
AHT20 温湿度模块 | 通过 I2C 读取环境温度与空气相对湿度 |
BH1750 光照模块 | 通过 I2C 读取光照强度,以 lx 显示 |
四线土壤湿度模块及电阻式探头 | 使用 DO 输出干湿状态,通过板载电位器调整阈值 |
GC9A01 圆形 TFT 模块 | 1.28 英寸、240 × 240 分辨率,通过 SPI 显示数据 |
低电平触发蜂鸣器模块 | 进行缺水提醒,本项目使用 3.3 V 供电 |
开发板按键 | SW1 控制报警静音,SW2 切换页面 |
USB 数据线、杜邦线等 | 用于供电、下载调试和模块连接 |
土壤模块包含比较电路和可调电位器。探头与土壤接触后,电路根据探头信号和设定阈值输出高低电平。当前配置采用:
DO 电平 | 程序判定 | 屏幕显示 |
|---|---|---|
高电平,1 | 土壤偏干 |
|
低电平,0 | 土壤湿润 |
|
电位器用于调整干湿判断的分界点。调节时需要让探头与土壤保持良好接触,并结合模块 DO 指示灯及屏幕上的状态变化确定阈值。
3. 方案框图与设计思路
整体方案分为数据采集、状态判断和显示提醒三个部分。
数据采集部分使用 I2C1 连接 AHT20 和 BH1750,两个器件通过不同地址共享总线。土壤模块通过 P1.31 输入数字状态,程序对输入进行防抖后再更新干湿结果。
状态判断部分根据有效的土壤输入决定是否产生缺水报警,同时处理按键静音和页面切换。温湿度与光照用于展示生长环境,当前报警条件以土壤干湿状态为主。
显示提醒部分使用单块圆形 TFT 集中显示信息。实时页面向日常使用,诊断页显示土壤 DO 电平和传感器错误计数,便于检查模块状态。
软件采用状态机分阶段完成传感器测量。例如,启动温湿度测量后,程序先执行其他任务,等待转换时间到达后再读取结果,使按键、报警和显示能够持续响应。
4. 硬件连接说明
本项目使用现成开发板和传感器模块,通过杜邦线连接,没有单独设计 PCB。下表给出最终方案的主要连接关系。
模块信号 | MAX32650FTHR 引脚 | 说明 |
|---|---|---|
AHT20、BH1750 SDA | P2.17 | I2C1 数据 |
AHT20、BH1750 SCL | P2.18 | I2C1 时钟 |
BH1750 ADDR | GND | 使用地址 |
土壤模块 DO | P1.31 | 干湿状态输入 |
GC9A01 SCL/SCK | P1.26 | SPI1 时钟 |
GC9A01 SDA/DIN | P1.29 | SPI1 MOSI |
GC9A01 DC | P1.24 | 数据/命令选择 |
GC9A01 CS | P1.23 | 屏幕片选 |
GC9A01 RST | P1.27 | 屏幕复位 |
蜂鸣器 IN | P2.13 | 低电平触发 |
各外接模块电源与地 | 3.3 V、GND | 与开发板共地 |
屏幕上的 SDA 在这里表示 SPI 数据输入,应连接 MOSI。土壤模块的 AO 引脚在当前方案中留空。
P1.31 当前用于土壤 DO 输入,浮球功能已关闭。
5. 软件流程与调试软件说明
软件以主循环为中心,根据毫秒计时推进各个任务。
主要任务的时间安排如下:
任务 | 当前配置 |
|---|---|
土壤 DO 读取 | 每轮主循环读取 |
土壤状态防抖 | 新电平持续稳定 200 ms 后接受 |
土壤快照更新 | 稳定状态下约每 100 ms 更新一次 |
AHT20 测量 | 约每 2 秒启动一次 |
BH1750 测量 | 约每 1 秒启动一次 |
按键扫描 | 约每 20 ms 一次,另有按键防抖 |
缺水蜂鸣提醒 | 报警期间约每 5 秒响 150 ms |
这些周期由主循环和状态机共同实现,实际响应还受到外设执行时间及屏幕刷新进度影响。
开发环境使用 CodeFusion Studio,工程采用 MSDK,目标芯片为 MAX32650,板级编译目标为 FTHR_APPS_A。
在 CFS 中的主要操作过程是:
- 打开工程工作区和
.cfsconfig,查看芯片、板卡及引脚配置。 - 编辑传感器读取、应用逻辑和显示程序。
- 执行 CFS: build 编译工程。
- 使用 MAX32625PICO 连接开发板,在“运行和调试”中启动下载与调试。
- 程序停在
main()后继续运行,观察屏幕与传感器响应。 - 需要定位问题时,设置断点并在“监视”窗口检查变量。
程序提供了 g_plant_sensors、g_plant_app 和 g_main_loops 等全局变量,方便查看采样结果、应用状态和主循环运行情况。
6. 关键代码说明
主要文件的职责如下:
文件 | 主要职责 |
|---|---|
| 初始化和主循环调度 |
| GPIO、按键、蜂鸣器及板级接口 |
| 温湿度、光照读取和土壤 DO 防抖 |
| 干湿判断、报警与按键逻辑 |
| 屏幕驱动及界面绘制 |
| 功能开关、周期、接口地址与极性配置 |
工程中保留了原有记录功能和模拟采样相关源码,当前默认配置关闭 SD 记录并选择土壤 DO 模式。
以下为关键代码节选。
① 功能配置
#define PLANT_LOGGING_ENABLED 0
#define PLANT_SOIL_DIGITAL 1
#define PLANT_SOIL_DRY_HIGH 1
#define PLANT_SOIL_DEBOUNCE_MS 200u
#define PLANT_SOIL_REFRESH_MS 100u
#define PLANT_DISPLAY_COUNT 1
#define PLANT_BUZZER_ACTIVE_HIGH 0
这些配置确定了当前成品使用一块屏幕、通过 DO 检测土壤状态,以及蜂鸣器的触发极性。
② 土壤 DO 防抖
bool level = board_port_soil_level();
if (level != soil_input.candidate) {
soil_input.candidate = level;
soil_input.changed = now;
}
if (plant_elapsed(now, soil_input.changed,
PLANT_SOIL_DEBOUNCE_MS)) {
if (!snapshot.soil.valid ||
snapshot.soil.value != (int32_t)level ||
plant_elapsed(now, snapshot.soil.timestamp_ms,
PLANT_SOIL_REFRESH_MS)) {
publish(&snapshot.soil, level, now);
}
}
电平发生变化时,程序记录候选状态和变化时间。只有候选电平持续稳定 200 ms,才接受新的干湿结果。
这样可以减少比较器在阈值附近短暂跳变引起的画面闪动和报警反复切换。完整实现还会在输入抖动期间保留上一次已确认的状态。
③ 干湿判断与蜂鸣提醒
a->soil_alarm =
(s->soil.value != 0) == (PLANT_SOIL_DRY_HIGH != 0);
a->soil_state =
a->soil_alarm ? PLANT_SOIL_DRY : PLANT_SOIL_OK;
程序通过配置项解释 DO 极性,默认高电平为干燥。
a->buzzer_on =
alarm &&
!a->muted &&
!a->calibration_mode &&
((uint32_t)(now - a->alarm_started_ms) % 5000u < 150u);
蜂鸣器使用计时条件产生间歇提醒。SW1 可以将本次报警静音,土壤恢复湿润后报警解除;下一次出现干燥状态时,可以重新提醒。
④ I2C 初始化顺序
MXC_I2C1->ctrl0 = MXC_F_I2C_CTRL0_I2CEN;
MXC_I2C1->ctrl0 |= MXC_F_I2C_CTRL0_MST;
调试中对照 MSDK 的初始化方式,将启用 I2C 外设与设置主机模式分成两次寄存器写入,并在通信异常恢复时采用相同顺序。
I2C 传输还设置了软件超时,避免程序一直等待异常总线而影响其他功能。
7. 实物演示及说明
下图为项目开发过程中使用的 CodeFusion Studio System Planner 配置界面,能够看到 MAX32650、FTHR 板卡信息和工程结构。
图1:CFS 配置界面。此图为开发阶段截图,下方保留了当时编辑器的头文件路径诊断提示。
下图展示了通过 MAX32625PICO 进入程序调试后,CFS 中的源码、断点和变量监视界面。
图2:程序暂停在 main 入口时的调试界面。此时尚未执行 sensors_init,因此图中的 bus_configured=false 属于初始化前状态。
实物运行时,圆形屏集中显示土壤干湿状态、温度、空气湿度和光照强度。以下照片中,温度为 25.47 ℃、空气相对湿度为 61.07%、光照为 70 lx,土壤状态显示为 DRY。
图3:圆屏、开发板与模块连接的联调实物照片。拍摄时仍启用了旧版 SD 状态显示;当前工程已关闭 SD 功能,并移除对应提示。
输入诊断页面显示土壤 DO 电平、干湿判定规则、防抖时间及传感器错误计数,便于将模块指示灯、GPIO 输入和屏幕结果对应起来。
图4:土壤输入诊断页。图中 DO 为高电平,判定为 DRY;温湿度与光照错误计数均为 0。
演示时,可依次进行以下操作:
操作 | 展示内容 |
|---|---|
上电运行 | 圆屏显示温湿度、光照与土壤状态 |
将探头放入偏干土壤 | 显示 |
短按 SW1 | 本次报警静音 |
将探头放入湿润土壤 | 在阈值设置合适时切换为 |
遮挡、移开光照传感器 | 观察光照数值变化 |
短按 SW2 | 在实时页和诊断页之间切换 |
以上演示需要保持程序处于继续运行状态,避免调试断点暂停影响观察。
8. 遇到的难点及解决方法
开发环境与调试器配置
刚开始使用 CFS 时,遇到了 SDK 路径配置以及 OpenOCD 无法识别 CMSIS-DAP 设备的问题。
处理时先区分问题发生的阶段:路径问题需要检查 CFS 和工程配置;unable to find a matching CMSIS-DAP device 则发生在调试器识别阶段。检查 USB 数据线及连接后,确认其中一次无法调试是连接松动引起的。
这让我认识到,编译成功、识别调试器、下载程序和程序正常运行,需要分别检查。
屏幕正常显示,但传感器数据一直无效
联调初期,屏幕能够正常绘制,但温湿度、光照和土壤采样都显示无效,错误计数持续增加。
通过断点和寄存器检查,发现 I2C 控制寄存器为 0x301,其中主机模式位未置位。随后对照 MSDK 初始化流程,调整为先启用 I2C,再单独设置主机模式,并同步修改异常恢复流程。
这一问题说明:屏幕能显示,可以证明部分程序已运行,但传感器接口仍需要独立检查。变量和寄存器信息能帮助进一步定位固件问题。
9. 活动心得与建议
这是一次从开发环境安装、官方示例运行,到传感器接线、驱动调试和界面展示的完整实践。对初次使用 MAX32650FTHR 和 CFS 的我来说,最大的收获是建立了分阶段验证的习惯。
开发时可以先确认工具链和调试器,再验证一个传感器或一块屏幕,最后组合各个功能。发生问题时,将编译输出、调试器连接、寄存器状态和实际电平结合起来看,比反复修改接线或程序更容易找到原因。
CFS 的配置界面、源码调试和变量监视,在这个过程中提供了实际帮助。特别是在传感器数据无效时,通过查看状态机和寄存器,能够发现表面现象背后的软件问题。
希望后续活动能够提供更多面向初学者的完整案例,例如 MAX32650FTHR 与 MAX32625PICO 的连接说明、常见 I2C 模块接入步骤,以及从配置、编译到断点调试的演示。
后续可以在目前的监测与提醒功能上扩展浇水控制,并结合水位检测、浇水时间限制及异常处理,进一步完善植物养护功能。