1. 项目概述
这个智能健康监测器项目是我去年为一个社区养老机构开发的低成本健康监测解决方案。当时他们需要一种能够实时监测老人基础健康指标,又不需要专业医护人员操作的设备。基于这个需求,我选择了STM32F103C8T6这款性价比极高的单片机作为核心控制器,搭配常见的传感器模块,最终实现了体温、心率和血氧三项基础指标的采集与异常报警功能。
整套设备硬件成本控制在200元以内,体积只有烟盒大小,老人可以随身佩戴。数据通过蓝牙传输到护理站的中央显示屏,当任何指标超出阈值时,系统会自动发出声光报警。经过三个月的实际使用测试,设备的日均误报率低于0.5%,完全满足了社区养老的使用需求。
2. 硬件设计与选型
2.1 核心控制器选择
在控制器选型上,我对比了三款主流单片机:
- STM32F103C8T6(72MHz Cortex-M3)
- ESP32-WROOM-32(双核240MHz)
- Arduino Nano(16MHz ATmega328P)
最终选择STM32主要基于三点考虑:
- 处理性能足够(比Arduino强,虽不及ESP32但更稳定)
- 丰富的外设接口(3个USART、2个SPI、2个I2C)
- 低功耗模式下的电流仅2μA
实际测试中,STM32在同时处理三个传感器数据时CPU占用率约65%,完全满足实时性要求。而ESP32虽然性能更强,但其WiFi模块在本项目中用不上,反而增加了30%的功耗。
2.2 传感器模块配置
传感器选型遵循"医疗级精度,消费级价格"原则:
体温监测:
- 选用MLX90614非接触红外传感器
- 测量范围:-70°C~380°C
- 人体模式精度:±0.2°C
- I2C接口,3.3V供电
心率血氧监测:
- MAX30102集成模块
- 采用光电体积描记法(PPG)
- 采样率可调(50~3200Hz)
- 自带环境光消除算法
特别注意:MAX30102的LED驱动电流需要根据使用者肤色调整。我在代码中预设了三种模式:
- 浅肤色:50mA
- 中等肤色:100mA
- 深肤色:150mA
2.3 电源管理设计
采用TP4056充电管理芯片+3.7V 1000mAh锂电池方案:
- 待机电流:2.1mA(STM32睡眠模式)
- 工作电流:28mA(传感器全开)
- 续航时间:约36小时
- 充电时间:2小时(1A充电电流)
为降低功耗,我设计了运动唤醒功能:
- 使用LIS3DH三轴加速度计
- 设置0.5g阈值唤醒
- 静止5分钟后自动进入睡眠
3. 软件系统实现
3.1 主程序流程图
c复制void main() {
hardware_init();
while(1) {
if(motion_detected()) {
wakeup_sensors();
read_temp();
read_hr_spo2();
process_data();
if(abnormal_check()) {
trigger_alarm();
}
send_bluetooth();
if(stationary_time > 5min) {
enter_sleep();
}
}
}
}
3.2 关键算法实现
心率计算算法:
- 原始信号经过带通滤波(0.5Hz-5Hz)
- 使用移动平均法消除基线漂移
- 峰值检测采用动态阈值法:
- 阈值 = 前5个峰值的平均值 × 0.8
- 最小峰间隔 = 200ms(对应300bpm)
血氧计算公式:
code复制SpO2 = 110 - 25 × (AC_red/DC_red) / (AC_ir/DC_ir)
其中:
- AC_red:红光交流分量
- DC_red:红光直流分量
- AC_ir:红外光交流分量
- DC_ir:红外光直流分量
3.3 蓝牙数据传输协议
自定义了精简协议帧结构:
| 字节 | 内容 | 说明 |
|---|---|---|
| 0 | 0xA5 | 帧头 |
| 1 | 0x01 | 设备ID |
| 2-3 | 体温 | 单位0.1℃ (如365=36.5℃) |
| 4 | 心率 | 单位bpm |
| 5 | 血氧 | 单位% |
| 6 | 校验和 | 前6字节异或值 |
实测在10米距离内,传输成功率可达99.2%。为提高可靠性,我设置了三次重传机制。
4. 实际应用优化
4.1 佩戴方式改进
初期测试发现两个问题:
- 耳夹式佩戴导致老年人不适
- 手腕佩戴受运动干扰大
最终解决方案:
- 改用指套式设计
- 增加硅胶防滑纹
- 绑带采用魔术贴调节
4.2 环境干扰处理
在养老院实际部署时遇到:
- 日光灯导致红外传感器误触发
- 电动轮椅产生电磁干扰
对应解决方案:
- 在MLX90614前增加850nm滤光片
- 为I2C总线添加磁珠滤波
- 软件上增加异常值剔除算法:
c复制if(abs(new_temp - last_temp) > 2.0) { discard_sample(); }
4.3 校准流程简化
为方便护工操作,我设计了傻瓜式校准:
- 长按按键3秒进入校准模式
- 将设备连接标准血氧模拟器
- 自动完成三点校准(70%、85%、99%)
- 校准数据存入Flash
5. 常见问题排查
以下是实际部署中遇到的典型问题及解决方法:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 血氧显示"---" | 手指未完全覆盖传感器 | 调整佩戴位置 |
| 心率数据跳动大 | 运动伪影干扰 | 保持静止15秒后重新测量 |
| 蓝牙频繁断开 | 周围WiFi干扰 | 修改蓝牙频道(11→20) |
| 体温读数偏低 | 传感器表面有污渍 | 用酒精棉片清洁传感器窗口 |
| 设备无法开机 | 电池过放保护 | 充电10分钟后再尝试 |
6. 项目升级方向
目前正在开发第二代产品,主要改进:
- 增加跌倒检测功能(基于六轴加速度计算法)
- 采用太阳能辅助充电
- 添加LoRa远距离传输模块
- 开发微信小程序数据查看界面
一个实用的技巧:在PCB布局时,将MAX30102的LED驱动电路远离MCU的晶振区域,可以降低约30%的信号噪声。我在第四版设计中通过调整布局,使血氧测量精度从±2%提升到了±1.5%。