基于Arduino的老人健康监测系统设计与实现

发布时间:2026/10/26 21:31:53
基于Arduino的老人健康监测系统设计与实现

1. 项目概述

这个基于Arduino的老人健康管理系统,是我去年为社区养老中心开发的一个实用型物联网项目。核心功能是通过ESP32主控芯片,配合DS18B20温度传感器和OLED显示屏,实时监测老人的体温和环境温湿度数据,并在异常时通过WiFi网络向家属或护理人员发送预警信息。

整套系统成本控制在200元以内,但实现了商业级健康监测设备80%的功能。特别适合独居老人或小型养老机构使用,操作简单、维护方便,即使没有技术背景的护理人员也能快速上手。

2. 硬件选型与核心组件解析

2.1 主控芯片:为什么选择ESP32?

ESP32-WROOM-32D模组是这个项目的核心大脑,选择它主要基于三个实际考量:

  1. 双核处理器性能足够处理传感器数据采集、OLED显示刷新和网络通信的并发需求
  2. 内置WiFi和蓝牙模块,省去了额外通信模组的成本和布线复杂度
  3. 超低功耗特性(深度睡眠模式下电流仅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屏主要考虑:

  1. 自发光特性,老年人无需背光也能清晰查看
  2. 超薄体积(仅3mm厚)便于嵌入式安装
  3. 支持大字库显示,我们特别优化了字体:
    • 体温数值使用24pt字体(约1cm高)
    • 状态信息使用16pt字体
    • 对比度设置为最大值(代码中设为0xCF)

3. 系统架构与核心功能实现

3.1 三层系统架构设计

整个系统采用典型的物联网三层架构:

  1. 感知层:DS18B20+ESP32内置霍尔传感器(用于跌倒检测)
  2. 网络层:ESP32 WiFi直连/蓝牙网关中转
  3. 应用层:自行开发的微信小程序+云端数据看板

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内置的加速度计实现跌倒检测时,我们发现三个关键参数需要调整:

  1. 加速度阈值从常规的2.5g调整为1.8g(老年人动作较缓慢)
  2. 静止判定时间从10秒延长至30秒(给老人足够时间起身)
  3. 增加手动解除按钮(防止误报)

4. 供电系统设计与低功耗优化

4.1 双电源方案实测对比

我们测试了三种供电方案:

方案成本续航充电便利性适用场景
18650锂电池25元72小时需专用充电器固定安装
5号电池x415元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
排查步骤:

  1. 检查4.7kΩ上拉电阻是否焊牢
  2. 线长控制在3米以内
  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显示残影

解决方法:

  1. 每2小时执行一次清屏刷新
  2. 避免静态内容长期显示
  3. 调整VCOMH电压至0.8V(代码设置0x20)

5.3 WiFi连接中断

我们总结的稳定连接技巧:

  1. 在setup()中添加WiFi.setSleep(false)禁用节能模式
  2. 使用WiFi.setTxPower(WIFI_POWER_19_5dBm)增强信号
  3. 添加自动重连机制:
void checkWiFi() { static unsigned long lastCheck = 0; if(millis() - lastCheck > 60000) { if(WiFi.status() != WL_CONNECTED) { WiFi.reconnect(); } lastCheck = millis(); } }

6. 项目优化方向

在实际部署中,我们发现几个值得改进的方面:

  1. 多参数监测扩展:增加MAX30102模块实现血氧监测(需注意采样率对功耗的影响)
  2. 本地语音提示:用DFPlayer Mini添加语音预警(测试发现老年人对语音提示响应更快)
  3. 防拆设计:在3D打印外壳内添加簧片开关,防止老人误拆设备

这个项目最让我意外的收获是:许多老人反而对科技产品接受度很高,有位80岁的爷爷甚至学会了通过微信查看自己的健康数据。这提醒我们,适老化设计不是简单地把字体放大,而是要真正理解老年用户的实际需求和使用场景。