1. 项目概述:居家老人健康监测系统设计全解析
这个基于STM32的居家老人健康监测系统,是我在嵌入式医疗设备领域的一次重要实践。随着社会老龄化加剧,独居老人的安全问题日益凸显。传统监护方式存在响应滞后、监测不全面等问题,而商业化的健康监测设备往往价格昂贵且功能单一。这个项目正是为了解决这些痛点而生。
系统以STM32F103C8T6为主控芯片,集成了MAX30102心率血氧传感器、DS18B20温度传感器、水银开关跌倒检测模块等核心部件。通过ESP8266 WiFi模块实现数据上传,配合自主开发的手机APP,实现了老人生命体征的实时监测和异常报警功能。整个系统成本控制在200元以内,却实现了市售数千元设备的核心功能。
2. 硬件设计与选型
2.1 主控芯片选型:为什么选择STM32F103?
在项目初期,我对比了51单片机和STM32两种方案。虽然51单片机价格更低(约5-10元),但其性能局限明显:
- 仅8位架构,主频最高24MHz
- 内存资源有限(通常4KB RAM)
- 外设接口较少
最终选择的STM32F103C8T6具有明显优势:
- 32位Cortex-M3内核,72MHz主频
- 64KB Flash + 20KB SRAM
- 丰富的外设接口(3个USART、2个SPI、2个I2C)
- 内置12位ADC,适合传感器数据采集
- 价格适中(约15-20元)
提示:STM32的GPIO需要特别注意配置模式,传感器接口建议设置为推挽输出或浮空输入,避免信号干扰。
2.2 传感器模块详解
2.2.1 MAX30102心率血氧模块
这个集成式传感器采用PPG(光电容积描记)技术,通过红外(880nm)和红光(660nm)LED照射皮肤,检测血液流动引起的光吸收变化。关键参数:
- 采样率:50-3200Hz可调
- 电流消耗:0.7mA@50Hz
- 通信接口:I2C(地址0x57)
实际使用中发现,手指贴合度对测量精度影响很大。我们通过3D打印了一个指套固定装置,确保传感器与皮肤紧密接触。
2.2.2 DS18B20温度传感器
选用这款数字温度传感器因其:
- 测量范围:-55°C ~ +125°C
- 精度:±0.5°C
- 单总线接口,节省IO资源
- 防水封装,适合体表测量
注意:单总线时序要求严格,建议使用STM32硬件定时器实现延时。
2.2.3 跌倒检测方案比较
测试了三种跌倒检测方案:
- 加速度传感器(MPU6050):算法复杂,误报率高
- 摄像头识别:隐私问题,成本高
- 水银开关:成本低(<2元),响应快
最终选择水银开关,其特性:
- 倾斜角度>60°时触发
- 响应时间<10ms
- 通过GPIO中断检测状态变化
3. 系统软件设计
3.1 软件架构设计
系统采用分层架构:
code复制应用层:报警处理、数据显示
业务层:数据分析、阈值判断
驱动层:传感器驱动、通信协议
硬件层:STM32外设控制
3.2 关键算法实现
3.2.1 心率计算算法
原始PPG信号包含大量噪声,处理流程:
- 直流滤波:去除基线漂移
- 带通滤波(0.5-5Hz):去除运动伪影
- 峰值检测:寻找脉搏波峰
- RR间期计算:60/RR间期=心率值
c复制// 伪代码示例
float calculateHR(float* ppgData, int size) {
float filtered[size];
bandpassFilter(ppgData, filtered, size, 0.5, 5.0);
int peaks[20];
int peakCount = findPeaks(filtered, size, peaks);
float sumRR = 0;
for(int i=1; i<peakCount; i++) {
sumRR += (peaks[i]-peaks[i-1])*SAMPLE_INTERVAL;
}
return 60.0 * (peakCount-1) / sumRR;
}
3.2.2 跌倒检测算法
水银开关状态变化触发中断后:
- 启动200ms去抖动延时
- 检查状态是否持续为触发状态
- 蜂鸣器本地报警
- 通过WiFi发送报警信息
3.3 WiFi通信实现
ESP8266配置要点:
- 工作模式:STA+AP混合模式
- 通信协议:TCP长连接
- 数据格式:JSON封装
json复制{
"device_id": "ELDER_001",
"timestamp": 1625097600,
"hr": 75,
"spo2": 98,
"temp": 36.5,
"fall": 0
}
实测发现,在信号较弱区域,需要加入以下机制:
- 数据缓存(最多100条)
- 自动重连(间隔5秒)
- 信号强度检测(RSSI<-80dBm时预警)
4. 系统集成与测试
4.1 PCB设计注意事项
使用Altium Designer设计四层板:
- 顶层:信号线+元件
- 内层1:GND平面
- 内层2:3.3V电源平面
- 底层:低速信号
布局要点:
- 模拟部分(传感器)与数字部分(MCU)分区
- WiFi天线周围留出净空区
- 电源走线宽度≥20mil
4.2 测试数据对比
测试10位老年人(年龄65-82岁)的监测数据:
| 参数 | 本系统 | 医疗设备 | 误差 |
|---|---|---|---|
| 心率 | 78bpm | 76bpm | ±2bpm |
| 血氧 | 97% | 98% | ±1% |
| 体温 | 36.4°C | 36.6°C | ±0.2°C |
| 跌倒检测 | 98% | - | 2%误报 |
4.3 功耗优化
通过以下措施将待机功耗从85mA降至12mA:
- 传感器轮询间隔从1s调整为5s
- STM32进入STOP模式(保留RAM)
- 关闭未使用的外设时钟
- 降低WiFi发射功率(从20dBm降至10dBm)
5. 常见问题与解决方案
5.1 传感器数据异常
现象:心率值突然变为0或异常高
排查:
- 检查I2C通信是否正常(逻辑分析仪抓包)
- 确认手指接触良好
- 检查电源电压(需稳定3.3V±5%)
5.2 WiFi频繁断开
解决方案:
- 在代码中加入看门狗机制
c复制// WiFi看门狗示例
void WiFi_Watchdog_Init() {
hw_timer_t *timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &WiFi_Check, true);
timerAlarmWrite(timer, 1000000, true); // 1s周期
timerAlarmEnable(timer);
}
- 优化天线设计:采用倒F型PCB天线
- 设置AP信号强度阈值(连接RSSI>-70dBm的AP)
5.3 电源管理问题
现象:电池供电时系统不稳定
改进措施:
- 增加1000μF储能电容
- 使用TPS63020升降压芯片(效率>90%)
- 锂电池保护电路(DW01+8205方案)
6. 项目扩展与优化方向
在实际部署中,我发现系统还可以从以下几个方向进行优化:
-
多模态跌倒检测:结合加速度传感器与水银开关,通过机器学习算法(如SVM)提高检测准确率。测试表明,这种组合可以将误报率降至0.5%以下。
-
边缘计算:在STM32上实现简单的异常检测算法(如基于阈值的判断),减少云端依赖。例如,当连续3次心率测量值超过阈值(如>120bpm或<50bpm)时才上传数据。
-
低功耗优化:采用STM32L4系列芯片,配合传感器智能唤醒功能,可使系统续航从3天延长至2周。关键配置:
- 关闭所有未使用的外设时钟
- 进入STOP2模式(1.4μA)
- 传感器采用中断唤醒
-
家庭网关集成:将系统与智能家居平台(如Home Assistant)对接,实现:
- 异常自动开灯
- 紧急呼叫联动
- 用药提醒功能
这个项目从构思到实现历时4个月,期间经历了多次方案迭代和优化。最大的收获是认识到嵌入式系统开发中"细节决定成败"——一个看似微小的电源滤波电容或软件延时设置,都可能影响整个系统的稳定性。建议后来者在类似项目中,务必重视以下几点:
- 预留足够的调试接口(SWD、串口等)
- 建立完善的数据日志系统
- 进行长时间老化测试(至少72小时连续运行)
- 准备多个硬件备件,避免单个器件故障影响进度