STM32 老人跌倒监测报警系统

从原理图到代码,手把手教你做一块能救命的开发板(附完整硬件清单))

独居老人摔倒后无人发现,是养老场景里最揪心的事。我国每年有超过 4000 万老年人至少跌倒一次,跌倒也是 65 岁以上老人伤害致死的首位原因。如果有一块巴掌大的开发板,能在老人摔倒后自动语音呼救、并把 GPS 位置推送到子女手机,救援的黄金时间就抢回来了。

这篇文章把我做这套「老人跌倒监测报警系统」的完整过程写出来:硬件怎么选、成本多少钱、电路怎么连、核心代码怎么写、我踩过哪些坑,全部摊开讲。做完这套系统,你对 STM32 + 多传感器 + 物联网上云的整套链路会有一次完整的实战。

一、系统做了什么

一句话:老人摔倒 → 设备本地语音呼救 → 同时把报警和定位推送到监护人的手机。

具体功能拆解:

功能 实现方式 对应硬件
跌倒检测 三轴加速度变化检测 ADXL345(IIC)
心率监测 光电脉搏采集 PulseSensor(ADC)
定位 卫星定位上报 ATGM336H(UART)
本地呼救 语音播报"有人跌倒,请求帮助" JR6001(UART)
远程报警 MQTT 上报云端 → 手机端 ESP8266-01S(UART)
现场显示 心率/状态实时显示 0.96 寸 OLED12864(IIC)
主控 --- STM32F103C8T6

二、硬件选型与成本清单

做硬件项目,先算账。整套系统物料成本约 60~80 元(不含 PCB 打样与外壳):

器件 型号 数量 参考单价 说明
主控 STM32F103C8T6 1 ~10 元 72MHz Cortex-M3,资源足够
加速度传感器 ADXL345 1 ~8 元 三轴,IIC 输出,±16g 量程
心率传感器 PulseSensor 1 ~15 元 模拟输出,接 ADC
GPS 模块 ATGM336H 1 ~20 元 串口输出 NMEA,配无源天线
WiFi 模块 ESP8266-01S 1 ~10 元 MQTT 上云
语音模块 JR6001 1 ~12 元 串口指令触发播报
显示屏 OLED12864 0.96寸 1 ~10 元 IIC
其他 蜂鸣器/按键/电源等 若干 ~10 元 ---

选型理由讲两句(这是和"只贴清单"的文章拉开差距的地方):

  • 为什么用 ADXL345 而不是 MPU6050?跌倒检测只需要加速度特征(失重→冲击→静止),ADXL345 便宜、IIC 两根线、自带活动/自由落体中断,省掉 MPU6050 的姿态解算开销。如果你的方案要做"倒地后姿态判断"再考虑带陀螺仪的方案。
  • 为什么 GPS 用 ATGM336H?国产、便宜、串口直出 NMEA-0183 协议,解析简单。
  • 语音模块选 JR6001 而不是自己做 DAC 播放:一条串口指令 UART1Write("B0") 触发预置语音,开发量最小。

三、电路设计要点

原理图用 Altium Designer 绘制。连线关系归纳成一张表,接线和排查时照着对:

模块 接口 连接到 STM32 引脚 备注
ADXL345 IIC PB6/PB7(SCL/SDA) 总线需 4.7kΩ 上拉
OLED IIC 与 ADXL345 共总线 地址不冲突(0x3C / 0x53)
ATGM336H UART USART2 9600bps,NMEA 语句
ESP8266-01S UART USART3 注意 3.3V 电平一致
JR6001 UART USART1 指令触发播报
PulseSensor ADC PA1(ADC1通道) 模拟信号

布线三个坑(都是实际踩过的):

  1. ESP8266-01S 必须独立 3.3V 供电。它在 WiFi 发射瞬间峰值电流能到 300mA+,直接从 STM32 最小系统的 3.3V 引脚取电,会出现"模块一联网单片机就复位"的灵异现象,加一颗 470uF 电容或独立 LDO。
  2. IIC 上拉电阻不能省。ADXL345 和 OLED 挂同一条总线时,上拉电阻只保留一组,两套板子各自带上拉会导致电平异常。
  3. GPS 天线要朝天、避开屏蔽。放在 PCB 电池下方或金属外壳里,定位时间从 30 秒变成 10 分钟都搜不到星。

四、核心代码实现

4.1 主程序框架

注意 #include 一律用英文引号,直接复制编译通过:

复制代码
#include "sys.h"
#include "delay.h"
#include "adc.h"
#include "key.h"
#include "OLED_I2C.h"
#include "Control_Report_To_Police.h"

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  // 2位抢占 + 2位响应
    delay_init();
    Usart1_Init(9600);      /* JR6001 语音模块 */
    TIM4_Init(300, 7200);   /* 系统节拍 */
    switch_Init();
    Beep_init();

    OLED_Init();
    OLED_CLS();

    Adc_Init();             /* PulseSensor 心率采集 */
    KEY_Init();
    TIM2_Int_Init(1999, 71);

    while (ADXL345_IIC_GPIO_Init())   /* ADXL345 初始化,失败重试 */
    {
    }

    ALi_ESP8266_GPIO_Init();  /* ESP8266 上电使能 */
    MQTT_Buff_Init();         /* MQTT 报文缓冲 */
    AliIoT_Parameter_Init();  /* 云平台三元组参数 */

    while (1)
    {
        OLED_Display_Cotrol();   /* 界面刷新 + 业务调度 */
    }
}
4.2 跌倒判断:从"加速度异常"到"确认报警"

跌倒的加速度特征是三段:自由落体(合加速度骤降)→ 着地冲击(骤升)→ 长时间静止(合加速度回到 1g 附近但姿态异常)。只判"冲击"会把手拍桌子、坐下都误报,所以要做三段联合判定:

复制代码
/* 跌倒状态机:FALL_FREE(失重) -> FALL_IMPACT(冲击) -> FALL_STILL(静止确认) */
typedef enum { NORMAL = 0, FALL_FREE, FALL_IMPACT, FALL_STILL } FallState;

/*
 * 判定阈值参考(需按实际佩戴方式标定):
 *   合加速度 < 0.4g   持续 > 100ms   -> 进入失重态
 *   合加速度 > 2.5g   500ms 内出现    -> 进入冲击态
 *   合加速度 0.8~1.2g 静止 > 30s      -> 确认跌倒
 */
void Fall_Detect_Process(void)
{
    float g = ADXL345_GetTotalG();   /* x/y/z 合加速度 */

    switch (fall_state)
    {
    case NORMAL:
        if (g < 0.4f) fall_state = FALL_FREE;
        break;

    case FALL_FREE:
        if (g > 2.5f) fall_state = FALL_IMPACT;
        else if (g > 0.8f) fall_state = NORMAL;  /* 误触发回退 */
        break;

    case FALL_IMPACT:
        if (Is_Still(30000))        /* 30s 静止确认 */
            fall_state = FALL_STILL;
        break;

    case FALL_STILL:
        Fall_Alarm();               /* 语音呼救 + 上报云端 + GPS定位 */
        fall_state = NORMAL;
        break;
    }
}
4.3 报警链路

确认跌倒后,按"先本地、后远程"的顺序触发:

复制代码
void Fall_Alarm(void)
{
    UART1Write("B0");            /* 1. JR6001 播报"有人跌倒,请求帮助" */
    UART1Write("AF:35");         /*    音量设为 35 */
    Beep_On();                   /* 2. 本地蜂鸣器同步响 */

    GPS_GetLocation(gps_buf);    /* 3. 取当前经纬度 */
    MQTT_PublishAlarm(gps_buf,   /* 4. MQTT 上报云端 -> 监护人手机 */
                      heart_rate);
}

五、总结

这套系统的价值不在单个模块,而在完整走通"传感采集 → 本地判断 → 双通道报警(语音 + 云端)"的物联网闭环。做毕业设计,它有算法(跌倒状态机)、有硬件(七类外设混合总线)、有云端(MQTT 上报),答辩内容足够;做产品原型,60~80 元的 BOM 也留出了商业化空间。

下一步可以迭代的方向:低功耗(跌倒检测用 ADXL345 中断唤醒主控,电池续航能从小时级提到天级)、加 NB-IoT 摆脱 WiFi 依赖、云端加"静默期确认"(报警后 30 秒内按键可取消,防误报骚扰)。

六、资料内容完整工程资料(原理图、PCB、代码、元件清单)

七、资料获取方式

扫一扫咨询客服

相关推荐
不悔哥4 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20164 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子4 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡4 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5554 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
女神下凡4 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9664 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛4 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
从零开始的嵌入式之旅4 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
恒锐丰科技林技术员4 天前
EG1164 高压大电流升压同步整流芯片解析
经验分享·嵌入式硬件·硬件工程