100 篇文章精通 STM32F103(第 22 篇):蓝牙 BLE 通信实战 —— 低功耗无线数据传输

内容分享13小时前发布
0 0 0

大家好!在前 21 篇中,我们实现了低功耗的电池供电设备,但这类设备(如户外传感器、便携监测器)往往需要 “无线传输数据”(避免布线麻烦),而蓝牙 BLE(Bluetooth Low Energy,低功耗蓝牙) 是最佳选择 —— 它兼顾低功耗(待机电流 μA 级)与短距离无线通信(10~100 米),完美适配电池供电场景。这一篇我们将从蓝牙 BLE 的核心原理讲起,详解 STM32 与 BLE 模块(HC-08)的通信配置,通过 “低功耗蓝牙温湿度传感器” 的实操,让你掌握 “采集→低功耗→无线传输” 的完整开发流程,实现设备与手机 / 电脑的无线数据交互。

一、什么是蓝牙 BLE?用 “对讲机” 理解核心逻辑

蓝牙 BLE 是蓝牙技术联盟推出的低功耗无线通信协议,核心定位是 “短距离、低功耗、低速率” 的设备互联,就像 “微型对讲机”:

主设备(手机 / 电脑):像对讲机的 “接收端”,主动扫描并连接从设备,获取数据(如查看温湿度);从设备(STM32+BLE 模块):像对讲机的 “发送端”,周期性广播自身信息(如设备名称),等待连接后传输数据(如温湿度);通信链路:连接建立后,通过 “特征值(Characteristic)” 传输数据 —— 从设备将数据写入特征值,主设备读取特征值获取数据,类似 “对讲机的专属频道”;低功耗关键:未连接时仅周期性广播(间隔 100ms~10s,功耗 μA 级),连接后按需传输数据,传输完成后快速进入休眠。

蓝牙 BLE 与传统蓝牙的核心差异

特性 蓝牙 BLE(低功耗) 传统蓝牙(经典蓝牙)
功耗 极低(待机 μA 级,传输 mA 级) 较高(待机 mA 级,传输 10~50mA)
传输速率 低(最高 2Mbps,实际常用 10kbps) 高(最高 3Mbps,适合传音频)
通信距离 中(10~100 米,视环境) 近(10 米内)
适用场景 传感器数据、设备控制(低速率) 音频传输、文件同步(高速率)

二、蓝牙 BLE 通信的核心概念:从广播到数据传输

BLE 的通信流程分为 “广播→连接→数据传输” 三个阶段,核心依赖 “GATT 协议(通用属性配置文件)” 定义数据交互格式,关键概念如下:

1. 核心角色与广播

广播(Advertising):从设备周期性发送 “广播包”(包含设备名称、UUID 等信息),主设备通过扫描发现从设备;UUID(通用唯一识别码):用于标识设备的 “服务(Service)” 和 “特征值(Characteristic)”—— 比如 “温湿度服务 UUID” 为
0000FFF0-0000-1000-8000-00805F9B34FB
,其下的 “温度特征值 UUID” 为
0000FFF1-0000-1000-8000-00805F9B34FB
连接建立:主设备扫描到广播包后,发送 “连接请求”,从设备响应后建立稳定链路(默认连接间隔 100ms~1s,间隔越大功耗越低)。

2. GATT 数据结构:服务与特征值

BLE 的数据传输通过 “服务 – 特征值” 的层级结构实现,类似 “文件夹 – 文件”:

服务(Service):一组相关功能的集合(如 “温湿度监测服务” 包含温度、湿度两个特征值);特征值(Characteristic):实际存储数据的单元,支持 “读(Read)”“写(Write)”“通知(Notify)” 三种操作:
读:主设备主动读取特征值的数据(如手机查看当前温度);写:主设备向特征值写入数据(如手机发送 “采样间隔调整” 指令);通知:从设备主动将数据推送至主设备(无需主设备请求,实时性强,功耗低)。

本文以 “通知” 操作为主(最适合传感器数据实时传输,功耗最低)。

三、实操:STM32+HC-08 BLE 模块实现温湿度无线传输

我们基于第 21 篇的 “低功耗温湿度传感器”,新增蓝牙 BLE 模块,实现功能:

STM32 采集温湿度数据后,通过 UART 发送给 HC-08 BLE 模块;HC-08 将数据封装为 BLE 特征值,以 “通知” 方式推送给已连接的手机;手机通过 BLE 调试 APP(如 “nRF Connect”)接收并显示数据;未连接时,STM32 与 HC-08 均进入低功耗模式,确保电池续航。

1. 硬件准备与连接

硬件 型号 / 规格 连接方式(STM32→BLE 模块) 作用
STM32F103C8T6 主控制器,采集温湿度
BLE 模块 HC-08(从模式,UART 接口) TX→PA10(USART1_RX),RX→PA9(USART1_TX),VCC→3.3V,GND→GND 无线数据传输
温湿度传感器 SHT30(I2C) SCL→PB6,SDA→PB7 采集温湿度数据
纽扣电池 CR2032(3V) 供电给 STM32 和 HC-08(总功耗≈100μA) 电池供电

关键说明

HC-08 是 UART 接口的 BLE 从模块,默认波特率 9600,通过 AT 指令可修改设备名称、波特率、UUID 等(如 AT+NAME=STM32_BLE,设置设备名称为 “STM32_BLE”);HC-08 支持低功耗模式:未连接时自动进入休眠(电流≈10μA),连接后根据数据传输需求调整功耗。

2. 配置步骤(STM32CubeIDE)

步骤 1:配置 USART1(与 HC-08 通信)

进入 “Pinout & Configuration”→“Connectivity”→“USART1”;配置为 “异步模式(Asynchronous)”:
波特率:9600(与 HC-08 默认波特率一致);数据位:8 Bits;校验位:None;停止位:1;引脚:PA9(TX)、PA10(RX)(复用功能)。

步骤 2:保留低功耗与温湿度采集配置

沿用第 21 篇的配置:

RTC 定时唤醒(每 1 分钟唤醒一次);I2C1(SHT30)、SPI Flash(数据存储);停止模式(进入低功耗时关闭 USART1 时钟,降低功耗)。

步骤 3:生成代码

点击 “Generate Code”,CubeIDE 自动生成 USART1、I2C1、RTC 的初始化代码。

3. 编写 BLE 数据传输代码

(1)HC-08 BLE 模块初始化(ble.c)



#include "ble.h"
#include "usart.h"
#include <string.h>
 
extern UART_HandleTypeDef huart1;
 
// BLE发送数据(格式化温湿度为“Temp:25.5,Humi:60.2
”)
void BLE_Send_Data(float temp, float humi)
{
  char data_buf[32];
  // 格式化数据(适配BLE特征值长度,避免过长)
  sprintf(data_buf, "Temp:%.1f,Humi:%.1f", temp, humi);
  // 通过USART1发送给HC-08(HC-08会自动封装为BLE通知)
  HAL_UART_Transmit(&huart1, (uint8_t*)data_buf, strlen(data_buf), 100);
  // 发送结束符(可选,便于APP解析)
  HAL_UART_Transmit(&huart1, (uint8_t*)"
", 2, 100);
}
 
// BLE模块低功耗控制(进入停止模式前关闭USART1)
void BLE_Enter_LowPower(void)
{
  __HAL_RCC_USART1_CLK_DISABLE(); // 关闭USART1时钟
  HAL_UART_DeInit(&huart1);       // 复位USART1外设
}
 
// BLE模块唤醒(从停止模式唤醒后重新初始化USART1)
void BLE_Wakeup(void)
{
  MX_USART1_Init(); // 重新初始化USART1
}
(2)主程序逻辑(main.c)

整合 “采集→存储→BLE 传输→低功耗” 流程:



#include "main.h"
#include "rtc.h"
#include "power.h"
#include "sht30.h"
#include "w25qxx.h"
#include "ble.h"
 
float temp, humi;
uint32_t data_addr = 0x000000; // SPI Flash存储地址
 
int main(void)
{
  HAL_Init();
  SystemClock_Config();
 
  // 初始化外设
  MX_GPIO_Init();
  MX_USART1_Init();
  MX_I2C1_Init();
  MX_SPI1_Init();
  MX_RTC_Init();
 
  // 初始化各模块
  RTC_Alarm_Init();    // RTC闹钟(1分钟唤醒)
  SHT30_Init();        // 温湿度传感器
  W25Q_Init();         // SPI Flash
  // HC-08无需额外初始化,上电后自动进入广播模式
 
  while (1)
  {
    // 1. 唤醒BLE模块(重新初始化USART1)
    BLE_Wakeup();
 
    // 2. 采集温湿度数据
    SHT30_Read_Data(&temp, &humi);
    printf("采集数据:Temp=%.1f℃, Humi=%.1f%%
", temp, humi);
 
    // 3. 存储数据到SPI Flash
    char data_buf[16];
    sprintf(data_buf, "%.1f,%.1f
", temp, humi);
    W25Q_WritePage(data_addr, (uint8_t*)data_buf, strlen(data_buf));
    data_addr += 10;
    if (data_addr > 0x00FFFF) data_addr = 0x000000;
 
    // 4. BLE传输数据(推送给手机)
    BLE_Send_Data(temp, humi);
    printf("BLE已发送数据
");
 
    // 5. BLE进入低功耗,STM32进入停止模式
    BLE_Enter_LowPower();
    Enter_Stop_Mode(); // 1分钟后被RTC唤醒,重复循环
  }
}

4. 手机端验证(使用 nRF Connect APP)

下载并打开 “nRF Connect”(手机应用商店可搜);点击 “SCAN”,扫描附近的 BLE 设备,找到名称为 “STM32_BLE” 的设备(HC-08 默认名称可通过 AT 指令修改);点击 “CONNECT” 建立连接,在 “Services” 中找到 HC-08 的 “通知特征值”(通常 UUID 为
0000FFF1-...
);勾选特征值后的 “Notify” 选项,等待 STM32 唤醒传输数据 ——APP 会实时显示 “Temp:XX.X,Humi:XX.X”,证明无线传输成功。

5. 功耗与续航验证

工作阶段(1 分钟内的 10ms):STM32 采集 + BLE 传输,总功耗≈10mA(持续 10ms);低功耗阶段(1 分钟内的 59.99 秒):STM32 停止模式(50μA)+ HC-08 休眠(10μA),总功耗≈60μA;平均功耗:≈(10mA×0.01s + 60μA×59.99s)/60s ≈ 61.6μA;续航估算:CR2032 电池(220mAh)续航≈220mAh / 0.0616mA ≈ 3571 小时 ≈ 148 天(满足低功耗需求)。

四、蓝牙 BLE 通信常见问题与调试技巧

手机扫描不到 BLE 设备?

模块未上电:确认 HC-08 的 VCC 接 3.3V(勿接 5V,会烧毁),GND 与 STM32 共地;波特率不匹配:HC-08 默认波特率 9600,若修改过需重新配置 STM32 的 USART 波特率(可通过 AT 指令恢复默认:AT+BAUD4,对应 9600);模块进入休眠:HC-08 未连接时广播间隔默认 1 秒,若间隔过长(如 10 秒),需耐心等待扫描;可通过 AT 指令缩短广播间隔(AT+ADV=100,设为 100ms)。

连接后接收不到数据?

未开启 “Notify”:手机 APP 必须勾选特征值的 “Notify” 选项,否则从设备无法主动推送数据;USART 数据传输错误:用 USB 转 TTL 模块连接 HC-08 的 TX/RX,监听 STM32 发送的数据是否正确(若乱码,检查波特率 / 数据位 / 校验位);数据长度超限:BLE 特征值单次传输最大 20 字节,需确保
BLE_Send_Data
中格式化的数据长度≤20 字节(如 “Temp:25.5,Humi:60.2” 共 18 字节,符合要求)。

功耗高于预期?

连接间隔过短:默认连接间隔 100ms,可通过 AT 指令增大间隔(AT+INT=1000,设为 1 秒),间隔越大功耗越低;未关闭 USART 时钟:STM32 进入低功耗前必须调用
BLE_Enter_LowPower
关闭 USART1 时钟,否则 USART 外设会消耗 mA 级电流。

五、第 22 篇总结与下一篇预告

总结

这一篇我们掌握了蓝牙 BLE 通信的核心:

BLE 以低功耗为核心,适合短距离传感器数据传输,通过 “广播→连接→通知” 实现数据交互;STM32 与 HC-08 通过 UART 通信,数据经模块封装为 BLE 特征值,以 “通知” 方式推送给手机;实操中实现了 “低功耗采集→无线传输→手机显示” 的完整流程,平均功耗≈61.6μA,续航达 148 天,兼顾功能与续航。

下一篇预告

当设备需要 “远程传输数据”(如跨城市、跨区域)时,蓝牙 BLE 的短距离限制无法满足需求,此时NB-IoT(窄带物联网) 成为最佳选择(通信距离无限制,依赖运营商网络)。第 23 篇我们将学习 “STM32+NB-IoT 模块(BC26)” 的开发,实现 “温湿度数据上传至云平台” 的实操,让你掌握广域物联网设备的开发技术。

© 版权声明

相关文章

暂无评论

none
暂无评论...