若该文为原创文章,转载请注明原文出处。
一、项目背景与升级说明
独居老人的安全保障是一个亟待解决的社会问题。跌倒后无法及时呼救、突发疾病无人知晓,是老年人伤亡的重要诱因。传统的电话呼叫方式在老人行动不便或意识模糊时往往无法奏效。
本文介绍的这套系统以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模块的加入使报警信息从"发生了什么"升级为"在哪里发生了什么" ,家属收到求救后可直接导航前往,显著提升了救援效率。
系统的主要特点:
-
双模触发机制:ST-03S离线语音识别+一键按键,覆盖主动呼救场景,无需网络即可识别
-
自动检测能力:跌倒检测和生理参数监测,实现被动安全防护
-
精确定位:ATGM336H北斗/GPS双模定位,报警短信附带地图导航链接
-
多维度报警:声光报警+ML307R短信通知+MQTT云平台数据上报
-
灵活配置:OLED菜单支持阈值、联系人和报警模式的现场设置
未来可优化的方向:引入FreeRTOS实现多任务调度以提升系统实时性;增加电子围栏功能,当老人离开预设安全区域时自动提醒;通过MQTT协议接入云平台实现手机APP端的历史数据查询和趋势分析。
如有侵权,或需要完整代码,请及时联系博主。