这个项目是我去年为社区养老服务中心开发的一套老人健康监测与定位系统。核心思路是利用STM32F103ZET6单片机作为主控,通过SIM800C模块实现数据远程传输,再配合各类传感器实现对老人心率、体温、位置等关键健康指标的实时监测。
在实际部署中,这套系统最大的价值在于:当老人突发身体不适或走失时,能够第一时间通过短信和GPS定位通知家属和社区工作人员。相比市面上动辄上千元的商业产品,我们这套方案成本控制在300元以内,而且完全自主可控,可以根据不同老人的需求灵活调整监测参数。
选用STM32F103ZET6主要基于三点考虑:
注意:采购时要认准正品,市场上流通的翻新片容易导致系统不稳定。我一般通过立创商城等正规渠道购买。
SIM800C模块的选择经历了三次迭代:
实测发现,在城市环境下GPS定位精度约15米,足够满足老人定位需求。
根据三个月实地测试,最终确定的传感器配置如下:
| 传感器类型 | 型号 | 采样频率 | 接口方式 | 备注 |
|---|---|---|---|---|
| 心率 | MAX30102 | 1Hz | I2C | 需做滤波处理 |
| 体温 | DS18B20 | 0.2Hz | 单总线 | 防水封装版 |
| 跌倒检测 | MPU6050 | 10Hz | I2C | 需算法识别 |
| 紧急按钮 | 机械按键 | 事件触发 | GPIO | 红色醒目设计 |
系统采用3.7V/2000mAh锂电池供电,通过TPS5430降压到3.3V。关键设计细节:
原理图片段:
c复制// 电源部分电路示意
VBAT -> TPS5430 -> 3.3V主电源
│
└─ LC滤波 -> SIM800C_VCC
经过五次改版总结的布局原则:
血泪教训:第一版没做阻抗匹配,导致GPS定位经常漂移。后来在RF走线添加了π型匹配网络才解决。
采用前后台系统架构:
基于MPU6050数据的识别流程:
c复制// 简化版跌倒检测代码
void Fall_Detection(float ax, float ay, float az) {
static uint32_t fall_timer = 0;
float acc = sqrt(ax*ax + ay*ay + az*az);
if(acc > 2.5) {
if(HAL_GetTick() - fall_timer > 200) {
Send_Alert(SMS_FALL_ALERT);
}
} else {
fall_timer = HAL_GetTick();
}
}
通过MAX30102获取的PPG信号计算HRV:
实测发现,当SDNN<50ms时需要特别关注老人状态。
自定义的轻量级传输协议格式:
| 字节 | 内容 | 说明 |
|---|---|---|
| 0 | 0xAA | 帧头 |
| 1 | 数据类型 | 0x01:心率 0x02:位置 |
| 2-5 | 数据内容 | 大端格式 |
| 6 | 校验和 | 异或校验 |
短信报警内容模板:
"[警报]李XX老人于{时间}在{位置}发生{事件},当前心率{HR}bpm,体温{TEMP}°C"
尝试过三种佩戴方式后,最终确定:
移动/联通/电信三家运营商的APN设置:
关键发现:在郊区部署时,联通信号稳定性最好。城市中心则三家差异不大。
通过以下措施将待机功耗从25mA降到8mA:
可能原因及解决方案:
典型错误处理流程:
数据校验机制:
经过半年实际运行,下一步计划:
这个项目最让我意外的是老人们对新技术的接受度。很多七八十岁的老人现在会主动查看自己的健康数据,有位张阿姨甚至通过心率变化发现自己早期房颤,及时就医避免了中风风险。技术真正的价值,或许就体现在这些细微之处。