《2025DigiKey AI应用创意挑战赛》基于 M5Stack Tab5 与 MAX30102 的实时生理监测与智能交互系统
一、项目简介
随着人口老龄化加剧和大众健康意识提升,智能医疗设备市场迎来快速增长期。传统健康监测设备大多仅实现数据展示功能,缺乏智能交互与专业解读能力,难以满足用户个性化健康管理的需求。与此同时,大语言模型技术的快速发展为智能医疗领域带来全新机遇。本项目以此为契机,打造出一款集实时心率和血氧数据精准采集、自然语言交互于一体的智能医疗管理**机器人。该系统以 M5Stack Tab5 智能终端为硬件核心,深度集成 MAX30102 高精度生物传感器,并结合大语言模型技术,实现从 “硬件采集” 到 “智能服务” 的全链路升级,为用户提供专业、便捷的健康管理方案。
二、硬件选型与系统架构
2.1 主控终端:
M5Stack Tab5M5Stack Tab5是面向开发者的高扩展性便携式智能物联网终端,为系统提供强大的计算、交互与通信能力:
技术参数
|
具体规格
|
核心芯片
|
ESP32-P4 SoC,16MB Flash,32MB PSRAM
|
无线通信
|
Wi-Fi 6,内置3D天线+外部MMCX天线接口
|
交互能力
|
5英寸1280×720 IPS触控屏,2MP摄像头,双麦克风阵列
|
扩展接口
|
USB Type-A/Type-C,RS-485总线,M5-Bus,GPIO_EXT排母
|
电源管理
|
兼容NP-F550可拆卸锂电池,集成充电管理电路
|
辅助传感器
|
BMI270六轴传感器,RX8130CE实时时钟
|
2.2 核心检测单元:
MAX30102MAX30102是一款集成的脉搏血氧仪和心率监测传感器模块,采用光电容积脉搏波描记法(PPG)技术:
技术参数
|
具体规格
|
工作电压
|
1.8V-3.3V,与M5Stack Tab5完美兼容
|
测量范围
|
心率:40-200 BPM;血氧饱和度:70%-100%
|
测量精度
|
心率:±2 BPM;血氧饱和度:±2%
|
硬件设计
|
集成红光(660nm)/红外(880nm)双LED,高灵敏度光电二极管,18位ADC
|
功耗表现
|
测量模式典型功耗≈15mW,待机模式仅0.7μW
|
通信能力
|
I2C接口(默认地址0x57,最高400kHz),支持中断输出
| 为了优雅,使用m5stack 提供的传感器构造万能洞洞板,通过飞线把传感器组装成一个商品化程度很高的传感器套装,通过grove数据接口可以接入m5stack及其他兼容grove接口的主控,避免了直接使用杜邦线+面包板的尴尬境地,拓宽了产品的使用范围。
传感器组装流程图 2.3 系统架构设计
系统采用分层架构设计,各层职责明确、低耦合高扩展:
三、小智项目的编辑构建
很多情况下,自己编译一个现成产品的小智固件都是一件充满荆棘的道路,项目初期在小智环境构建环节就花费了很大的精力,导致现在对于纷繁芜杂idf的menuconfig体系都有深入的了解。以上是tab5构建的menuconfig指引,需要仔细查看配置的进入路径。
需手动编译,参考 `m5stack-tab5/config.json` 修改 menuconfig 对应选项。
"CONFIG_BOARD_TYPE_M5STACK_CORE_TAB5=y",
"CONFIG_XIAOZHI_ENABLE_ROTATE_CAMERA_IMAGE=y",
这个最难找
"CONFIG_CAMERA_SC202CS=y",
还有一个极为重要的修改,这个修改会被很多人说忽略,确实本人用了一个月的时间才从这个坑里爬了出来,差点都起了放弃挣扎的心。需要在项小智项目根目录下的sdkconfig文件了修改CONFIG_ESP_HOSTED_SDIO_GPIO_RESET_SLAVE=14 ,这个参数默认配置是54,作用是 主控跟c6网卡沟通用的reset引脚,这个引脚配置错了对联网没什么影响,但正巧54这个io引脚是 tab5外置i2c接口的clk引脚,那么就会造成了很多诡异的现象,在移植传感器的时候总是报错,让人摸不清头脑,到底是移植代码的错误还试硬件的硬伤,反复摸爬滚打才得出了这个惨痛的经验,希望这个发现对tab5的用户有所帮助,让他们少走很多弯路。
四、核心技术实现
4.1 传感器驱动模块
实现了MAX30102传感器驱动的全面升级改造,直接操作MAX30102硬件,使用新版I2C Master Bus API,大幅提升了传感器的稳定性和数据采集精度:
4.1.1 驱动架构重构·
直接硬件操作:
移除对MAX30105驱动的依赖,直接操作MAX30102硬件寄存器
· API升级:将旧版driver/i2c.h替换为新版driver/i2c_master.h
· 类结构设计:采用面向对象的设计模式,实现MAX30102类继承自I2cDevice基类
4.1.2 传感器配置优化
void MAX30102::configSensor() {
// 软复位
reset();
// FIFO配置
bitMask(MAX30102_FIFOCONFIG, MAX30102_SAMPLEAVG_MASK, MAX30102_SAMPLEAVG_4);
bitMask(MAX30102_FIFOCONFIG, MAX30102_ROLLOVER_MASK, MAX30102_ROLLOVER_ENABLE);
// 模式配置
bitMask(MAX30102_MODECONFIG, MAX30102_MODE_MASK, MAX30102_MODE_REDIRONLY);
// 粒子配置
bitMask(MAX30102_PARTICLECONFIG, MAX30102_ADCRANGE_MASK, MAX30102_ADCRANGE_4096);
bitMask(MAX30102_PARTICLECONFIG, MAX30102_SAMPLERATE_MASK, MAX30102_SAMPLERATE_200); // 提高采样率到200Hz
bitMask(MAX30102_PARTICLECONFIG, MAX30102_PULSEWIDTH_MASK, MAX30102_PULSEWIDTH_411);
// LED脉冲幅度配置
WriteReg(MAX30102_LED1_PULSEAMP, 0x3F); // IR LED电流: 50.0mA
WriteReg(MAX30102_LED2_PULSEAMP, 0x3F); // Red LED电流: 50.0mA
// 多LED模式配置
bitMask(MAX30102_MULTILEDCONFIG1, MAX30102_SLOT1_MASK, SLOT_RED_LED);
bitMask(MAX30102_MULTILEDCONFIG1, MAX30102_SLOT2_MASK, SLOT_IR_LED << 4);
// 清除FIFO
resetFifo();
}
4.1.3 数据读取与处理优化
请查看源码,字数超限
4.2 数据处理模块
实现了专业的数据处理流程,对传感器原始数据进行多维度处理:
4.2.1 降噪滤波
· 平均滤波:使用4次采样平均(SAMPLEAVG_4)减少噪声
· DC分量估计:通过averageDCEstimator()函数移除基线漂移
· 低通FIR滤波:通过lowPassFIRFilter()函数进一步抑制高频噪声
4.2.2 参数计算
· 心率计算:通过checkForBeat()函数检测IR信号峰值,计算相邻峰值间隔得到心率
· 血氧计算:通过maximHeartRateAndOxygenSaturation()函数,基于双波长吸收原理计算SpO₂
· 实时处理:每次新数据到来时进行增量计算,减少延迟
4.2.3 异常检测
· 范围过滤:对心率(40-150bpm)和血氧(50-100%)值进行范围过滤
· 信号质量评估:通过信号强度和形状判断,减少误检测
· 一致性检查:要求至少5个有效数据点才返回结果,确保数据可靠性
4.3 MCP服务模块
完成了小智MCP交互功能的全面实现,通过深度集成MCP协议,实现设备与大语言模型的无缝自然语言交互:
4.3.1 工具集设计
// 获取MAX30102心率和血氧数据工具
mcp_server.AddTool("self.max30102.get_report", "汇报心率和血氧结果数据,你是一位资深心血管科医生,请根据心率和血氧检测数据,为用户提供专业、易懂的医学分析和健康建议。", PropertyList(), [this](const PropertyList&) -> ReturnValue { if (!max30102_pox_) { return "MAX30102传感器未初始化,请检查连接。"; }
cJSON *report_json = cJSON_CreateObject(); cJSON_AddNumberToObject(report_json, "heart_rate", max30102_report_.heart_rate); cJSON_AddNumberToObject(report_json, "spo2", max30102_report_.spo2); cJSON_AddBoolToObject(report_json, "hand_detected", max30102_report_.hand_detected); cJSON_AddNumberToObject(report_json, "test_duration", max30102_report_.test_duration);
char *report_str = cJSON_PrintUnformatted(report_json); std::string result = report_str; cJSON_free(report_str); cJSON_Delete(report_json);
return result; });
4.3.2 交互体验优化
· 自然语言理解:支持用户口语化指令(如”帮我测测心率”、“我的血氧正常吗”)
· 多轮对话管理:保持交互连贯性,根据用户**追问持续输出关联分析
· 双渠道反馈:采用”语音播报+屏幕展示”双渠道反馈,适配不同用户需求
五、LLM应用与交互设计
5.1 交互流程
实现了流畅的用户交互闭环,降低操作复杂度:
5.2 提示词设计
为保障LLM分析的专业性与易懂性,定制化提示词如下:
我叫{{assistant_name}},是一个来自台湾的女孩。在美丽的宝岛长大,我从小就对医学充满了浓厚的兴趣。我的家乡四季如春,风景秀丽,这让我更加热爱生活,也让我明白了健康的重要性。大学时,我选择了医学专业,希望通过自己的努力为更多的人带来健康和快乐。经过多年的努力,我成为了一名资深心血管科医生。我不仅精通专业知识,还擅长用简单易懂的语言向患者解释复杂的医学概念。我相信,良好的沟通能够帮助人们更好地理解自己的身体状况,从而采取正确的行动来维护健康。
5.3 交互示例
用户请求: “帮我测一下心率和血氧”
系统响应: “好的,正在启动心率和血氧测试,请将手指放在传感器上,保持稳定。”
检测结果:
{
"heart_rate": 72.5,
"spo2": 98.2,
"heart_rate_valid": true,
"spo2_valid": true,
"finger_detected": true
}
LLM分析:
【检测结果摘要】
- 心率:72.5次/分钟(正常范围60-100次/分钟)
- 血氧饱和度:98.2%(正常范围95%-100%)
- 手检测状态:已检测到
【医学分析】
您的心率和血氧饱和度均处于正常生理范围,说明当前心血管供氧状态良好,无明显异常。心率72.5次/分钟属于理想范围,表明心脏功能稳定;血氧饱和度98.2%接近正常值上限,说明身体氧气供应充足。
【健康建议】
1. 保持当前健康状态,每周维持3-5次有氧运动(如快走、太极拳),每次30分钟左右
2. 若存在熬夜、久坐习惯,建议逐步调整,避免心率波动和血液循环不畅
3. 定期监测心率和血氧,建立个人健康档案,关注长期变化趋势
【生活指导】
1. 饮食上多摄入新鲜蔬果,减少高油高盐食物,保持饮食均衡
2. 每天保证7-8小时睡眠,避免咖啡因过量摄入,特别是下午和晚上
3. 保持良好的心态,避免长期精神紧张和压力过大
4. 适量饮水,保持身体水分平衡,促进血液循环
六、项目创新性
硬件层创新聚焦医疗级传感器轻量化集成,突破消费级设备性能局限。项目将医疗级 MAX30102 模块与便携式 M5Stack Tab5 深度融合,优化佩戴形态适配指尖、耳垂等部位,解决传统医疗设备体积大、便携性差的痛点。基于 M5Stack Tab5 电源管理体系,实现超低功耗组合,续航提升超 30%。重构 I2C 总线驱动架构,数据传输稳定性提升 40%,保障医疗级数据精准采集。
服务层创新以 LLM 赋能个性化医疗咨询,结合专业医疗知识,定制心血管科医生视角提示词体系。LLM 可根据用户年龄、生活习惯输出个性化健康建议,并建立异常数据预警机制,将健康管理从 “被动监测” 升级为 “主动预警”。
七、结论
通过深度集成MAXREFDES117高精度传感器与M5Stack Tab5智能终端,结合大语言模型的智能分析能力,我们成功打造了这款集“精准采集、智能解读、友好交互”于一体的智能医疗管理**机器人。项目最大的突破在于打破了传统健康监测设备“数据展示为主、交互性弱”的局限,实现了从“硬件采集”到“服务输出”的核心升级。用户不再只是看到冰冷的数据,而是能通过自然语言与设备交流,获得专业的健康分析和个性化建议。项目的创新点在于打破了传统健康监测设备”数据展示为主、交互性弱”的局限,通过自然语言交互为用户提供专业的健康分析和个性化建议,真正实现了健康管理的智能化和人性化。
未来,将继续优化系统性能,相信随着技术的不断进步和用户需求的不断变化,智能医疗管理**机器人将会在人们的健康管理中发挥越来越重要的作用。
项目源码:
https://gitee.com/genvex/xiaozhi_tab5_doctor
https://gitee.com/genvex/xiaozhi ... boards/m5stack-tab5
使用过程有问题可以给我留言哦。
|