跳到主要内容

3 - 蓝牙通信与温湿度采集

课程定位: 5天IoT实训 · 第三天
主题: DX-BT24 蓝牙模块驱动 · DHT11 温湿度采集 · 数据帧协议扩展 · 小程序联调
项目: WXMP-IOT — 微信小程序中控系统
目标硬件: STM32F407ZET6 + BLE DX-BT24 + DHT11


一、课程回顾与架构升级

复习STM32工程目录结构与项目解耦

复习AI工具的三层使用与未来的第三层

Day 2 完成了小程序通过 BLE 控制 LED 的基础链路。Day 3 在此基础上:

  • 接入 DHT11 温湿度传感器,扩展数据帧协议
  • 实现小程序实时显示温湿度折线图
  • 梳理嵌入式软件开发流程与文档体系

参考文档:嵌入式软件开发流程 & 文档体系


二、DX-BT24 蓝牙模块

2.1 模块特性

DX-BT24 是透传型 BLE 模块,默认上电即广播,无需 AT 指令初始化。

特性说明
工作模式透传模式(默认),上电即广播
默认波特率9600 bps
接口UART(9600, 8N1)
透传原理小程序 BLE 发送 → 模块串口转发给 STM32 → STM32 串口回复 → 模块发给小程序,完全透明

2.2 硬件引脚连接

STM32 引脚功能连接备注
PA2 (UART2 TX)发送→ BLE 模块 RX9600, 8N1
PA3 (UART2 RX)接收← BLE 模块 TX中断 + 环形缓冲

2.3 UART 接口分配

UART波特率用途数据格式
UART1115200PC 调试 / 透传原始帧数据
UART29600BLE DX-BT24 通信原始帧数据 / JSON
UART3115200ESP8266 Wi-Fi 模块原始帧数据 / JSON

2.4 BLE 控制数据帧(DevID 0x31)

控制蓝牙模块开播/关播:

帧格式: AA 05 31 [操作] [SUM]

操作含义完整帧SUM 计算
0x01蓝牙开播(广播)AA 05 31 01 E1AA+05+31+01=0xE1
0x00蓝牙关播AA 05 31 00 E0AA+05+31+00=0xE0

2.5 测试工具

调试 BLE 模块可使用大夏龙雀官方测试 APP,也可以用自己写小程序验证串口透传。

微信测试小程序

大夏龙雀微信测试小程序二维码

2.6 连接蓝牙后调试结构图

连接蓝牙外设后调试蓝牙控制小灯结构图


三、DHT11 温湿度模块

3.1 硬件引脚

STM32 引脚功能备注
PG9DHT11 DQ 单总线数据需 4.7kΩ 上拉,输入/输出模式动态切换

3.2 通讯协议(DevID 0x21)

下行控制帧(上位机 → MCU)

控制 MCU 开启或关闭温湿度定时发送功能。

帧格式: AA [LEN] 21 [CMD] [SUM]

字节索引定义长度说明
0帧头1 B固定 0xAA
1数据总长度 LEN1 B固定 0x05
2DevID1 B固定 0x21
3控制命令 CMD1 B0xFF 开启 / 0x00 关闭
4SUM 校验1 B(AA + LEN + DevID + CMD) & 0xFF

示例:

操作SUM 计算
开启发送AA 05 21 FF CFAA+05+21+FF=0x1CF → 0xCF
关闭发送AA 05 21 00 D0AA+05+21+00=0xD0

上行上报帧(MCU → 上位机)

MCU 定时上报或响应 PING,JSON 格式负载:

帧格式: AA [LEN] 21 [JSON_DATA] [SUM]

字段说明
temp温度,float,单位 ℃,保留两位小数,如 25.00
humi湿度,float,单位 %,保留两位小数,如 60.00

完整示例(温度 25℃,湿度 60%):

JSON 内容:{"temp":25.00,"humi":60.00}  (27 字节)
LEN = 1(LEN) + 1(DevID) + 27(JSON) + 1(SUM) = 30 = 0x1E
完整帧:AA 1E 21 7B 22 74 65 6D 70 22 3A 32 35 2E 30 30 2C 22 68 75 6D 69 22 3A 36 30 2E 30 30 7D [SUM]
SUM = (AA + 1E + 21 + JSON所有字节之和) & 0xFF

3.3 调试流程

DHT11温湿度的调试流程

DHT11修改数据帧结构添加启动温湿度开关

MCU 固件逻辑(C 语言):

解析串口数据:收到 AA 05 21 FF CF 则开启定时上报(10秒/次)。上报时读取 DHT11 整数值,格式化为 {"temp":XX.00,"humi":YY.00}。封装帧:帧头 AA,总长度,DevID 0x21,JSON 内容,最后计算全字节 SUM 校验。

上位机解析逻辑(Python):

监听串口,查找 0xAA 帧头。根据第 2 字节(LEN)确定包长度。验证 SUM:前 LEN+1 字节之和的低 8 位等于最后字节。校验通过且 DevID 为 0x21 时,解析 JSON 获取温湿度并展示。


四、小程序联调效果


五、开发文档体系

开发过程中产生的文档

嵌入式项目开发的完整文档链路:

文档类型内容时机
发送给AI的文档硬件引脚、协议帧格式、代码约束开发前给 AI 提供上下文
Bug 记录与修复现象 + 根因 + 修复方案调试过程中实时记录
通讯协议手册所有 DevID、帧格式、SUM 计算联调前与小程序端对齐

六、Bug 记录与修复

Bug 1:温湿度串口无法显示

现象: 发送 AA 05 21 FF CF 后,UART1 无 JSON 输出,BLE 也收不到数据。

根因: protocol.cjson_buf[24] 缓冲区太小。

JSON {"temp":25.00,"humi":60.00} 实际 27 字节
json_buf 只有 24 字节
snprintf 返回 27,触发 json_len >= sizeof(json_buf) → 提前 return

修复:

问题错误值修复值
json_buf 大小[24][32](预留余量)
LEN 字段计算json_len + 3json_len + 4(AA + LEN + DevID + JSON + SUM)

验证: 重新编译烧录后,发送 AA 05 21 FF CF,等待 10 秒,UART1 出现 JSON 帧和调试打印,BLE 同步收到数据。

Bug 2:小程序温湿度数据格式不匹配

现象: 小程序无法解析温湿度数据。

原因: 小程序端期望的是控制指令 + JSON 数据包格式,而固件发送的格式与协议文档不一致。

修复: 统一按协议手册(DevID 0x21,JSON 负载)对齐固件与小程序端解析逻辑。

📲 扫码联系
微信二维码微信咨询
关注公众号关注公众号