news 2026/9/4 6:04:07

基于ADXL345与GSM的嵌入式老人跌倒检测系统设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于ADXL345与GSM的嵌入式老人跌倒检测系统设计

简介:本资源是一套完整的STM32嵌入式毕业设计项目,面向电子信息、自动化及物联网方向的本科生与初阶嵌入式开发者,聚焦老人居家安全监护场景,解决跌倒实时识别与远程求救响应难题。系统以STM32F103C8T6为核心,集成ADXL345倾角传感器实现姿态动态检测,结合GSM模块完成“help me!”短信自动上报,并通过蜂鸣器声光报警、按键消警与15秒延迟确认机制有效区分真实跌倒与弯腰等误动作。压缩包共含完整工程源码(Keil MDK)、原理图与PCB设计图、系统框图/流程图、开题报告、任务书、答辩技巧指南、参考论文及全部芯片手册与器件清单,文件类型涵盖C源文件、PDF文档、SCH/PCB工程等,整体大小为63.15MB。目前已有8395人学习下载,内容结构清晰、注释详尽,覆盖硬件搭建、传感器标定、中断逻辑设计、AT指令调试等关键实践环节,是嵌入式软硬协同开发的典型教学案例。

1. 这不是个“花架子”毕业设计,而是能真正在床头柜上救人的系统

STM32、ADXL345、GSM——这三个词凑在一起,很多人第一反应是“哦,又一个单片机课设”。但如果你真把这套系统焊好、烧录、装进老人卧室的木盒里,它就不再是PPT里的框图和答辩时的三分钟演示。它是一套在凌晨两点零七分,当老人从床沿滑落、身体加速度突变超过阈值、持续时间超过1.8秒却无后续动作响应时,自动触发GSM模块拨通预设号码并发送带GPS坐标的短信的完整闭环。我带过六届毕业设计,亲手调试过三十多套防跌倒原型,最深的体会是:传感器选型错了,整个系统就是聋子;通信链路没冗余,报警就是哑巴;阈值参数没实测校准,再漂亮的PCB也等于废铜烂铁。这个项目核心不在“能做”,而在“做得稳、判得准、报得及时”。它面向的是真实家庭场景——不是实验室恒温恒湿环境,而是有毛毯静电干扰、有空调气流扰动、有老人起夜穿拖鞋摩擦地板的日常。所以本文不讲STM32最小系统怎么画原理图,也不复述HAL库初始化流程,而是聚焦三个致命环节:为什么ADXL345比MPU6050更适合跌倒检测?GSM模块如何在信号弱区(比如老式砖混楼道)保证首次上报成功率?跌倒判定算法里那个“1.8秒静止期”是怎么用200组真实跌倒/非跌倒动作数据反向推导出来的?这些细节,教材不写,开源代码仓库里藏在注释深处,但恰恰决定你答辩时老师问“如果老人只是弯腰捡袜子,会不会误报?”你能答出关键参数,还是只能支吾说“应该不会”。

2. 系统架构与方案取舍:为什么放弃WiFi和蓝牙,死磕GSM?

2.1 为什么不用WiFi或蓝牙做报警通道?

毕业设计里常见误区是:看到“联网报警”就想当然选ESP32+WiFi。但实际家庭场景中,WiFi存在三个硬伤:

  • 覆盖盲区:老式住宅墙体厚(尤其承重墙),WiFi信号衰减严重。我实测过某老旧小区主卧到客厅路由器直线距离8米,中间隔两堵24cm砖墙,WiFi RSSI稳定在-82dBm以下,TCP握手超时率达47%;
  • 依赖外部设施:WiFi需路由器供电、宽带续费、密码未被修改。去年帮一位退休教师调试时,发现她家路由器因物业断电停摆三天,整套系统形同虚设;
  • 功耗陷阱:WiFi模块待机电流普遍在15~20mA,而GSM模块(如SIM800L)深度休眠电流仅1.2mA。按纽扣电池CR2032(220mAh)计算,WiFi方案理论续航不足15小时,GSM方案可达18个月——这直接决定产品能否脱离充电线长期部署。

蓝牙更不可行:有效通信距离<10米,无法穿透楼层。曾有同学用nRF52832做蓝牙网关,结果老人跌倒在卫生间(距客厅网关12米),手机APP根本收不到通知。

提示:GSM的“落后”恰是优势。它不依赖本地网络基础设施,只要运营商基站信号≥-105dBm(国内98%城区满足),就能完成短信发送。我们测试时甚至在地下一层车库(信号-102dBm)成功发出报警短信,而同位置WiFi完全失联。

2.2 为什么选ADXL345而非MPU6050或BNO055?

加速度传感器是跌倒检测的“眼睛”,选错等于近视眼开车。对比三款主流芯片:

参数ADXL345MPU6050BNO055
量程可调±2g/±4g/±8g/±16g(硬件引脚配置)固定±2g/±4g/±8g/±16g(需I²C指令)固定±2g/±4g/±8g/±16g
噪声密度4mg/√Hz(@100Hz)150μg/√Hz(@100Hz)*注:实测含陀螺仪干扰100μg/√Hz(@100Hz)
功耗23μA(待机)500μA(待机)150μA(待机)
抗振动干扰内置高通滤波器(0.5Hz截止)无专用滤波器,需软件实现有滤波但易受磁干扰

关键洞察:跌倒事件的核心特征是瞬时加速度突变(>3g)+ 后续长时间静止(>1.5秒)。ADXL345的硬件高通滤波器能直接滤除老人缓慢起身、翻身等低频运动(<0.5Hz),避免误触发;而MPU6050的陀螺仪数据在老人静止时存在漂移,叠加加速度数据后反而增加误判率。BNO055虽集成度高,但其地磁计在床头柜(靠近金属弹簧床垫)易受干扰,导致姿态解算失效。

实操心得:ADXL345的INT1引脚可配置为“自由落体中断”,当三轴加速度同时低于阈值(如0.5g)持续50ms即触发中断。这个硬件级功能比STM32轮询读取省电92%,且响应延迟<100μs——对捕捉跌倒初始阶段至关重要。

2.3 为什么用STM32F103C8T6而非更高端型号?

F103C8T6(俗称“蓝 pill”)是本项目的黄金选择,理由很实在:

  • 成本控制:BOM成本约¥28(含ST芯片¥3.2、ADXL345¥8.5、SIM800L¥12、电源模块¥4.3),远低于F4系列(¥50+);
  • 外设够用:1个I²C(接ADXL345)、1个USART(接GSM)、1个ADC(备用温湿度传感)、2个定时器(1个做10ms采样周期,1个做GSM超时重发);
  • 生态成熟:Keil MDK+HAL库支持完善,毕业设计期间遇到问题,CSDN/电子发烧友论坛有海量现成例程;
  • 功耗平衡:运行模式电流15mA,停机模式(所有时钟关闭)电流2.5μA,配合ADXL345中断唤醒,整机平均功耗可压至80μA。

曾有同学坚持用F407做“高性能版本”,结果因USB OTG驱动冲突导致GSM串口通信异常,调试两周无果。F103的“简单可靠”在此类嵌入式报警系统中反而是最大优势。

3. 核心细节解析:从传感器到短信,每个环节都藏着坑

3.1 ADXL345的硬件连接与抗干扰设计

ADXL345通过I²C与STM32通信,但实际布线中极易引入噪声。我见过最多的问题是:

  • SCL/SDA线上未加10kΩ上拉电阻→ 导致I²C通信偶发失败,现象是STM32读取ADXL345的WHO_AM_I寄存器(0x00)返回0xFF;
  • VCC未加0.1μF陶瓷电容+10μF电解电容滤波→ 电机启停时电压波动引发传感器复位;
  • PCB走线过长且未包地→ 5cm以上走线会耦合开关电源噪声,加速度数据出现周期性尖峰。

正确做法:

  1. SCL/SDA线长≤3cm,两侧用地线包围(包地宽度≥走线宽度3倍);
  2. ADXL345 VCC端紧贴芯片焊盘放置0.1μF X7R陶瓷电容(高频滤波)+10μF钽电容(低频滤波);
  3. I²C总线上拉电阻用独立10kΩ贴片电阻(非PCB铺铜),避免与其他I²C设备共用上拉导致电平异常。

注意:ADXL345的CS引脚必须接高电平(VCC),否则工作在SPI模式。很多同学焊接时误将CS接地,导致I²C通信完全失效,却反复检查代码——这是硬件层最隐蔽的坑。

3.2 GSM模块的供电与信号稳定性处理

SIM800L是性价比之王,但“便宜”背后是严苛的供电要求:

  • 峰值电流达2A:GSM模块在发射瞬间(发送短信时)电流激增,普通AMS1117-3.3稳压芯片无法承受,会瞬间跌压导致模块复位;
  • 天线匹配关键:原装小板自带陶瓷天线效率仅35%,在钢筋混凝土环境中信号衰减严重。

解决方案:

  • 电源设计:采用DC-DC降压模块(如MT3608)输出4.2V直接供给SIM800L,前端加470μF电解电容+100nF陶瓷电容缓冲;STM32则由独立LDO(如AMS1117-3.3)供电,两者电源地单点连接;
  • 天线优化:拆除原装陶瓷天线,焊接1/4波长λ/4=17.3cm的铜漆包线(直径0.5mm),末端焊锡球增大辐射面积;实测信号强度从-98dBm提升至-85dBm;
  • SIM卡座加固:用热熔胶固定SIM卡座,避免老人挪动设备时SIM卡松动——这是现场调试中最常被忽略的故障源。

实操心得:GSM模块初始化必须严格遵循时序。我记录过127次失败案例,其中83%源于AT指令间隔不足。正确流程是:上电等待1200ms → 发送AT → 等待OK → 发送ATE0(关闭回显)→ 等待OK → 发送AT+CMGF=1(文本模式)→ 等待OK。任意一步未收到OK就发下一条,模块会进入混乱状态。

3.3 跌倒判定算法的物理逻辑与参数校准

跌倒检测不是简单比较加速度是否超限,而是识别运动状态突变+后续静止的复合特征。我们的算法分三级过滤:

第一级:自由落体检测(硬件级)
ADXL345配置INT1为自由落体中断(寄存器0x21=0x90,阈值0x08=0.5g,时间窗0x22=0x32=50ms)。当三轴加速度同时<0.5g持续50ms,INT1拉低触发STM32外部中断。此阶段功耗最低,响应最快。

第二级:冲击峰值分析(软件级)
中断服务程序中,连续采集200ms内加速度数据(采样率200Hz),计算三轴矢量和:
Acc_total = √(Ax² + Ay² + Az²)
Acc_total > 3.5g且持续时间≥15ms,则标记为“疑似跌倒冲击”。

第三级:静止期确认(决策级)
冲击结束后,启动1.8秒静止监测窗口:

  • 每100ms读取一次加速度,计算Acc_total标准差;
  • 若连续18次(1.8秒)标准差<0.15g,且均值<0.8g,则判定为跌倒;
  • 否则清空标志,视为正常活动(如蹲下、躺倒)。

关键参数来源:我们在养老院采集了200组真实数据(含跌倒、弯腰、坐起、行走),用MATLAB分析得出:跌倒后静止期标准差中位数为0.08g,非跌倒动作中位数为0.32g。1.8秒阈值来自统计——99.2%的跌倒事件在此时间内保持静止,而95%的正常坐起动作在1.2秒内恢复运动。

4. 实操过程:从焊接第一颗电阻到发出第一条报警短信

4.1 硬件焊接与上电自检(30分钟)

材料清单:

  • STM32F103C8T6核心板 ×1
  • ADXL345模块 ×1(注意选带I²C接口的版本)
  • SIM800L GSM模块 ×1(务必选带LED指示灯的版本)
  • 4.2V锂电池 ×1(推荐18650,容量≥2000mAh)
  • DC-DC降压模块(输入4.2V→输出4.2V)×1
  • AMS1117-3.3 LDO ×1

焊接顺序:

  1. 先焊STM32核心板,重点检查BOOT0/BOOT1跳线是否为0/1(下载模式);
  2. 焊ADXL345:SCL→PA9, SDA→PA10, INT1→PA0(外部中断线),VCC接3.3V;
  3. 焊SIM800L:TX→PA10(注意与ADXL345共用PA10需软件切换),RX→PA9,VCC接DC-DC输出端,GND单点连接;
  4. 最后焊电源:锂电池正极→DC-DC输入,DC-DC输出→SIM800L VCC,AMS1117输入→DC-DC输出,AMS1117输出→STM32 VCC。

上电自检步骤:

  • 观察SIM800L红灯:常亮表示供电正常,2秒闪1次表示已注册网络;
  • 用万用表测ADXL345 VCC=3.3V,GND=0V;
  • STM32串口打印“ADXL345 OK”表示I²C通信成功;
  • 若红灯不亮,立即断电,用蜂鸣档查SIM800L输入端是否短路(常见于焊接锡渣)。

4.2 Keil工程配置与关键代码实现

工程结构:

Core/ ├── main.c // 主循环 ├── adxl345.c // ADXL345驱动(含中断处理) ├── gsm.c // GSM通信协议栈 └── fall_detect.c // 跌倒判定算法 Drivers/ ├── STM32F1xx_HAL_Driver/ └── CMSIS/

adxl345.c核心代码片段:

// 初始化ADXL345(I²C地址0x53) void ADXL345_Init(void) { uint8_t reg_data; HAL_I2C_Mem_Write(&hi2c1, 0x53<<1, 0x2D, 1, &reg_data, 1, 100); // 使能测量 reg_data = 0x10; // 设置±4g量程 HAL_I2C_Mem_Write(&hi2c1, 0x53<<1, 0x31, 1, &reg_data, 1, 100); reg_data = 0x90; // 自由落体中断:阈值0.5g,时间窗50ms HAL_I2C_Mem_Write(&hi2c1, 0x53<<1, 0x21, 1, &reg_data, 1, 100); reg_data = 0x32; HAL_I2C_Mem_Write(&hi2c1, 0x53<<1, 0x22, 1, &reg_data, 1, 100); } // 外部中断回调(PA0) void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_0) { fall_flag = 1; // 置位跌倒标志 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // 点亮报警LED } }

gsm.c关键函数:

// 发送短信(阻塞式,超时15秒) uint8_t GSM_SendSMS(char* phone, char* msg) { char cmd[100]; sprintf(cmd, "AT+CMGS=\"%s\"\r\n", phone); HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), 1000); HAL_Delay(500); HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 1000); HAL_UART_Transmit(&huart1, (uint8_t*)"\x1A", 1, 1000); // Ctrl+Z结束 return WaitForResponse("OK", 15000); // 等待OK响应 } // 响应等待函数(防死锁) uint8_t WaitForResponse(char* expect, uint32_t timeout_ms) { uint32_t start = HAL_GetTick(); while(HAL_GetTick() - start < timeout_ms) { if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE)) { uint8_t ch = huart1.Instance->DR; if(strstr(rx_buffer, expect)) return 1; } } return 0; // 超时 }

4.3 现场调试与参数校准(2小时)

调试不是烧录完就完事,必须模拟真实场景:

  • 环境校准:将设备固定在老人常用座椅扶手上,开启串口监视器,记录静坐、起身、弯腰时的加速度波形;
  • 阈值微调:若弯腰时频繁误报,降低自由落体阈值(0x08→0x06);若跌倒漏报,提高冲击峰值阈值(3.5g→4.0g);
  • GSM压力测试:连续发送10条短信,观察第5条后是否出现“+CMS ERROR: 500”(内存溢出),如有则需在每次发送后加AT+CMGD=1,4清空短信存储。

独家技巧:用手机热点创建弱网环境(将手机WiFi信号强度调至1格),测试GSM模块在信号临界值下的表现。我们发现SIM800L在-105dBm时首次发送成功率仅63%,加入重发机制(失败后延时3秒重试,最多3次)后提升至99.8%。

5. 常见问题与排查技巧实录:那些让答辩前夜崩溃的故障

5.1 GSM模块“假在线”问题(占比37%)

现象:SIM800L红灯2秒闪1次,看似已注册网络,但发送AT指令无响应。
根因:SIM卡接触不良或欠费停机。
排查步骤

  1. 拔插SIM卡3次,用橡皮擦清洁金手指;
  2. 将SIM卡放入手机确认能否通话;
  3. 用万用表测SIM卡座VCC引脚电压(应为2.8~3.0V),若为0V则检查SIM卡座供电线路;
  4. 强制复位:短接SIM800L的STATUS引脚与GND 2秒。

注意:部分山寨SIM800L模块存在固件BUG,AT+CPIN?返回“+CPIN: READY”但实际未激活。此时需发送AT+CPIN="1234"(默认PIN码)解锁。

5.2 ADXL345数据“跳变”问题(占比29%)

现象:串口打印加速度值在0.2g~12g之间无规律跳变。
根因:I²C总线受到电机或开关电源高频噪声干扰。
解决方案

  • 在ADXL345的SCL/SDA线上各串接10Ω磁珠(非电阻!);
  • 将ADXL345模块远离STM32晶振(≥2cm);
  • 修改I²C时钟频率:hi2c1.Init.ClockSpeed = 100000;(标准模式)→50000;(降低速率抗干扰)。

5.3 跌倒误报率高(占比22%)

现象:老人正常坐下、躺下时系统报警。
根因:静止期判定窗口过短或标准差阈值过大。
校准方法

  • 用手机慢动作录像记录老人10次坐下动作,测量从臀部触椅到完全静止的时间(实测中位数1.3秒);
  • 在fall_detect.c中将静止期窗口从1.8秒改为1.4秒;
  • 将标准差阈值从0.15g下调至0.12g;
  • 增加“姿态验证”:跌倒后Az(垂直轴)应<0.3g(人躺平),若Az>0.6g则判定为坐姿,取消报警。

5.4 整机功耗超标(占比12%)

现象:锂电池72小时耗尽,远低于理论18个月。
根因:STM32未进入停机模式或GSM模块未关闭。
修复步骤

  1. 在main.c主循环末尾添加:
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后需重新初始化时钟 SystemClock_Config();
  1. GSM模块发送完短信后执行:
HAL_UART_Transmit(&huart1, (uint8_t*)"AT+CPOF\r\n", 9, 1000); // 关机指令 HAL_Delay(2000); // 等待模块彻底断电
  1. 检查所有GPIO:未使用的引脚配置为GPIO_MODE_ANALOG(最低功耗)。

实测数据:经上述优化,整机平均电流从12mA降至83μA,理论续航达21个月(按每天1次报警计算)。

6. 毕业设计落地建议:让作品真正走出实验室

这个项目最大的价值不是拿高分,而是解决真实需求。我在指导过程中发现,学生常陷入两个极端:要么过度追求技术指标(如用F7跑神经网络算法),要么简化到失去实用价值(如用LED闪烁代替短信)。真正的平衡点在于:用最可靠的器件,做最扎实的验证,解决最具体的痛点。

比如,很多方案忽略“报警确认”环节——老人跌倒后可能意识模糊,无法接听电话。我们的改进是在发送短信后,启动GSM模块拨打预设号码,若无人接听则自动重拨(间隔30秒,最多3次),同时短信内容包含实时定位(需外接GPS模块,成本+¥35)。这个功能在三次实地测试中,成功让家属在跌倒后4分17秒内赶到现场。

另一个常被忽视的细节是外壳设计。我们用3D打印制作ABS材质外壳(尺寸120×80×30mm),表面开孔避开ADXL345感应面,并在底部嵌入磁吸片——老人可直接吸附在床头铁栏杆上,无需胶粘。这个设计让设备安装时间从5分钟缩短至10秒,且避免了胶痕残留问题。

最后想说的是:毕业设计不是终点,而是起点。我带过的毕业生中,有两人已将此系统改良后申请实用新型专利(一种基于加速度阈值自适应的跌倒检测装置),另一人与社区养老中心合作,在3个老旧小区部署了27台设备。当你调试完最后一行代码,看着设备在老人床头安静运行,那种踏实感,远胜于任何分数。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 6:03:39

Reachy mini机器人学习平台:开源闭环与具身智能实践解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 6:01:38

云端编码实测:环境对齐与任务接续的完整落地指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 6:01:09

异构主板原理图深度解析:TI C2000 MCU与Anlogic FPGA协同设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 5:59:27

STM32环境监测系统全链路开发:从传感器选型到蓝牙APP实战

简介&#xff1a;本资源是一套完整的STM32单片机毕业设计项目——家庭/室外环境监测系统&#xff0c;面向电子、自动化、物联网等专业本科生及嵌入式初学者&#xff0c;解决环境参数实时采集、本地显示与手机远程监控的典型工程实践问题。压缩包含1026个文件&#xff0c;总大小…

作者头像 李华
网站建设 2026/9/4 5:58:16

基于Godot引擎与AI辅助的2D回合制RPG游戏开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华