这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 蓝牙低功耗温湿度计-成果帖

共1条 1/1 1 跳转至

蓝牙低功耗温湿度计-成果帖

菜鸟
2026-06-26 23:10:05   被打赏 35 分(兑奖)     打赏

1. 项目背景

本次项目基于 NXP FRDM-MCXW71 开发板,设计一个低功耗蓝牙温湿度计。系统通过外接 SHTC3 温湿度传感器采集环境温度和湿度,再由 MCXW71 通过 BLE 广播和 GATT 服务将数据发送到手机端。手机端使用 nRF Connect 进行扫描、连接、读取和 Notify 自动刷新验证。

项目目标不是单纯点亮 LED 或串口打印,而是完成一个较完整的 BLE 传感器节点原型,主要实现以下功能:

  1. FRDM-MCXW71 作为 BLE Peripheral 外设运行;

  2. SHTC3 采集温湿度;

  3. nRF Connect 扫描页可直接查看广播数据;

  4. nRF Connect 连接后可通过 GATT READ 读取温湿度;

  5. 开启 Notify 后温湿度自动刷新;

  6. 加入低功耗优化思路,降低广播频率、关闭调试串口、延长采样周期,并启用低功耗框架。

2. 硬件平台与软件环境

本项目使用的主要硬件如下:

开发板:NXP FRDM-MCXW71
主控芯片:MCXW71 系列无线 MCU
传感器:SHTC3 温湿度传感器
手机端工具:nRF Connect
调试接口:板载 MCU-Link / CMSIS-DAP
通信方式:BLE Advertising + BLE GATT
开发环境:VS Code + MCUXpresso for VS Code + MCUXpresso SDK + Arm GCC + CMake + Ninja

SHTC3 与 FRDM-MCXW71 的连接方式如下:

SHTC3 VCC  → 3V3
SHTC3 GND  → GND
SHTC3 SDA  → PTB4
SHTC3 SCL  → PTB5

这里需要注意一点:FRDM-MCXW71 板上的 PTB4 同时与板载蓝色 LED 相关,因此在本项目中 PTB4 被用作软件 I2C 的 SDA 后,不再建议同时用于 LED 控制,避免引脚功能冲突。

3. 开发板蓝牙固件烧录

MCXW71 这类无线 MCU 与普通 STM32 裸机开发有一个明显区别:BLE 应用不仅需要烧录主核应用程序,还需要确认无线子系统 NBU 中已经烧录了匹配 SDK 版本的 BLE Controller 固件。

如果 NBU 固件没有烧录,或者 NBU 中是 Thread、Matter、802.15.4 等其他协议固件,即使主程序编译和下载都正常,手机端也可能完全搜索不到 BLE 设备。因此,BLE 示例运行前需要先处理 NBU 固件。

本项目使用的是 BLE hosted 固件,文件名一般为:

mcxw71_nbu_ble_hosted.sb3

在本机 SDK 中,文件路径类似:

C:xxxxfrdm_mcxw71mcuxsdkmiddlewarewirelessble_controllerbinmcxw71_nbu_ble_hosted.sb3

不同 SDK 版本中目录名称可能略有差异,例如 ble_controller 或 ble-controller,实际以本地 SDK 目录为准。

使用的主要硬件如下:

开发板:NXP FRDM-MCXW71
主控芯片:MCXW71 系列无线 MCU
传感器:SHTC3 温湿度传感器
手机端工具:nRF Connect
调试接口:板载 MCU-Link / CMSIS-DAP
通信方式:BLE Advertising + BLE GATT
开发环境:VS Code + MCUXpresso for VS Code + MCUXpresso SDK + Arm GCC + CMake + Ninja

SHTC3 与 FRDM-MCXW71 的连接方式如下:

SHTC3 VCC  → 3V3
SHTC3 GND  → GND
SHTC3 SDA  → PTB4
SHTC3 SCL  → PTB5

这里需要注意一点:FRDM-MCXW71 板上的 PTB4 同时与板载蓝色 LED 相关,因此在本项目中 PTB4 被用作软件 I2C 的 SDA 后,不再建议同时用于 LED 控制,避免引脚功能冲突。

3.1 安装和检查 SPSDK 工具

烧录 NBU 固件需要使用 NXP SPSDK 工具,主要用到:

nxpdevscan
blhost

如果命令行中无法识别这些命令,可以在 Python 虚拟环境中安装 SPSDK:

python -m pip install --upgrade pip
python -m pip install --upgrade spsdk

安装完成后检查:

where nxpdevscan
where blhost
nxpdevscan --help
blhost --help

3.2 进入 ISP / mboot 模式

开发板进入 ISP 模式后,使用 nxpdevscan 可以扫描到 mboot 设备。例如可以看到类似信息:

Connected NXP UART Devices
Port: COM3
Type: mboot device

这里的 COM 口需要以实际电脑识别结果为准。本项目中识别到的是 COM3。

可以进一步使用:

blhost -p COM3 get-property 1

如果返回 Success 和 bootloader 版本信息,说明 ISP/mboot 通信正常。

3.3 烧录 NBU BLE 固件

确认 COM 口和 SB3 文件路径后,执行:

blhost -p COM3 receive-sb-file "C:xxxxfrdm_mcxw71mcuxsdkmiddlewarewirelessble_controllerbinmcxw71_nbu_ble_hosted.sb3"

烧录过程中不要拔掉 USB、不要复位开发板、不要关闭命令行窗口。等待进度到 100% 并返回 Success。

NBU 固件烧录完成后,需要复位或重新插拔开发板,使其退出 ISP 模式。之后再通过 VS Code / MCUXpresso for VS Code 下载主程序 ELF 文件。

4. 低功耗温湿度计设计思路

本项目的总体数据链路如下:

SHTC3 温湿度传感器
→ FRDM-MCXW71 采集温湿度
→ BLE 广播 Manufacturer Data
→ 手机 nRF Connect 扫描查看
→ 手机连接 BLE GATT 服务
→ READ / NOTIFY 获取温湿度

系统设计时分为两条数据通道。

第一条是 BLE 广播数据通道。该方式不需要手机连接,nRF Connect 只要扫描到设备,就可以在 Manufacturer Data 中看到温湿度数据。这种方式适合低功耗节点周期性广播状态,也适合快速演示。

第二条是 BLE GATT 数据通道。手机连接设备后,可以在 GATT 服务中看到 Temperature 和 Humidity 两个特征值。通过 READ 可以读取当前值,通过 Notify 可以让设备自动推送新数据。这种方式适合需要持续观察温湿度变化的场景。

为了兼顾演示效果和低功耗,项目分为调试版和低功耗版两种配置。调试版开启串口打印、缩短广播间隔、提高 Notify 频率,方便快速验证功能;低功耗版则关闭串口日志、拉长广播周期、降低温湿度采样频率,并启用低功耗框架。

5. 设计过程

5.1 BLE Peripheral 示例选择

在 MCUXpresso SDK 中,FRDM-MCXW71 提供了多个 BLE 示例,包括 Central、Peripheral、Shell、FSCI 等。由于本项目目标是让开发板作为温湿度传感器节点,被手机 nRF Connect 扫描和连接,因此应选择 Peripheral 方向的工程,而不是 Central 工程。

最终选择的基础工程为:

wireless_examples/reference_design/lowpower_peripheral/bm

选择裸机 bm 版本的原因是:工程结构相对简单,更接近传统单片机开发流程,适合在 STM32 裸机经验基础上继续迁移学习。

5.2 SHTC3 驱动设计

SHTC3 是一款 I2C 接口的温湿度传感器,常用 7-bit 地址为 0x70。基本测量流程为:

Wakeup
→ 发送测量命令
→ 等待转换完成
→ 读取 6 字节数据
→ CRC 校验
→ 换算温度和湿度
→ Sleep

SHTC3 读取到的是原始 ADC 数据,需要转换为实际物理量。温度和湿度的常用换算公式为:

Temperature = -45 + 175 × rawT / 65536
Humidity    = 100 × rawRH / 65536

为了让 BLE 数据更容易传输,本项目没有直接传浮点数,而是采用“实际值 ×100”的整数格式。例如:

28.62 ℃ → 2862
69.51 %RH → 6951

这样只需要 2 字节就可以表达温度或湿度,既节省 BLE 数据长度,也减少浮点处理带来的复杂度。

5.3 BLE 广播数据设计

广播数据使用 Manufacturer Data 携带温湿度。数据格式设计如下:

A1 01 TT TT HH HH BB SS

含义如下:

A1      项目标识
01      协议版本
TT TT   温度,小端格式,单位 0.01 ℃
HH HH   湿度,小端格式,单位 0.01 %RH
BB      电量百分比,当前为演示值
SS      数据序号

例如 nRF Connect 扫描页看到:

A1 01 2E 0B 27 1B 64 00

解析如下:

2E 0B → 0x0B2E = 2862 → 28.62 ℃
27 1B → 0x1B27 = 6951 → 69.51 %RH
64    → 100%
00    → 序号 0

这种广播方式的优点是手机不需要连接设备,只要扫描到广播包,就能看到温湿度数据。对于低功耗传感器节点来说,这是一种非常实用的数据上报方式。

5.4 GATT 服务设计

为了让 nRF Connect 连接后也能读取和订阅温湿度,本项目在 GATT 数据库中增加了温度和湿度特征值。

自定义服务 UUID 为:

01ff0200-ba5e-f4ee-5ca1-eb1e5e4b1ce0

服务下包含两个核心特征值:

Temperature
UUID: 0x2A6E
Properties: READ, NOTIFY
Humidity
UUID: 0x2A6F
Properties: READ, NOTIFY

READ 属性用于手机主动读取当前温湿度,NOTIFY 属性用于设备主动推送温湿度变化。

nRF Connect 连接后,需要分别点开 Temperature 和 Humidity,然后点击 Notify 图标。开启 Notify 后,开发板会周期性读取 SHTC3,并将最新温湿度推送到手机端。

5.5 Notify 自动刷新设计

最初版本中,连接后虽然可以看到 Temperature 和 Humidity 特征值,但需要手动 READ 才能看到数据变化。为了实现自动刷新,需要在程序中增加周期定时器。

基本逻辑如下:

手机连接设备
→ 手机开启 Temperature Notify 或 Humidity Notify
→ 程序启动 SHTC3 周期采样定时器
→ 定时读取 SHTC3
→ 更新 GATT 数据库中的温湿度值
→ 如果客户端订阅了 Notify,则发送通知
→ 手机 nRF Connect 自动刷新显示

在调试阶段,Notify 周期设置为 1 秒,便于快速观察数据变化。低功耗版本中,Notify 周期改为 5 秒,以降低采样频率和 BLE 通信频率。

5.6 连接保持与超时处理

NXP 原低功耗示例中存在连接超时断开逻辑,适合演示“连接一段时间后自动断开并进入低功耗”的场景。但温湿度计项目更希望手机连接后持续观察数据变化,因此需要关闭或延长连接超时。

调试过程中发现,如果只把连接超时设置为 0,而不处理相关回调函数,工程可能出现未使用函数警告。由于工程开启了 -Werror,普通 warning 会被当成 error,导致编译失败。因此需要用条件编译处理连接超时相关代码,使其在超时功能关闭时不参与编译。

处理思路如下:

#if defined(gAppConnectionTimeoutInSecs_c) && (gAppConnectionTimeoutInSecs_c > 0)
static void DisconnectTimerCallback(void* pParam);
#endif

函数定义部分也采用相同方式包裹:

#if defined(gAppConnectionTimeoutInSecs_c) && (gAppConnectionTimeoutInSecs_c > 0)
static void DisconnectTimerCallback(void* pParam)
{
    /* 超时断开处理 */
}
#endif

这样当连接超时关闭时,相关函数不会被编译,自然也不会触发 defined but not used 错误。

5.7 低功耗优化

完成基本功能后,对工程进行低功耗方向优化。主要优化点如下:

第一,关闭 Debug Console 和串口打印。调试阶段串口非常有用,但最终低功耗版本中,UART 和 PRINTF 会增加功耗,因此关闭串口日志。

第二,增大广播间隔。调试阶段为了让手机快速搜索到设备,广播间隔设置较短;低功耗版本中将广播间隔调整为约 1 秒,降低广播频率。

第三,设置广播超时。设备广播一段时间后如果没有连接,可以停止广播并进入无 BLE 活动状态,等待后续定时唤醒。

第四,降低 Notify 频率。温湿度变化通常比较慢,没有必要 1 秒刷新一次。低功耗版本中将 Notify 周期设置为 5 秒,兼顾实时性和功耗。

第五,启用低功耗框架。允许系统在 BLE 空闲间隙、广播间隙和连接间隙进入低功耗状态。

低功耗相关配置示例如下:

#define gDebugConsoleEnable_d             0
#define PANIC_ENABLE_LOG                  0
#define gAppUseSerialManager_c            0

#define gAppAdvertisingInterval           1600
#define gAppAdvTimeout_c                  30
#define gAppWakeUpTimerAfterNoActivityMs  10000

#define gAppLowpowerEnabled_d             1
#define gAppShtc3NotifyIntervalMs_c       5000U

需要说明的是,低功耗版本为了降低功耗默认关闭了串口打印,因此烧录后串口没有输出是正常现象。验证功能时主要依靠 nRF Connect 扫描、连接和 Notify 显示。

7. 设计结果

经过调试后,系统实现了以下结果:

  1. FRDM-MCXW71 可作为 BLE Peripheral 运行;

  2. 手机 nRF Connect 可以扫描到设备名 MCXW71_TH;

  3. 扫描页面可通过 Manufacturer Data 查看温湿度;

  4. 手机连接后可看到自定义 GATT 服务;

  5. GATT 服务下包含 Temperature 和 Humidity 两个特征值;

  6. Temperature 支持 READ 和 NOTIFY;

  7. Humidity 支持 READ 和 NOTIFY;

  8. 开启 Notify 后,温湿度可以自动刷新;

  9. 低功耗版本关闭了串口打印,降低了广播频率和 Notify 频率;

  10. 项目完成了从 BLE 固件烧录、传感器采集、广播数据组织、GATT 服务扩展到低功耗优化的完整流程。

nRF Connect 中读取到的数据仍采用小端整数格式。

image.png

文末有工程文件,再文件中添加"__repo__"文件夹即可烧录。

frdmmcxw71_lowpower_reference_design_ble_peripheral_bm.zip





关键词: 湿度计     功耗     蓝牙    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]