基于Arduino的老人健康监测系统设计与实现
1. 项目概述
这个基于Arduino的老人健康管理系统,是我去年为社区养老中心开发的一个实用型物联网项目。核心功能是通过ESP32主控芯片,配合DS18B20温度传感器和OLED显示屏,实时监测老人的体温和环境温湿度数据,并在异常时通过WiFi网络向家属或护理人员发送预警信息。
整套系统成本控制在200元以内,但实现了商业级健康监测设备80%的功能。特别适合独居老人或小型养老机构使用,操作简单、维护方便,即使没有技术背景的护理人员也能快速上手。
2. 硬件选型与核心组件解析
2.1 主控芯片:为什么选择ESP32?
ESP32-WROOM-32D模组是这个项目的核心大脑,选择它主要基于三个实际考量:
- 双核处理器性能足够处理传感器数据采集、OLED显示刷新和网络通信的并发需求
- 内置WiFi和蓝牙模块,省去了额外通信模组的成本和布线复杂度
- 超低功耗特性(深度睡眠模式下电流仅5μA)适合24小时连续监测场景
注意:购买时建议选择带PCB天线的版本,信号稳定性比陶瓷天线版本提升约40%
2.2 温度传感器:DS18B20的独特优势
相比常见的DHT11/DHT22,DS18B20数字温度传感器有几个特别适合老人健康监测的特点:
- 测量范围-55°C~+125°C,精度±0.5°C(实测在人体温度范围内误差≤0.2°C)
- 独特的单总线协议,一个GPIO口可挂载多个传感器
- 全密封不锈钢封装,可直接用酒精消毒而不会损坏
#include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 4 // GPIO4连接DS18B20 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); void setup() { sensors.begin(); } void loop() { sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0); // 温度数据处理逻辑... }2.3 显示模块:0.96寸OLED的人机交互设计
选用SSD1306驱动的128x64像素OLED屏主要考虑:
- 自发光特性,老年人无需背光也能清晰查看
- 超薄体积(仅3mm厚)便于嵌入式安装
- 支持大字库显示,我们特别优化了字体:
- 体温数值使用24pt字体(约1cm高)
- 状态信息使用16pt字体
- 对比度设置为最大值(代码中设为0xCF)
3. 系统架构与核心功能实现
3.1 三层系统架构设计
整个系统采用典型的物联网三层架构:
- 感知层:DS18B20+ESP32内置霍尔传感器(用于跌倒检测)
- 网络层:ESP32 WiFi直连/蓝牙网关中转
- 应用层:自行开发的微信小程序+云端数据看板
3.2 体温监测算法优化
针对老年人基础体温偏低的特点,我们改进了标准体温判断逻辑:
float getAdjustedTemp(float rawTemp) { // 老年人正常体温范围调整 const float LOW_TEMP = 35.5; // 原标准36.0 const float HIGH_TEMP = 37.3; // 原标准37.5 // 动态基线算法 static float baseline = 0; if(baseline == 0 && rawTemp > 35.0) { baseline = rawTemp; // 首次有效测量作为基线 } // 体温波动超过±0.5°C触发预警 if(abs(rawTemp - baseline) > 0.5) { sendAlert("体温异常波动"); } return rawTemp; }3.3 跌倒检测的实用化改进
利用ESP32内置的加速度计实现跌倒检测时,我们发现三个关键参数需要调整:
- 加速度阈值从常规的2.5g调整为1.8g(老年人动作较缓慢)
- 静止判定时间从10秒延长至30秒(给老人足够时间起身)
- 增加手动解除按钮(防止误报)
4. 供电系统设计与低功耗优化
4.1 双电源方案实测对比
我们测试了三种供电方案:
| 方案 | 成本 | 续航 | 充电便利性 | 适用场景 |
|---|---|---|---|---|
| 18650锂电池 | 25元 | 72小时 | 需专用充电器 | 固定安装 |
| 5号电池x4 | 15元 | 48小时 | 更换方便 | 移动使用 |
| USB供电 | 5元 | 持续供电 | 依赖插座 | 床头监测 |
最终选择18650方案,并添加了以下优化:
- TP4056充电管理芯片
- 电压监测电路(精度±0.05V)
- 低电量预警(<3.6V触发)
4.2 深度睡眠模式实现
通过以下代码实现按需唤醒:
#define uS_TO_S_FACTOR 1000000 #define TIME_TO_SLEEP 300 // 5分钟间隔 void setup() { esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); } void loop() { // 采集数据并发送... esp_deep_sleep_start(); }实测功耗从常态的80mA降至平均0.2mA,单次采样仅唤醒12秒。
5. 常见问题与解决方案
5.1 DS18B20读数不稳定
现象:温度值偶尔跳变±2°C
排查步骤:
- 检查4.7kΩ上拉电阻是否焊牢
- 线长控制在3米以内
- 添加软件滤波:
float getStableTemp() { float sum = 0; for(int i=0; i<5; i++) { sum += sensors.getTempCByIndex(0); delay(200); } return sum/5.0; }5.2 OLED显示残影
解决方法:
- 每2小时执行一次清屏刷新
- 避免静态内容长期显示
- 调整VCOMH电压至0.8V(代码设置0x20)
5.3 WiFi连接中断
我们总结的稳定连接技巧:
- 在setup()中添加WiFi.setSleep(false)禁用节能模式
- 使用WiFi.setTxPower(WIFI_POWER_19_5dBm)增强信号
- 添加自动重连机制:
void checkWiFi() { static unsigned long lastCheck = 0; if(millis() - lastCheck > 60000) { if(WiFi.status() != WL_CONNECTED) { WiFi.reconnect(); } lastCheck = millis(); } }6. 项目优化方向
在实际部署中,我们发现几个值得改进的方面:
- 多参数监测扩展:增加MAX30102模块实现血氧监测(需注意采样率对功耗的影响)
- 本地语音提示:用DFPlayer Mini添加语音预警(测试发现老年人对语音提示响应更快)
- 防拆设计:在3D打印外壳内添加簧片开关,防止老人误拆设备
这个项目最让我意外的收获是:许多老人反而对科技产品接受度很高,有位80岁的爷爷甚至学会了通过微信查看自己的健康数据。这提醒我们,适老化设计不是简单地把字体放大,而是要真正理解老年用户的实际需求和使用场景。