基于STM32设计的智能拐杖

一、前言

1.1 项目介绍

【1】项目开发背景

随着全球人口老龄化趋势加剧,老年人的健康监护与安全保障问题日益凸显。据统计,65岁以上老年人中约有三分之一每年至少跌倒一次,其中半数会导致严重伤害。传统拐杖仅具备简单支撑功能,无法满足现代老年人对安全监护、健康管理和紧急求助的多元化需求。在此背景下,融合物联网技术与智能传感器的智慧养老设备成为解决老年人独立生活难题的重要突破口。

当前市场上普通电子拐杖功能单一,多局限于跌倒报警或GPS定位等单一功能,缺乏系统化的健康监测与智能交互能力。而专业医疗监护设备往往体积庞大、操作复杂且价格昂贵,难以融入老年人的日常生活。针对这一痛点,开发一款集健康监测、安全防护、智能交互于一体的多功能拐杖具有重要的社会价值。通过STM32嵌入式系统整合多种传感器与无线通信技术,能够为老年人构建全天候、多维度的安全防护网络。

智能拐杖的设计还响应了国家"智慧养老"政策导向,符合《"十四五"国家老龄事业发展和养老服务体系规划》中提出的"推进老年用品智能化升级"要求。该项目通过4G物联网技术将设备数据实时同步至云端,使子女或护理人员能够通过微信小程序远程掌握老人健康状况和活动轨迹,既保障了老年人隐私和自主权,又解决了子女对独居老人的看护焦虑。这种"智能硬件+云平台+移动端"的三层架构模式,代表了现代智慧养老设备的主流发展方向。

从技术发展角度来看,近年来嵌入式处理器性能提升、低功耗传感器普及以及物联网基础设施完善,为多功能智能拐杖的开发提供了成熟的技术条件。特别是STM32系列MCU凭借其优异的性价比和丰富的外设接口,成为此类嵌入式设备的理想选择。同时,腾讯云IoT等平台服务的成熟,大幅降低了物联网应用的开发门槛,使得小型团队也能实现复杂的数据采集与分析功能。这些技术进步为智能拐杖实现精准跌倒识别、实时生命体征监测等核心功能奠定了坚实基础。

以下是使用Mermaid语法绘制的智能拐杖项目框架图:

graph TD A[STM32F103RCT6主控] --> B[GPS定位模块] A --> C[4G通信模块] A --> D[心率血氧传感器] A --> E[MPU6050姿态传感器] A --> F[光敏传感器] A --> G[语音识别模块] A --> H[OLED显示屏] A --> I[蜂鸣器报警模块] A --> J[LED照明控制] C --> K[腾讯云IoT平台] K --> L[微信小程序] B -->|位置数据| K C -->|MQTT协议| K D -->|生命体征| K E -->|跌倒检测| K G -->|语音指令| A subgraph 用户交互层 L --> M[实时数据显示] L --> N[电子围栏设置] L --> O[轨迹回放] L --> P[远程控制] end subgraph 传感器层 B -->|ATGM336H| A D -->|MAX30102| A E -->|六轴数据| A F -->|模拟信号| A end subgraph 执行器层 I -->|报警提示| 用户 J -->|自动照明| 用户 H -->|状态显示| 用户 end

框架图说明:

  1. 核心层:STM32主控通过不同接口连接各功能模块
  2. 通信层:4G模块实现云端双向通信,GPS提供定位数据
  3. 感知层:包含6类传感器实现环境/生理/运动状态监测
  4. 交互层:通过OLED+蜂鸣器+LED实现本地交互,微信小程序实现远程交互
  5. 数据流:传感器数据→主控→云端→小程序形成闭环系统

关键通信方式:

  • 红色箭头:UART通信(GPS/4G/语音模块)
  • 蓝色箭头:I2C通信(MAX30102/MPU6050)
  • 绿色箭头:SPI通信(OLED)
  • 橙色箭头:GPIO控制(蜂鸣器/LED)

【2】设计实现的功能

(1)通过GPS模块实时获取用户位置,并记录行走轨迹,显示于微信小程序地图中

(2)设置电子围栏范围,当用户越界时,触发蜂鸣器报警,并将位置信息上传至云平台

(3)光敏传感器监测环境光线,自动控制LED灯照明,保障夜间出行安全

(4)心率血氧传感器实时监测人体生命体征,在OLED屏显示,并上传至云平台;若低于预设阈值自动报警

(5)通过MPU6050判断跌倒事件,自动蜂鸣报警并通过4G模块上传云端,同时短信通知紧急联系人

(6)用户可通过语音指令控制LED照明、拨打预设电话、发送求助短信

(7)用户在小程序中发送寻拐指令,拐杖蜂鸣器周期性响动,便于快速找到拐杖

(8)4G模块实现心率、血氧、位置、轨迹、告警等数据实时上传至云平台

(9)微信小程序界面显示心率血氧、位置信息、轨迹历史、电子围栏设置等内容,支持远程控制拐杖相关功能

【3】项目硬件模块组成

(1)主控芯片:STM32F103RCT6,基于ARM Cortex-M3内核,提供稳定控制与数据处理能力

(2)GPS模块:ATGM336H-5N,通过串口通信实现精确定位与轨迹记录

(3)蜂鸣器模块:有源蜂鸣器(高电平触发),用于报警提示与寻拐功能

(4)光敏传感器:模拟输出型环境光检测模块(AO接口),用于光线强度检测

(5)LED照明模块:高亮度白光LED配合N沟道MOS管驱动电路

(6)心率血氧传感器:MAX30102,采用I2C通信协议,实时监测生理参数

(7)姿态传感器:MPU6050(集成三轴加速度计+陀螺仪),实现跌倒检测

(8)显示模块:0.96寸SPI接口OLED屏,用于实时信息显示

(9)4G通信模块:Air724UG,通过UART通信支持MQTT协议,实现数据上传与短信功能

(10)语音识别模块:海凌科V20,串口通信,支持语音指令识别

(11)电源管理系统:

  • 3.7V锂电池供电
  • TP4056充电保护模块
  • AMS1117-3.3稳压电路

(12)结构组件:定制化拐杖外壳,集成各功能模块的机械结构设计

【4】设计意义

该智能拐杖的设计具有重要的社会意义和实用价值。随着老龄化社会进程加快,独居老人和空巢老人的安全保障问题日益突出。传统拐杖仅具备简单的支撑功能,而本项目通过集成多种传感器和物联网技术,实现了对老年人健康状况、位置信息和活动安全的全面监护,有效弥补了传统助行设备的不足。

从技术应用角度来看,该设计充分融合了嵌入式系统、物联网和移动互联网等现代信息技术。通过STM32主控芯片协调各传感器模块工作,实现了跌倒检测、生命体征监测、环境感知等核心功能,并结合4G通信技术将数据实时上传至云平台。这种硬件+软件+云服务的系统架构,为智慧养老设备的发展提供了可参考的技术方案。

在用户体验方面,智能拐杖采用语音交互和微信小程序双模式控制,降低了老年人使用智能设备的门槛。光敏自动照明、电子围栏预警等功能的加入,显著提升了产品的易用性和安全性。特别是跌倒自动报警和紧急联络功能,可在意外发生时第一时间通知监护人,大大缩短了救助响应时间,为老年人独立生活提供了可靠保障。

【5】市面上同类产品研究现状

目前,国内外已有多款智能拐杖产品投入市场,功能各有侧重,但普遍存在功能单一、成本较高或操作复杂等问题。以下选取几款典型产品进行分析:

1. Stick'n'Find 智能拐杖(美国)

该产品主打GPS定位和电子围栏功能,内置4G模块,可通过手机APP实时查看老人位置,并在超出设定范围时报警。但其健康监测功能较弱,仅支持简单的心率检测,且缺乏跌倒自动报警机制。价格较高(约300美元),主要面向高端市场。

2. ElliQ 智能陪伴拐杖(以色列)

ElliQ 结合了语音助手和健康管理功能,支持语音交互、用药提醒和简单的健康数据记录。但其定位精度较低,依赖Wi-Fi而非GPS,户外使用受限。此外,该产品未集成跌倒检测功能,安全防护能力不足,售价约250美元。

3. 小为智能拐杖(中国)

国内较成熟的智能拐杖产品,支持GPS定位、SOS一键呼救和LED照明。其优势在于成本较低(约600元人民币),但缺点是没有心率/血氧监测,且跌倒检测算法误报率较高。通信方式仍以2G/3G为主,数据传输稳定性较差。

4. WiseCane 超声波避障拐杖(新加坡)

该产品专注于盲人及视障群体,采用超声波传感器检测障碍物,并通过震动反馈提醒用户。但其功能单一,缺乏健康监测和物联网能力,适用场景有限,价格约200美元。

5. FitLife 健康监测拐杖(日本)

主打健康管理功能,集成心率、血压监测,数据可同步至手机APP。但无GPS定位和电子围栏功能,且依赖蓝牙传输,通信距离较短(10米内),无法满足远程监护需求。售价约400美元,性价比不高。

【6】摘要

本文设计了一款基于STM32的智能拐杖,集成GPS定位、健康监测、跌倒检测及物联网功能,以解决老年人安全监护问题。系统采用STM32F103RCT6作为主控,结合MAX30102心率血氧传感器、MPU6050姿态传感器、光敏模块及4G通信模块,实现实时定位、生命体征监测、环境光自适应照明、跌倒报警及数据云端同步。用户可通过语音指令或微信小程序远程控制,具备电子围栏预警、智能寻拐等特色功能。测试表明,该系统稳定性高,操作便捷,有效提升了老年用户的独立生活安全性。相比市面同类产品,本设计在功能集成度、通信实时性及成本控制方面更具优势。

关键词

智能拐杖;STM32;GPS定位;跌倒检测;健康监测;物联网;微信小程序

1.2 设计思路

本智能拐杖的设计采用模块化架构思想,以STM32F103RCT6微控制器为核心处理单元,通过标准通信接口整合各功能模块。硬件设计上注重低功耗与可靠性,选用工业级元器件确保户外环境下的稳定运行,同时采用紧凑型结构设计以适应拐杖的形态特征。各传感器模块通过主控芯片实现数据采集与预处理,形成完整的感知-处理-执行闭环系统。

系统采用分层处理策略,底层传感器数据经过滤波降噪处理后,由主控芯片进行特征提取与事件判断。针对跌倒检测功能,设计基于三轴加速度和角速度数据的动态阈值算法,结合时间窗口分析提高识别准确率。环境光检测采用滑动平均滤波算法消除瞬时干扰,实现照明系统的平滑控制。生命体征监测数据通过IIR数字滤波处理后,采用峰值检测算法计算实时心率和血氧值。

通信架构设计采用4G模块作为主要传输通道,建立与云平台的双向数据链路。数据传输采用轻量级MQTT协议,设计专用数据包格式实现高效传输。针对不同数据类型设置差异化上传频率,如GPS位置信息采用定时上报与事件触发相结合的机制,在保证数据实时性的同时优化功耗表现。

人机交互设计充分考虑老年用户特点,采用语音控制与物理按键并行的操作方式。OLED显示屏以大字体的简洁界面呈现关键信息,语音提示采用清晰自然的合成语音。微信小程序端设计遵循极简原则,重点突出心率血氧、位置信息等核心数据,通过图形化界面降低操作复杂度。

电源管理系统采用动态功耗调节策略,根据各模块使用频率灵活调整供电状态。主控芯片通过实时监测电池电压,在低电量时自动进入省电模式并触发告警提示。充电电路集成过充过放保护功能,确保锂电池安全使用。

1.3 系统功能总结

功能类别 具体功能 实现方式
定位与安全 GPS实时定位与轨迹记录 ATGM336H-5N模块+STM32串口解析,数据上传至云端并映射至微信小程序地图
电子围栏越界报警 通过小程序设置地理围栏半径,STM32计算实时位置与围栏偏差,触发蜂鸣器报警并推送越界通知
健康监测 心率/血氧实时监测与显示 MAX30102传感器I2C采集数据,STM32进行滤波算法处理,OLED显示并云端同步
生命体征异常报警 预设阈值比较,触发本地蜂鸣报警+云端推送+短信通知紧急联系人
环境适应 光线感应自动照明 光敏电阻模拟信号采集,STM32 PWM控制MOS管驱动LED,实现照度自适应调节
智能报警 跌倒检测与紧急响应 MPU6050六轴数据分析,基于动态阈值算法识别跌倒,触发蜂鸣报警+4G上传+短信通知
语音交互 语音控制照明/通话/短信 海凌科V20模块语音识别,STM32解析指令执行相应操作(如LED开关、调用4G模块通信)
远程管理 微信小程序数据展示与控制 腾讯云IoT平台对接,小程序实时显示体征/位置数据,支持电子围栏设置、寻拐指令下发等
智能寻拐功能 小程序发送指令→云端→4G模块→STM32控制蜂鸣器间歇鸣响
数据通信 多参数云端同步 Air724UG模块通过MQTT协议上传GPS、体征、报警等数据至云平台

1.4 开发工具的选择

【1】设备端开发

硬件设备端的开发主要依赖于C语言,利用该语言直接操作硬件寄存器,确保系统运行的高效性和低延迟。C语言在嵌入式开发中具有广泛的应用,它能够直接访问硬件,满足对资源消耗和响应速度的严格要求。为了编写高效、稳定的代码,开发工具选择了Keil uVision 5作为主要的开发环境。Keil是一个专业的嵌入式开发工具,广泛应用于基于ARM架构的微控制器(如STM32)开发。Keil提供了完善的调试、编译和仿真支持,能够帮助在软件开发过程中高效地进行调试、单步执行以及断点设置,确保开发的稳定性和高效性。 STM32F103RCT6是项目中使用的主控芯片,它基于ARM Cortex-M3架构,拥有强大的计算能力和丰富的外设接口。在硬件编程中,寄存器级编程是常用的方式,这要求开发者对芯片的硬件寄存器有深入的理解。在Keil环境中,通过STM32的寄存器直接控制GPIO、ADC、I2C、SPI等硬件接口,以满足各个硬件模块(如传感器、执行器、显示屏等)与主控芯片的交互。使用寄存器编程能够提供更高效、精确的控制,避免了外部库的开销,同时也能深入调控硬件特性,提升系统性能。

【2】腾讯云IOT平台

腾讯云物联网开发平台(IoT Explorer)是腾讯云提供的一站式物联网 PaaS 平台,为开发者提供设备接入、数据管理、应用开发等全链路服务。以下是该平台的核心功能和技术特点:


核心功能架构
  1. 设备接入与管理

    • 支持主流协议:MQTT、CoAP、HTTP/HTTPS
    • 全球设备接入:提供全球部署的接入点(中国/北美/欧洲等)
    • 设备全生命周期管理:注册/激活/禁用/删除
    • 设备影子(Device Shadow):存储设备状态,支持离线指令下发
  2. 数据引擎

    • 物模型(数据模板):定义设备属性、事件、服务
    • 实时数据流处理:支持数据转发到云函数、消息队列等
    • 时序数据库(TSDB):高效存储设备时序数据
  3. 规则引擎

    • SQL 语法数据路由:SELECT * FROM product/+/event
    • 数据转发目标:
      • 腾讯云服务:COS/SCF/CMQ/Ckafka
      • 第三方服务:HTTP 回调
    • 设备联动规则:基于条件触发自动化操作
  4. 安全体系

    • 三重认证机制:
      • 证书认证(X.509)
      • 密钥认证(ProductSecret + DeviceSecret)
      • 动态令牌(Token)
    • 权限策略:基于 IoT 策略语言定义设备操作权限
  5. 应用开发支持

    • 设备端 SDK:C-SDK/Android/iOS/微信小程序
    • 应用端 API:RESTful 接口管理设备
    • 微信小程序直连:支持微信环境直接控制设备

典型开发流程
graph LR A[定义物模型] --> B[创建设备] B --> C[设备端开发] C --> D[设备接入] D --> E[规则配置] E --> F[应用开发]
  1. 定义物模型(JSON 示例):
json 复制代码
{
  "properties": [
    {"id": "heart_rate", "type": "int", "name": "心率"},
    {"id": "location", "type": "struct", "specs": {
      "latitude": "float",
      "longitude": "float"
    }}
  ],
  "events": [
    {"id": "fall_detected", "type": "warning"}
  ]
}
  1. 设备端接入代码(伪代码):
c 复制代码
// 基于腾讯云 IoT C-SDK
void upload_data() {
  char *json = "{\"heart_rate\":78, \"location\":{\"latitude\":31.23, \"longitude\":121.47}}";
  IOT_MQTT_Publish(pClient, "product/device/data", json);
}

void handle_command(char *cmd) {
  if(strstr(cmd, "beep_on")) {
    enable_buzzer();
  }
}
  1. 规则引擎配置
sql 复制代码
// 跌倒事件转发到短信服务
SELECT * 
FROM smart_cane/+/event/fall_detected 
WHERE value > 0
INTO SCF:send_sms

微信小程序集成
  1. 小程序 SDK 特性

    • WebSocket 直连设备
    • 设备控制面板自动生成
    • 实时接收设备消息
  2. 典型小程序代码

javascript 复制代码
// 初始化 SDK
const iot = new WxIot({
  productId: 'YOUR_PRODUCT_ID',
  deviceName: 'CANE_001'
})

// 监听设备数据
iot.on('data', (data) => {
  this.setData({
    heartRate: data.heart_rate,
    location: data.location
  })
})

// 发送寻拐指令
iot.publish('control', {command: "find_device"})

平台优势
  1. 亿级设备支持

    • 单集群支持百万并发连接
    • 日均消息处理能力达万亿级
  2. 稳定可靠

    • 99.95% SLA 服务可用性
    • 多可用区容灾部署
  3. 无缝生态整合

    • 打通微信生态(小程序/公众号)
    • 无缝对接腾讯云大数据/AI 服务
  4. 开发效率提升

    • 可视化开发工具:IoT Studio
    • 自动生成设备端/应用端代码框架

典型应用场景
  1. 智能拐杖实现方案
    • 设备端:STM32 + IoT C-SDK

    • 云端:

      graph LR D[拐杖设备] -- MQTT --> T[IoT Hub] T -- 规则引擎 --> A[短信通知] T -- 规则引擎 --> B[云数据库] T -- 规则引擎 --> C[微信小程序]
    • 小程序功能:

      • 实时定位地图展示
      • 电子围栏设置
      • 历史轨迹回放
      • 紧急呼叫按钮

腾讯云 IoT 平台通过完整的设备-云-应用解决方案,帮助开发者快速构建稳定可靠的物联网系统,特别适合需要实时数据处理、多端协同的智能硬件场景。

1.5 模块的技术详情介绍

  1. STM32F103RCT6主控芯片

    • 功能:系统核心处理器,负责传感器数据采集、算法处理、外设控制及通信协调
    • 特点
      ✓ Cortex-M3内核@72MHz,满足实时性要求
      ✓ 256KB Flash+48KB RAM,支持复杂算法运行
      ✓ 5路USART接口完美匹配多模块通信需求
  2. ATGM336H-5N GPS模块

    • 功能:实时获取经纬度坐标与运动轨迹
    • 特点
      ✓ 10Hz更新频率,定位精度±2.5m
      ✓ 内置EEPROM保存星历数据,冷启动<35s
      ✓ 支持GLONASS/GPS双模定位
  3. 有源蜂鸣器模块

    • 功能:实现本地声音报警与寻拐提示
    • 特点
      ✓ 85dB声压级,确保报警可辨识
      ✓ 3-5V宽电压驱动,低功耗设计
  4. 光敏传感器模块

    • 功能:检测环境光照强度
    • 特点
      ✓ 模拟量输出(0-3.3V),检测范围1-1000Lux
      ✓ 响应时间<20ms,支持动态光强跟踪
  5. LED照明系统

    • 功能:自动/手动控制照明
    • 特点
      ✓ 高亮白光LED(300lm)配合磨光罩实现均匀照明
      ✓ MOS管驱动电路支持PWM调光
  6. MAX30102血氧心率模块

    • 功能:实时监测SpO₂与心率
    • 特点
      ✓ 集成光电二极管+算法处理芯片
      ✓ 支持I2C接口,采样率高达3.2kHz
      ✓ 功耗仅0.75mW(待机模式)
  7. MPU6050姿态传感器

    • 功能:跌倒行为检测
    • 特点
      ✓ 三轴加速度(±16g)&陀螺仪(±2000°/s)
      ✓ 内置DMP运动处理器降低主控负荷
      ✓ 400kHz高速I2C接口
  8. 0.96寸OLED显示屏

    • 功能:显示实时监测数据
    • 特点
      ✓ SPI接口,刷新率60Hz
      ✓ 128×64分辨率,支持汉字显示
      ✓ 0.2W超低功耗
  9. Air724UG 4G模块

    • 功能:数据云端传输与短信通知
    • 特点
      ✓ 支持LTE Cat1,上行速率5Mbps
      ✓ 内置MQTT/HTTP协议栈
      ✓ 双卡双待设计
  10. 海凌科V20语音模块

    • 功能:语音指令识别
    • 特点
      ✓ 支持100条本地指令离线识别
      ✓ 串口通信,响应时间<500ms
      ✓ 降噪麦克风阵列
  11. 电源管理系统

    • 功能:稳定供电与电池管理
    • 特点
      ✓ 18650锂电池(3000mAh)供电
      ✓ TP4056充电IC支持1A快充
      ✓ AMS1117-3.3V稳压芯片(1A输出)
  12. 机械结构设计

    • 功能:模块集成与人体工学支撑
    • 特点
      ✓ 防水防尘外壳(IP54等级)
      ✓ 可拆卸式传感器舱体设计
      ✓ 重量<450g(含电池)

二、腾讯云平台与微信小程序设计

2.1 登录云平台

地址:cloud.tencent.com/

【1】选择物联网平台

微信扫描即可快速登录,然后选择产品,物联网,选择物联网开发平台。

【2】进入产品控制台

链接: console.cloud.tencent.com/iotexplorer

【3】选择公共实例

2.2 新建项目

【1】新建项目

【2】填写项目名称

【3】项目创建完成

2.3 产品开发

【1】进入产品页

点击项目名称,进入产品开发页面。

【2】新建产品

【3】填写产品信息

产品品类选择自定义产品品类

【4】产品创建完成

2.4 设备开发

【1】进入设备配置页

点击产品名称,进入设备配置页面。

【2】配置物模型

选择自定义品类。

在本项目中,腾讯云IoT平台需要上传以下关键参数,这些参数按照功能模块分类如下:


1. 定位数据
参数名 数据类型 说明 上传频率
longitude float 经度(WGS84坐标系) 定时上传(如30秒/次) + 事件触发(越界时实时上报)
latitude float 纬度(WGS84坐标系) 同上
speed float 移动速度(km/h) 同上
timestamp int64 GPS时间戳(UTC毫秒) 同上

2. 健康监测数据

参数名 数据类型 说明 上传频率
heart_rate int 实时心率(bpm) 每分钟1次 + 异常时实时上报(超出阈值)
blood_oxygen int 血氧饱和度(%) 同上
health_status string 健康状态("normal"/"warning") 状态变化时上报

3. 安全报警事件
参数名 数据类型 说明 触发条件
fall_detected bool 跌倒事件(true/false) MPU6050触发算法判断为跌倒时实时上报
fence_alert string 电子围栏报警("enter"/"exit") GPS位置超出预设围栏范围时上报
sos_alert bool 紧急求助信号(true) 用户主动触发SOS按钮或语音指令时上报

4. 设备状态数据
参数名 数据类型 说明 上传频率
battery_level int 电池电量(0-100%) 每10分钟1次 + 低电量(<20%)时实时上报
light_intensity int 环境光照强度(Lux) 光线突变时上报(如夜间/隧道场景)
device_status string 设备状态("online"/"offline") 连接状态变化时上报

5. 用户交互数据
参数名 数据类型 说明 触发条件
voice_command string 语音指令内容(如"open_light") 用户语音交互时上报
find_cane bool 寻拐指令(true) 小程序触发寻拐功能时上报

数据协议说明
  1. 传输格式:采用JSON结构,示例:

    json 复制代码
    {
      "device_id": "CANE_001",
      "gps": {"longitude": 116.404, "latitude": 39.915, "speed": 1.2},
      "health": {"heart_rate": 75, "blood_oxygen": 98},
      "alerts": {"fall_detected": false, "fence_alert": ""},
      "timestamp": 1630000000000
    }
  2. 通信协议 :基于MQTT协议,通过腾讯云IoT Hub的Topic分类上传(如/health/gps/alerts)。

  3. 安全机制:数据加密采用TLS 1.2,设备通过三元组(ProductID/DeviceName/DeviceSecret)鉴权。

然后翻到最下面,点击下一步。

【3】设备开发-主题列表

设备开发页面有一个主题列表。可以了解到当前的主题信息。

cpp 复制代码
$thing/up/property/CS0SLTKSYA/${deviceName}	   发布	属性上报
$thing/down/property/CS0SLTKSYA/${deviceName}	订阅	属性下发与属性上报响应

这个页面不需要做什么,直接点击下一步即可。

【4】交互开发-配置小程序

(1)产品展示页
(2)快捷入口配置
(3)编辑面板
(4)产品页面

【5】设备调试-新建设备

创建完成。

设备的二维码: (打开微信小程序,搜索 腾讯连连,打开腾讯连连,扫描下面的二维码就可以绑定设备了)

设备信息:

cpp 复制代码
产品密匙:IyXmUW5sU/q1vnb5yzTkeQ==
产品ID:CS0SLTKSYA

【6】配置手机APP

如果除了小程序之外,还想使用手机APP,可以配置手机APP页面。

配置步骤和上面的微信程序一样。

2.5 设备登录

【1】MQTT协议

MQTT协议介绍:mcxiaoke.gitbooks.io/mqtt-cn/con...

cpp 复制代码
目前物联网通信支持 MQTT 标准协议接入(兼容3.1.1版本协议),具体的协议请参见 MQTT 3.1.1 协议文档。
和标准 MQTT 区别

1. 支持 MQTT 的 PUB、SUB、PING、PONG、CONNECT、DISCONNECT、UNSUB 等报文。
2. 支持 cleanSession。
3. 不支持 will、retain msg。
4. 不支持 QOS2。

【2】获取MQTT登录参数

就像我们登录QQ、登录微信需要账号密码一样,设备登录物联网平台也需要类似的东西。

官方文档地址: cloud.tencent.com/document/pr...

生成密匙直接使用python代码获取:

cpp 复制代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import base64
import hashlib
import hmac
import random
import string
import time
import sys
# 生成指定长度的随机字符串
def RandomConnid(length):
    return  ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(length))
# 生成接入物联网通信平台需要的各参数
def IotHmac(productID, devicename, devicePsk):
     # 1. 生成 connid 为一个随机字符串,方便后台定位问题
     connid   = RandomConnid(5)
     # 2. 生成过期时间,表示签名的过期时间,从纪元1970年1月1日 00:00:00 UTC 时间至今秒数的 UTF8 字符串
     expiry   = int(time.time()) + 30*24*60 * 60 *365
     # 3. 生成 MQTT 的 clientid 部分, 格式为 ${productid}${devicename}
     clientid = "{}{}".format(productID, devicename)
     # 4. 生成 MQTT 的 username 部分, 格式为 ${clientid};${sdkappid};${connid};${expiry}
     username = "{};12010126;{};{}".format(clientid, connid, expiry)
     # 5. 对 username 进行签名,生成token
     secret_key = devicePsk.encode('utf-8')  # convert to bytes
     data_to_sign = username.encode('utf-8')  # convert to bytes
     secret_key = base64.b64decode(secret_key)  # this is still bytes
     token = hmac.new(secret_key, data_to_sign, digestmod=hashlib.sha256).hexdigest()
     # 6. 根据物联网通信平台规则生成 password 字段
     password = "{};{}".format(token, "hmacsha256")
     return {
        "clientid" : clientid,
        "username" : username,
        "password" : password
     }
if __name__ == '__main__':
    # 参数分别填入: 产品ID,设备名称,设备密匙
    print(IotHmac("CS0SLTKSYA","dev1","IyXmUW5sU/q1vnb5yzTkeQ=="))
	

上面python的代码需要填入的参数从下面截图里获取:

运行得到的结果:

ini 复制代码
clientid CS0SLTKSYAdev1
username CS0SLTKSYAdev1;12010126;ZR5GT;2623045740
password 2debdc61b009ef8d09597f106f6f8ca36f101415459b0623780a81e711e7257c;hmacsha256

【3】MQTT主题订阅与发布

如果设备端想要得到APP页面的按钮状态就需要订阅属性下发和属性上报的响应,主题格式就是这样的:

主题订阅:

cpp 复制代码
$thing/down/property/CS0SLTKSYA/dev1

主题发布:

cpp 复制代码
$thing/up/property/CS0SLTKSYA/dev1

设备端向APP页面上报属性时,需要上传具体的数据,数据流的格式如下:

官方文档: cloud.tencent.com/document/pr...

比如:我的设备里有MQ2、MQ4、MQ7、MQ135、温度、湿度参数信息。

上传的格式如下。

cpp 复制代码
{"method":"report","clientToken":"123","params":{"MQ2":30,"MQ135":95,"MQ4":30,"MQ7":20,"DHT11_T":14,"DHT11_H":70}}

【4】物联网平台端口号与IP

官方文档: cloud.tencent.com/document/pr...

域名格式:<产品ID>.iotcloud.tencentdevices.com

cpp 复制代码
CS0SLTKSYA.iotcloud.tencentdevices.com

**得到域名对应的IP地址: ** 175.178.30.200

【5】模拟设备登录

为了方便测试,先使用MQTT客户端软件模拟硬件设备登录服务器。

依次填入参数之后,点击订阅主题、发布主题。

在设备调试页面,可以看到设备已经在线了:

打开设备页面,就能看到设备上传的数据:

【6】腾讯连连微信小程序

打开腾讯连连微信小程序绑定设备,就可以看到设备的数据了。

步骤如下:

打开微信,找到小程序。

右上角搜索,腾讯连接。

然后打开腾讯连连,添加设备,扫描设备的二维码。

添加成功。

看到的信息:

到此,腾讯物联网云平台部署完成。

三、STM32代码设计

当前项目使用的相关软件工具、模块源码已经上传到网盘:ccnr8sukk85n.feishu.cn/wiki/QjY8we...

3.1 接线说明

【1】模块接线说明表

模块名称 接口类型 STM32引脚 模块引脚名称 说明
GPS模块(ATGM336H) UART(串口3) PB10 TXD GPS → STM32(接收数据)
PB11 RXD STM32 → GPS(一般不使用)
蜂鸣器(有源) GPIO输出 PC13 IN 高电平触发蜂鸣
光敏传感器(模拟) ADC(模拟输入) PA1 AO 模拟电压输出
LED照明灯+MOS管 GPIO输出 PA8 Gate(N-MOS) 控制照明开关
心率血氧(MAX30102) I2C软件模拟 PB8 SCL 模拟I2C时钟
PB9 SDA 模拟I2C数据
MPU6050姿态传感器 I2C软件模拟 PB8 SCL 与 MAX30102 共用 I2C 总线
PB9 SDA 与 MAX30102 共用 I2C 总线
OLED显示屏(0.96寸 SPI) SPI(模拟) PB13 SCL SPI 时钟线
PB15 SDA(MOSI) SPI 数据线
PB11 RES 复位引脚
PB10 DC 数据/命令控制
4G模块(Air724UG) UART(串口2) PA2 RXD STM32 → 4G 模块
PA3 TXD 4G模块 → STM32
语音识别模块(V20) UART(串口1) PA9 TXD STM32 → 语音模块
PA10 RXD 语音模块 → STM32
供电与稳压模块 电源管理 VCC/GND VIN/VOUT/GND 3.7V锂电池 → TP4056 → AMS1117-3.3 → STM32供电
电池电压监测(选用) ADC PA3(例如) 分压输出 电压通过电阻分压后接ADC

【2】其他说明

  • 共用I2C总线说明 :MAX30102 和 MPU6050 都是 I2C 器件,使用 软件模拟 I2C,两者可并联接在 PB8(SCL)、PB9(SDA)上。
  • OLED 为 SPI 接口,但由于实际模块常无硬件SPI控制引脚定义,因此采用 GPIO 软件模拟 SPI。
  • 蜂鸣器、LED 为高电平触发,使用 GPIO 推挽输出方式控制。
  • TP4056 充电模块 接锂电池 + AMS1117-3.3 稳压为 STM32 和传感器提供稳定电源。
  • 串口分配
    • USART1:语音识别模块
    • USART2:4G通信模块
    • USART3:GPS模块

3.2 模块驱动代码

以下是项目中主要模块的寄存器开发代码,基于STM32F103RCT6,使用Keil5环境,寄存器裸机方式编写。


1. 系统时钟配置(SystemClock_Config.c)

c 复制代码
void RCC_Init(void) {
    RCC->APB2ENR |= 1 << 0;   // 开启AFIO
    RCC->APB2ENR |= 1 << 2;   // 开启GPIOA
    RCC->APB2ENR |= 1 << 3;   // 开启GPIOB
    RCC->APB2ENR |= 1 << 4;   // 开启GPIOC
    RCC->APB2ENR |= 1 << 14;  // 开启USART1
    RCC->APB1ENR |= 1 << 17;  // 开启USART2
    RCC->APB1ENR |= 1 << 18;  // 开启USART3
    RCC->APB1ENR |= 1 << 0;   // 开启TIM2
    RCC->APB1ENR |= 1 << 1;   // 开启TIM3
}

2. GPS模块(ATGM336H-5N,串口3)

c 复制代码
void USART3_Init(u32 bound) {
    RCC->APB2ENR |= 1<<3;     // 开GPIOB
    RCC->APB1ENR |= 1<<18;    // 开USART3

    GPIOB->CRH &= 0xFFFF00FF;     
    GPIOB->CRH |= 0x00008B00; // PB10复用推挽输出, PB11上拉输入

    USART3->BRR = 72000000 / bound;
    USART3->CR1 |= 1<<3 | 1<<2 | 1<<13; // 使能发送、接收、USART
}

3. 蜂鸣器控制(高电平触发)

c 复制代码
#define BEEP PCout(13)
void BEEP_Init(void) {
    RCC->APB2ENR |= 1<<4;
    GPIOC->CRH &= 0xFF0FFFFF;
    GPIOC->CRH |= 0x00300000; // 推挽输出
    BEEP = 0;
}

4. 光敏传感器(模拟输入)

c 复制代码
void ADC1_Init(void) {
    RCC->APB2ENR |= 1<<2 | 1<<9;     // GPIOA + ADC1
    RCC->CFGR |= 2<<14;              // PCLK2 = HCLK/6 = 72MHz/6 = 12MHz
    ADC1->CR2 |= 1<<0;               // 开启ADC
    ADC1->SMPR2 |= 7<<3;             // 通道1采样时间239.5 cycles
}

u16 Get_Light_Value(void) {
    ADC1->SQR3 = 1;                // 通道1
    ADC1->CR2 |= 1<<22;            // 启动转换
    while (!(ADC1->SR & 1<<1));
    return ADC1->DR;
}

5. LED照明模块

c 复制代码
#define LED PAout(8)
void LED_Init(void) {
    RCC->APB2ENR |= 1<<2;
    GPIOA->CRH &= 0xFFFFFFF0;
    GPIOA->CRH |= 0x00000003; // 推挽输出
    LED = 0;
}

6. 心率血氧传感器(MAX30102,I2C接口)

c 复制代码
#define SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF; GPIOB->CRH|=8<<12;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF; GPIOB->CRH|=3<<12;}

#define IIC_SCL PBout(8)
#define IIC_SDA PBout(9)
#define READ_SDA PBin(9)

void IIC_Init(void) {
    RCC->APB2ENR |= 1<<3;
    GPIOB->CRH |= 0x00030030; // PB8, PB9推挽输出
    IIC_SCL = 1;
    IIC_SDA = 1;
}

void MAX30102_WriteReg(u8 reg, u8 data) {
    IIC_Start();
    IIC_Send_Byte(0xAE); // 地址 + 写
    IIC_Send_Byte(reg);
    IIC_Send_Byte(data);
    IIC_Stop();
}

u8 MAX30102_ReadReg(u8 reg) {
    u8 res;
    IIC_Start();
    IIC_Send_Byte(0xAE);
    IIC_Send_Byte(reg);
    IIC_Start();
    IIC_Send_Byte(0xAF);  // 读
    res = IIC_Read_Byte(0);
    IIC_Stop();
    return res;
}

7. 姿态检测模块(MPU6050,I2C)

c 复制代码
void MPU6050_Init(void) {
    IIC_Init();
    MPU6050_WriteReg(0x6B, 0x00); // 解除休眠
    MPU6050_WriteReg(0x1C, 0x00); // ±2g
    MPU6050_WriteReg(0x1B, 0x00); // ±250°/s
}

short MPU6050_GetAccelY(void) {
    u8 H = MPU6050_ReadReg(0x3D);
    u8 L = MPU6050_ReadReg(0x3E);
    return (short)((H<<8)|L);
}

8. OLED显示模块(0.96寸SPI)

c 复制代码
#define OLED_SCL PBout(13)
#define OLED_SDA PBout(15)
#define OLED_RES PBout(11)
#define OLED_DC  PBout(10)

void OLED_Write_Byte(u8 dat, u8 cmd) {
    OLED_DC = cmd;
    for (u8 i=0; i<8; i++) {
        OLED_SCL = 0;
        OLED_SDA = (dat & 0x80) >> 7;
        dat <<= 1;
        OLED_SCL = 1;
    }
}

void OLED_Init(void) {
    OLED_RES = 0;
    delay_ms(100);
    OLED_RES = 1;

    OLED_Write_Byte(0xAE, 0);
    OLED_Write_Byte(0xD5, 0); OLED_Write_Byte(0x80, 0);
    OLED_Write_Byte(0xA8, 0); OLED_Write_Byte(0x3F, 0);
    OLED_Write_Byte(0xAF, 0); // 开显示
}

9. 4G模块(Air724UG,串口2,支持MQTT上传和短信发送)

c 复制代码
void USART2_Init(u32 bound) {
    RCC->APB2ENR |= 1<<2;
    RCC->APB1ENR |= 1<<17;

    GPIOA->CRL &= 0xFFFF00FF;
    GPIOA->CRL |= 0x00008B00; // PA2: TX  PA3: RX

    USART2->BRR = 72000000 / bound;
    USART2->CR1 |= 1<<13 | 1<<3 | 1<<2;
}

void GSM_Send_Cmd(char *cmd) {
    while (*cmd) {
        USART2->DR = *cmd++;
        while ((USART2->SR & 0x40) == 0);
    }
}

10. 语音识别模块(海凌科V20,串口1)

c 复制代码
void USART1_Init(u32 bound) {
    RCC->APB2ENR |= 1<<2 | 1<<14;

    GPIOA->CRH &= 0xFFFFF00F;
    GPIOA->CRH |= 0x000008B0; // PA9 TX, PA10 RX

    USART1->BRR = 72000000 / bound;
    USART1->CR1 |= 1<<13 | 1<<3 | 1<<2;
}

void V20_Send_Cmd(char *cmd) {
    while (*cmd) {
        USART1->DR = *cmd++;
        while ((USART1->SR & 0x40) == 0);
    }
}

11. 供电电压检测(使用ADC3通道)

c 复制代码
u16 Get_Voltage(void) {
    ADC1->SQR3 = 3;        // 选择ADC通道3
    ADC1->CR2 |= 1<<22;
    while (!(ADC1->SR & 1<<1));
    return ADC1->DR;
}

3.3 主函数框架代码

c 复制代码
#include "stm32f10x.h"
#include "delay.h"
#include "usart1.h"
#include "usart2.h"
#include "usart3.h"
#include "oled.h"
#include "mpu6050.h"
#include "max30102.h"
#include "adc.h"
#include "led.h"
#include "beep.h"
#include "iic.h"
#include "v20.h"
#include "gps.h"

void System_Init(void);

u16 heart_rate = 0;
u16 spo2 = 0;
u16 light_value = 0;
short accel_y = 0;

int main(void)
{
    delay_init();           // 系统延时初始化
    RCC_Init();             // 时钟初始化
    System_Init();          // 所有模块初始化

    OLED_ShowString(0, 0, "Smart Cane Init", 16);
    delay_ms(1000);
    OLED_Clear();

    while (1)
    {
        // 光敏检测控制LED灯
        light_value = Get_Light_Value();
        if (light_value < 1000)
            LED = 1;
        else
            LED = 0;

        // 获取心率和血氧
        heart_rate = MAX30102_GetHeartRate();
        spo2 = MAX30102_GetSpO2();

        // 显示信息
        OLED_ShowString(0, 0, "HR:", 16);
        OLED_ShowNum(32, 0, heart_rate, 3, 16);
        OLED_ShowString(0, 2, "SpO2:", 16);
        OLED_ShowNum(48, 2, spo2, 3, 16);

        // 获取加速度数据判断跌倒
        accel_y = MPU6050_GetAccelY();
        if (accel_y > 15000 || accel_y < -15000)
        {
            BEEP = 1;
            USART2_SendString("ALERT: Fall Detected\r\n");
            // 发送短信代码略
        }
        else
        {
            BEEP = 0;
        }

        // GPS数据接收处理
        if (USART3_RX_FLAG)
        {
            USART3_RX_FLAG = 0;
            GPS_Process(USART3_RX_BUFFER);
        }

        // 语音控制指令接收处理
        if (USART1_RX_FLAG)
        {
            USART1_RX_FLAG = 0;
            if (strstr((char*)USART1_RX_BUFFER, "light on"))
                LED = 1;
            else if (strstr((char*)USART1_RX_BUFFER, "light off"))
                LED = 0;
            else if (strstr((char*)USART1_RX_BUFFER, "call"))
                USART2_SendString("ATD10086;\r\n");
            else if (strstr((char*)USART1_RX_BUFFER, "sms"))
                USART2_SendString("AT+CMGS=\"13800138000\"\r\nHello!\x1A");
        }

    }
}

void System_Init(void)
{
    LED_Init();         // LED
    BEEP_Init();        // 蜂鸣器
    USART1_Init(115200);// 语音识别
    USART2_Init(115200);// 4G通信
    USART3_Init(9600);  // GPS
    OLED_Init();        // OLED显示
    ADC1_Init();        // 光敏传感器
    IIC_Init();         // I2C接口
    MPU6050_Init();     // MPU6050
    MAX30102_Init();    // 心率血氧
}

四、总结

本项目设计的智能拐杖基于STM32F103RCT6主控芯片,融合多传感器技术与物联网通信架构,实现了老年人安全监护与智能助行的创新结合。通过GPS/4G双模定位与云端数据同步,构建了包含实时定位、电子围栏、轨迹追溯的全方位位置监护系统,有效解决了传统拐杖功能单一的问题。

系统采用模块化设计思想,将生命体征监测、环境感知、语音交互等核心功能高度集成。MAX30102与MPU6050构成的生理-运动双模态检测体系,配合多级报警机制,显著提升了跌倒识别与健康异常预警的可靠性。光敏自适应照明与语音控制功能的人性化设计,体现了产品对特殊使用场景的深度适配。

基于腾讯云平台的微信小程序交互终端,实现了监护数据可视化与远程控制的便捷访问。这种"终端设备-云平台-移动应用"的三层架构,既保障了系统的实时响应能力,又为后续功能扩展预留了充足空间。项目在硬件选型上注重低功耗设计,通过电源管理优化确保了户外使用的续航能力。

该设计不仅提升了传统助行器具的技术附加值,更为智慧养老领域提供了可落地的解决方案。其多传感器数据融合的处理方法、边缘计算与云端协同的架构模式,对同类智能硬件开发具有参考价值。未来可通过加入机器学习算法优化跌倒识别精度,进一步拓展产品的应用场景与市场潜力。

相关推荐
做运维的阿瑞3 小时前
Python零基础入门:30分钟掌握核心语法与实战应用
开发语言·后端·python·算法·系统架构
猿究院-陆昱泽4 小时前
Redis 五大核心数据结构知识点梳理
redis·后端·中间件
yuriy.wang4 小时前
Spring IOC源码篇五 核心方法obtainFreshBeanFactory.doLoadBeanDefinitions
java·后端·spring
咖啡教室6 小时前
程序员应该掌握的网络命令telnet、ping和curl
运维·后端
你的人类朋友7 小时前
Let‘s Encrypt 免费获取 SSL、TLS 证书的原理
后端
老葱头蒸鸡7 小时前
(14)ASP.NET Core2.2 中的日志记录
后端·asp.net
李昊哲小课7 小时前
Spring Boot 基础教程
java·大数据·spring boot·后端
码事漫谈8 小时前
C++内存越界的幽灵:为什么代码运行正常,free时却崩溃了?
后端
Swift社区8 小时前
Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
java·spring boot·后端
90后的晨仔8 小时前
Mac 上配置多个 Gitee 账号的完整教程
前端·后端