基于STM32的独居老人语音/一键双模紧急呼救系统设计与实现

若该文为原创文章,转载请注明原文出处。

一、项目背景与升级说明

独居老人的安全保障是一个亟待解决的社会问题。跌倒后无法及时呼救、突发疾病无人知晓,是老年人伤亡的重要诱因。传统的电话呼叫方式在老人行动不便或意识模糊时往往无法奏效。

本文介绍的这套系统以STM32为主控核心,在原有语音呼救、一键报警、跌倒检测、心率血氧监测、温湿度检测和4G远程通信六大功能基础上,新增了GPS定位模块,使报警信息中能够附带老人的精确地理位置,家属收到求救后可直接导航前往,大幅缩短救援时间。

本次硬件方案的具体调整包括:语音识别模块采用ST-03S (启英泰伦CI-B03ST01S系列离线语音识别模组),4G通信模块采用ML307R (中国移动Cat.1模组,内置GNSS能力),GPS定位采用ATGM336H北斗/GPS双模模块。

二、系统总体架构

系统采用三层架构设计:

感知层:DHT11温湿度传感器、MAX30102心率血氧传感器、ADXL345加速度传感器、ST-03S语音识别模块、ATGM336H GPS定位模块、一键报警按键。

控制层:STM32F103C8T6作为主控芯片,负责传感器数据采集、报警逻辑判断、阈值管理、OLED显示控制、GPS坐标解析。

通信层:ML307R 4G模块(Cat.1),通过AT指令或MQTT协议将报警信息、生理数据和GPS位置上传至手机端。

报警信息的发送内容包含:报警类型(语音呼救/跌倒/心率异常/一键报警)、当前生理参数(心率、血氧、温湿度)、GPS经纬度坐标和时间戳。其中GPS坐标是新增的关键字段,家属收到报警短信后可直接复制坐标到地图应用中进行导航。

三、硬件设计

3.1 主控制器

选用STM32F103C8T6(Cortex-M3内核,72MHz主频,64KB Flash,20KB RAM),具有丰富的通信接口,可满足多传感器并行采集、GPS解析和4G通信的需求。

3.2 传感器与通信模块

模块 型号 接口 功能
温湿度 DHT11 单总线GPIO 温度0-50℃、湿度20-90%RH
心率血氧 MAX30102 I2C PPG法测心率和SpO₂
加速度 ADXL345 I2C 三轴加速度,跌倒检测
语音识别 ST-03S UART 离线关键词识别
GPS定位 ATGM336H UART 北斗/GPS双模定位
4G通信 ML307R UART 远程报警和数据上报
显示 SSD1306 OLED I2C 0.96寸,128×64

3.3 ST-03S语音识别模块

ST-03S是启英泰伦推出的单麦离线语音识别模组,搭载CI1103语音识别芯片,内置基于深度神经网络(DNN)的硬件处理器,支持100条命令词离线语音识别,不依赖网络,识别率达95%,响应时间最快0.2秒,支持5米远场识别。该模块支持双麦远场降噪和Beamforming算法,在嘈杂环境也能保证识别准确性。

模块通过UART与STM32通信,识别结果以命令ID形式输出。本系统设置的关键词如下:

命令ID 关键词 动作
0 "救命" 触发紧急报警
1 "帮帮我" 触发紧急报警
2 "我摔倒了" 触发紧急报警
3 "取消报警" 解除报警(防误报)

STM32通过UART中断接收识别结果,核心处理代码如下:

复制代码
void USART2_IRQHandler(void) {
    if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
        uint8_t cmd = USART_ReceiveData(USART2);
        if (cmd == 0 || cmd == 1 || cmd == 2) {
            trigger_alarm(ALARM_VOICE);
        } else if (cmd == 3) {
            cancel_alarm();
        }
        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
    }
}

3.4 ATGM336H GPS定位模块

ATGM336H-5N是北斗/GPS双模定位模块,具有高灵敏度、低功耗、低成本等优势,尺寸仅9.7×10.1mm,可以直接替换Ublox MAX系列模块。该模块默认固件仅支持UART TTL电平输出,波特率固定为9600bps,刷新率1Hz,上电即用,无需配置。

硬件连接:

  • GPS模块TX → STM32 USART3_RX(PB11)

  • GPS模块RX → STM32 USART3_TX(PB10)

  • 共地(GND必须可靠连接)

  • 供电采用3.3V LDO稳压

注意:禁止直接接5V供电,避免烧毁模块I/O。

模块输出遵循NMEA-0183标准,每条语句以$开头,以<CR><LF>结尾。我们只需解析两条核心语句:

  • $GPRMC:推荐最小定位信息,包含时间、状态(A/V)、纬度、经度、速度、日期。

  • $GPGGA:全球定位系统固定数据,包含时间、纬度、经度、定位状态、卫星数、HDOP、海拔。

GPS数据解析采用状态机驱动的方式,在UART中断中逐字节接收,通过检测$和\n来划分完整语句:

复制代码
char gps_buf[128];
uint8_t gps_idx = 0;

void USART3_IRQHandler(void) {
    if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {
        char ch = USART_ReceiveData(USART3);
        if (ch == '$') {
            gps_idx = 0;
        }
        if (gps_idx < sizeof(gps_buf) - 1) {
            gps_buf[gps_idx++] = ch;
        }
        if (ch == '\n') {
            gps_buf[gps_idx] = '\0';
            parse_nmea(gps_buf);  // 解析GPRMC或GPGGA
            gps_idx = 0;
        }
        USART_ClearITPendingBit(USART3, USART_IT_RXNE);
    }
}

void parse_nmea(char *sentence) {
    if (strncmp(sentence, "$GPRMC", 6) == 0) {
        // 解析纬度、经度、定位状态
        char *token = strtok(sentence, ",");
        int field = 0;
        while (token != NULL) {
            switch (field) {
                case 2: gps_valid = (token[0] == 'A'); break;
                case 3: gps_lat = atof(token); break;    // 纬度 ddmm.mmmm
                case 4: gps_lat_dir = token[0]; break;   // N/S
                case 5: gps_lon = atof(token); break;    // 经度 dddmm.mmmm
                case 6: gps_lon_dir = token[0]; break;   // E/W
            }
            token = strtok(NULL, ",");
            field++;
        }
    }
}

解析出的ddmm.mmmm格式经纬度需转换为十进制度数:度 = 整数部分 + 小数部分/60。

3.5 ML307R 4G通信模块

ML307R是中国移动推出的4G Cat.1模组,支持IPv4/IPv6、TCP/UDP、HTTP/HTTPS、MQTT/MQTTS等网络协议,串口默认通信波特率为115200。

硬件连接:

  • ML307R UART1_TXD → STM32 USART1_RX(PA10)

  • ML307R UART1_RXD → STM32 USART1_TX(PA9)

  • PWRKEY引脚用于开关机控制

  • VBAT供电3.8V,推荐DC-DC降压,需加大电容储能(1000μF铝电解+100μF陶瓷并联),2A瞬时电流LDO扛不住。

报警短信发送(AT指令流程):

复制代码
void send_alarm_sms(const char *phone, const char *message) {
    SendAT("AT\r\n");                     // 测试通信
    delay_ms(200);
    SendAT("AT+CMGF=1\r\n");              // 文本模式
    delay_ms(200);
    SendAT("AT+CMGS=\"");                 // 发送短信
    SendAT(phone);
    SendAT("\"\r\n");
    delay_ms(500);
    SendAT(message);
    SendAT("\x1A");                       // Ctrl+Z 发送
}

MQTT数据上报(连接OneNET平台):

ML307R连接OneNET需要以下参数:地址mqtts.heclouds.com、端口1883、产品ID、设备名称和生成的Token。关键AT指令序列如下:

复制代码
// 网络附着检查
SendAT("AT+CGATT?\r\n");          // 必须返回1
// MQTT配置(OneNET要求clean=1)
SendAT("AT+MQTTCFG=\"clean\",0,1\r\n");
// 连接MQTT服务器
SendAT("AT+MQTTCONN=0,\"mqtts.heclouds.com\",1883,\"设备名称\",\"产品ID\",\"Token\"\r\n");
// 发布数据(JSON格式)
SendAT("AT+MQTTPUB=0,\"$sys/{产品ID}/{设备名称}/thing/property/post\",0,0,0,0\r\n");

发布消息时需要注意,OneNET的主题格式为$sys/产品ID/设备名称/thing/property/post,而非阿里云风格的/productKey/deviceName/temperature。JSON数据格式如下:

复制代码
{
  "id": "1",
  "params": {
    "heart_rate": {"value": 85},
    "spo2": {"value": 97},
    "temperature": {"value": 26.5},
    "humidity": {"value": 65},
    "latitude": {"value": 39.9042},
    "longitude": {"value": 116.4074},
    "fall_status": {"value": 0},
    "alarm_type": {"value": 2}
  }
}

四、各功能模块软件设计

4.1 DHT11温湿度采集与阈值报警

DHT11采用单总线协议,采集周期2秒。当温度超过上限阈值(默认35℃)或低于下限阈值(默认5℃)时,触发声光报警。

4.2 MAX30102心率血氧监测

MAX30102通过I2C采集红光和红外光PPG原始数据。心率通过检测PPG信号峰值周期计算,血氧通过红光/红外光AC/DC比值计算。正常心率范围设为60-100 BPM,血氧饱和度正常范围设为95%-100%。

4.3 ADXL345跌倒检测

跌倒检测采用合加速度阈值法+姿态角确认的双条件串联方案:

复制代码
float acc_magnitude = sqrtf(ax*ax + ay*ay + az*az);
if (acc_magnitude > FALL_THRESHOLD_HIGH) {  // 冲击检测,默认2.5g
    fall_flag = 1;
    fall_timer = 0;
    state = FALL_CHECKING;
}
if (state == FALL_CHECKING && ++fall_timer > 200) {  // 2秒后确认
    float angle = atan2f(ay, az) * 180.0f / M_PI;
    if (fabsf(angle) > POSTURE_THRESHOLD) {  // 姿态角变化超60度
        trigger_alarm(ALARM_FALL);
    }
    state = FALL_IDLE;
}

冲击+姿态双条件判断可有效降低误报率。

4.4 一键报警按键

按键连接至PA0引脚,配置为外部中断(下降沿触发)。要求持续按下超过500ms才触发报警,防误触。按下后系统立即启动声光报警,并通过ML307R发送包含GPS坐标的求救短信。

4.5 GPS坐标集成到报警流程

这是本次升级的核心变化。当任一报警触发时,系统首先检查GPS定位状态:

复制代码
void process_alarm(void) {
    char sms_content[256];
    char gps_str[64];

    if (gps_valid) {
        // 将ddmm.mmmm格式转换为十进制度数
        float lat = nmea_to_degree(gps_lat, gps_lat_dir);
        float lon = nmea_to_degree(gps_lon, gps_lon_dir);
        sprintf(gps_str, "位置: https://maps.google.com/?q=%.6f,%.6f\r\n", lat, lon);
    } else {
        sprintf(gps_str, "位置: GPS未定位\r\n");
    }

    sprintf(sms_content, "【紧急报警】%s\r\n%s"
            "心率:%d BPM 血氧:%d%%\r\n温度:%.1fC 湿度:%.0f%%\r\n请立即联系确认!",
            get_alarm_type_str(), gps_str, heart_rate, spo2, temperature, humidity);

    send_alarm_sms(emergency_phone, sms_content);
    // 同时通过MQTT上报到云平台
    mqtt_publish_data();
}

GPS定位状态管理 :由于ATGM336H在室内或信号弱的环境下可能无法获取有效定位,系统在gps_valid=0时会在报警短信中标注"GPS未定位",避免发送无效坐标误导家属。上电后GPS模块需要一定时间完成首次定位(冷启动约30-60秒,热启动约5秒),系统在OLED上显示GPS定位状态(定位中/已定位/无信号)。

4.6 OLED显示与菜单设置

OLED主界面实时显示:温度、湿度、心率、血氧、GPS定位状态、系统状态(正常/报警)。设置菜单通过按键进入,包含温度上下限、心率上下限、血氧下限、跌倒灵敏度、紧急联系人号码、报警模式等配置项。

五、系统集成与主循环

主循环采用时间片轮询+中断触发的混合架构:

复制代码
int main(void) {
    System_Init();
    GPS_Init();
    ML307R_Init();
    ST03S_Init();

    while (1) {
        if (timer_2s_flag) {           // 每2秒
            DHT11_Read_Data(&temp, &humi);
            check_env_threshold(temp, humi);
            timer_2s_flag = 0;
        }
        if (timer_100ms_flag) {        // 每100ms
            ADXL345_Read_Accel(&ax, &ay, &az);
            fall_detection(ax, ay, az);
            timer_100ms_flag = 0;
        }
        if (timer_1s_flag) {           // 每1秒
            MAX30102_Read(&hr, &spo2);
            check_vital_threshold(hr, spo2);
            timer_1s_flag = 0;
        }
        if (timer_200ms_flag) {        // OLED刷新
            OLED_Refresh();
            timer_200ms_flag = 0;
        }
        if (alarm_flag) {
            process_alarm();           // 包含GPS坐标的报警处理
            alarm_flag = 0;
        }
    }
}

报警优先级:一键报警 > 语音呼救 > 跌倒检测 > 生理异常 > 环境异常。多条件同时触发时只处理最高优先级报警,避免重复发送。

六、系统测试

在实验室环境下对系统进行了功能验证:

  • 语音识别:安静环境下ST-03S对3个呼救关键词的识别成功率达到95%以上,响应时间约200ms。

  • 跌倒检测:模拟跌倒动作20次,正确检测18次,准确率90%。

  • 心率血氧:与商用指夹式血氧仪对比,心率误差±3 BPM,血氧误差±2%。

  • GPS定位:室外开阔环境下热启动首次定位约5秒,冷启动约45秒,定位精度约2.5米CEP。

  • 4G通信:报警短信发送成功率100%,平均延迟约3秒。ML307R从开机到网络附着成功约8秒。

  • 温湿度:温度误差±1℃,湿度误差±4%RH。

七、总结与展望

本系统以STM32为核心,集成ST-03S语音识别、ATGM336H GPS定位和ML307R 4G通信三大升级模块,实现了独居老人紧急呼救的完整解决方案。相比原版方案,GPS模块的加入使报警信息从"发生了什么"升级为"在哪里发生了什么" ,家属收到求救后可直接导航前往,显著提升了救援效率。

系统的主要特点:

  1. 双模触发机制:ST-03S离线语音识别+一键按键,覆盖主动呼救场景,无需网络即可识别

  2. 自动检测能力:跌倒检测和生理参数监测,实现被动安全防护

  3. 精确定位:ATGM336H北斗/GPS双模定位,报警短信附带地图导航链接

  4. 多维度报警:声光报警+ML307R短信通知+MQTT云平台数据上报

  5. 灵活配置:OLED菜单支持阈值、联系人和报警模式的现场设置

未来可优化的方向:引入FreeRTOS实现多任务调度以提升系统实时性;增加电子围栏功能,当老人离开预设安全区域时自动提醒;通过MQTT协议接入云平台实现手机APP端的历史数据查询和趋势分析。

如有侵权,或需要完整代码,请及时联系博主。

相关推荐
暖焰核心41 分钟前
USART 概念篇——从高低电平到数据帧
stm32
袁章根1 小时前
基于瑞昱RTL8367S交换机电路设计(一)
网络·嵌入式硬件·硬件架构·硬件工程
深圳市恒锐丰科技杨生1 小时前
EG44273 20V 低压单通道低侧栅极驱动芯片|屹晶 EGmicro
嵌入式硬件·硬件工程
搁浅小泽2 小时前
通用二极管选型设计规范
单片机·嵌入式硬件·设计规范
深圳老胡2 小时前
STM32 在 VSCode 下 -O0 与 -Os 编译条件的区别
笔记·stm32·单片机·代码规范
智感子8 小时前
测控链路:从传感器到上位机
人工智能·嵌入式硬件·fpga开发
新晨单片机设计9 小时前
S021A-基于STM32单片机自动追光系统(步进电机)【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·自动追光系统
恒锐丰科技林技术员12 小时前
EG2129 带过流保护全桥驱动芯片解析
经验分享·嵌入式硬件·硬件工程
zhangzhangkeji13 小时前
stm32 12-2-3 :bkp 备份寄存器和 rtc 实时时钟,原理与代码
stm32