基于FRDM-MCXW71开发的低功耗蓝牙温湿度计模块
一、项目背景
在现代智能家居、工业监测、农业大棚、冷链物流等众多应用场景中,温湿度始终是最基础、最核心的环境参数。精准的环境温湿度监测对于保障产品质量、优化能源管理、提升居住舒适度以及确保工业设备正常运行具有重要意义。传统的温湿度监测手段主要依赖有线设备,存在部署不灵活、布线成本高、覆盖范围有限等突出痛点;而基于蓝牙低功耗(Bluetooth Low Energy,BLE)技术的无线温湿度计则凭借部署自由、低功耗、可手机直连等天然优势,逐渐成为行业主流解决方案。
本项目中选用的MCXW71系列MCU具备一系列领先的技术参数,为低功耗蓝牙温湿度计的实现提供了核心硬件基础。MCXW71搭载一颗主频为96MHz的Arm® Cortex®-M33内核,配备1MB应用闪存与128KB SRAM,并采用独立的无线子系统——包含一颗专用Cortex-M3内核、256KB无线电闪存和88KB专用SRAM,用于处理无线协议栈,从而将主CPU资源全面释放给应用层任务,MCXW71支持蓝牙5.3远距离通信协议,在1Mbit/s模式下接收灵敏度达-97.5dBm,在125kB/s远距离编码模式下灵敏度可达-106 dBm,具备优异的无线覆盖能力;其接收电流仅4.7mA,在0dBm发射功率下的发射电流仅4.6mA,实现了超低功耗运行,此外,MCXW71集成了EdgeLock®安全区域内核配置文件,并支持恩智浦EdgeLock 2GO密钥和证书管理服务,从硬件层面保障物联网设备的数据安全。
二、项目目标与要求
本项目旨在基于NXP FRDM-MCXW71开发板,设计并实现一个可稳定运行的低功耗蓝牙温湿度计模块。具体目标包括:实现外接数字温湿度传感器DHT22对周围环境温湿度数据的精准采集;完成BLE协议栈的配置与移植,使设备以低功耗广播/连接模式将数据无线发送至手机端等中央设备;对系统功耗进行针对性优化,使模块在满足实时数据传输需求的前提下具备较长的电池使用寿命。通过本项目,期望形成一套完整可复用的“传感器 + BLE”端到端开发方案,为后续更复杂的多节点无线传感网络或低功耗物联网产品提供可靠的技术原型与实践经验。具体任务要求如下:
1.硬件连接与平台搭建
• 搭建 Zephyr 开发环境,安装 west 工具链与 SDK
• 验证开发板可通过 MCU-Link 调试接口正常烧录程序
2. SHT30 传感器驱动开发
• 完成 NXP FRDM-MCXW71 开发板与 DHT22 传感器的物理连接
• 实现温度与湿度数据读取函数, 在串口终端打印原始数据与解析后的温湿度值,格式为:Temperature: 23.5°C, Humidity: 45.2%RH
3.蓝牙功能的实现
启用蓝牙相关配置选项,使用NXP蓝牙APP与开发板建立关联。
4.实现低耗优化
配置系统进入深度睡眠模式,仅每 30 秒唤醒一次进行采样与广播,设置传感器间歇供电控制,采样完成后关闭 I2C 总线电源。
5.制作微信小程序,并实现实时环境实时监测。
下面,本文将会以项目硬件、项目环境搭建、项目软件、成果演示这四个方面对低功耗蓝牙温湿度计模块进行设计研究。
三、项目硬件
模块主要硬件选型如下:
NXP FRDM-MCXW71开发板
SEN0137 DHT22温湿度传感器
三根公对母杜邦线
USB Type-C接口数据线
在主要硬件选择完毕后,查阅开发板的设计手册,除3.3V、GND线连接完成后,选择开发板GPIOC_5引脚作为数据引脚,具体硬件连线图如下图所示。

四、项目环境搭建
NXP FRDM-MCXW71开发板支持VS Code、IAR、Keil等多工具开发。本模块选择VS Code作为模块开发工具。同时,MCUXpresso for Visual Studio Code为代码编辑和开发提供了优化的嵌入式开发体验。该扩展使 NXP 开发者能够使用最受欢迎的嵌入式编辑器工具之一,并提供了基于 MCUXpresso SDK 或 Zephyr 项目的简单快速创建、构建和调试应用程序的方法。本模块软件需求如下:
IDE:Visual Studio Code 1.123.0
适用于 VS Code 版本 v25.12.64 及以上的 MCUXpresso 扩展
MCUXpresso Installer v26.03
Windows 11操作系统
串口终端程序MobaXterm
nRF Connect蓝牙工具
其中,在MCUXpresso Installer中一定要下载的内容如下(括号内容为本模块下载的版本):
MCUXpresso SDK Developer(v26.03)
Zephyr Developer(v4.4)
Arm GNU Toolchain(v14.2.1)
Standalone Toolchain Add ons(v14.2.2)
Zephyr SDK(v1.0.1)
Linkserver(v26.05)
SEGGER J-Link(v9.30)
PEmicro(v10.02)


由于篇幅限制,此处不再过多赘述环境搭建步骤。详细Zepher环境搭建方法、下载蓝牙固件等可参考文末官方教程(FRDM-MCXW72_Zephyr_Lab.pdf)。下图是环境搭建好后VS Code的显示。

五、项目软件
完整项目软件包括两个工程,一是低功耗蓝牙温湿度计Zephyr工程(low_bluetooth),二是微信小程序实时监测工程(wx-Bluetooth),文末附件提供了两个工程,下面将会对两个工程进行详细描述。
A:low_bluetooth工程
在编写模块软件代码之前,我们需要明白利用Zephyr搭建工程所需要的文件架构,如图:

从上图可以得知,完成项目工程所需要编写的代码有四个:
1、main.c——应用程序主逻辑
包括核心逻辑实现文件,负责:
(1)初始化硬件和协议栈:调用 bt_enable() 初始化蓝牙,通过 DEVICE_DT_GET(DHT_NODE) 获取 DHT22 传感器设备实例。
(2)实现业务功能:
i.周期读取 DHT22 的温度和湿度数据(通过 sensor_sample_fetch + sensor_channel_get)。
ii.将数据缓存在全局变量中(cached_temperature, cached_humidity)。
iii.通过串口(printk)输出数据,格式为 Temperature: xx.x°C, Humidity: xx.x%RH。
(3)提供蓝牙 GATT 服务:
i.定义自定义服务和特征(温度、湿度只读特征)。
ii.实现特征读取回调函数(read_temp, read_humid),将缓存的浮点数转换为整数(×100)后返回给蓝牙客户端(如微信小程序)。
(4)低功耗与电源管理:
i.实现传感器间歇供电控制(sensor_power_control)—— 读取前上电,读取后断电。
ii.主循环中调用 k_sleep(K_SECONDS(30)),使系统进入深度睡眠 30 秒(配合电源管理配置),实现低功耗优化。
由于main.c代码过长,本文不再详述,完整main.c代码见文末附件。
2、prj.conf——项目Kconfig配置文件
prj.conf 用于配置 Zephyr 内核及各个子系统的编译选项(通过 Kconfig 机制)。它决定了哪些功能模块被包含、内核行为如何。prj.conf代码如下:
# 基础 CONFIG_STDOUT_CONSOLE=y CONFIG_PRINTK=y # DHT22 驱动 CONFIG_DHT=y CONFIG_SENSOR=y CONFIG_GPIO=y # 蓝牙 CONFIG_BT=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_DEVICE_NAME="DHT22_Env_Monitor" CONFIG_BT_DEVICE_APPEARANCE=1092 # 栈保护 CONFIG_MAIN_STACK_SIZE=8192 CONFIG_STACK_SENTINEL=y CONFIG_INIT_STACKS=y CONFIG_EXTRA_EXCEPTION_INFO=y # 设置(可选) CONFIG_SETTINGS=y
各内容具体作用如下:
启用必要的外设驱动:CONFIG_DHT=y、CONFIG_SENSOR=y、CONFIG_GPIO=y —— 使能 DHT22 传感器驱动及依赖。
配置蓝牙功能:CONFIG_BT=y、CONFIG_BT_PERIPHERAL=y —— 使能蓝牙协议栈并使设备作为外设角色;CONFIG_BT_DEVICE_NAME 设置广播名称;CONFIG_BT_DEVICE_APPEARANCE 设置设备外观类别。
提高调试与稳定性:CONFIG_MAIN_STACK_SIZE=8192 增加主栈大小防止栈溢出;CONFIG_STACK_SENTINEL=y 检测栈溢出;CONFIG_EXTRA_EXCEPTION_INFO=y 输出详细的故障信息。
3、frdm_mcxw71.overlay —— 设备树覆盖文件
设备树(Device Tree)描述了硬件的外设、引脚连接和资源。.overlay 文件用于在不修改官方板级设备树的前提下,添加或覆盖节点,以适应自定义硬件连接。代码如下:
/ {
aliases {
dht0 = &dht22_sensor;
};
};
&gpioc {
dht22_sensor: dht-sensor-0 {
compatible = "aosong,dht";
status = "okay";
/* J1-4 对应 PTC5,必须使用 GPIO_ACTIVE_LOW */
dio-gpios = <&gpioc 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
dht22; /* 明确声明传感器型号 */
};
};上述代码指明,模块需将DHT22的数据引脚连接到gpioc的 pin 5(J1-4 插针),使 Zephyr 能在运行时找到并初始化该传感器。
4、CMakeLists.txt —— 构建系统配置
CMakeLists.txt 是 CMake 构建脚本,用于组织源文件、设置编译选项、链接库等。在 Zephyr 项目中,它通常是极简的,因为大部分配置由 prj.conf 和设备树完成。其内容如下:
# SPDX-License-Identifier: Apache-2.0
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(low_bluetooth)
target_sources(app PRIVATE src/main.c)引入 Zephyr 构建系统:find_package(Zephyr ...) 会加载 Zephyr 的 CMake 模块,自动处理编译器、链接器、设备树生成等。
指定应用程序源文件:target_sources(app PRIVATE src/main.c) 告诉构建系统需要编译 main.c。如果你有多个 .c 文件,可以依次添加。
可选的包含路径、全局宏定义:一般不在此文件中修改,而是通过 prj.conf 或设备树进行。
作用:它是连接你的源代码与 Zephyr 复杂构建流程的桥梁,确保最终生成可烧录的镜像(.hex, .elf, .bin)。
B:wx-Bluetooth工程
本项目在编写微信小程序代码时使用了微信开发者工具,关于如何开发并申请微信小程序过程本文不再赘述,下文将根据项目构架对各代码作用进行描述。
完整微信小程序工程包括下图代码组成:

工程中需要编写的代码文件包括以下四个:
1、index.js —— 页面逻辑与蓝牙核心控制
index.js 是页面的 JavaScript 逻辑文件,负责处理用户交互、调用微信小程序 API 实现蓝牙通信、管理页面数据。在你的项目中,它主要承担以下职责:
(1)蓝牙生命周期管理:
i.初始化蓝牙适配器(wx.openBluetoothAdapter)
ii.扫描设备(wx.startBluetoothDevicesDiscovery),过滤目标设备名 DHT22_Env_Monitor
iii.连接设备(wx.createBLEConnection)
iiii.获取服务和特征值(wx.getBLEDeviceServices、wx.getBLEDeviceCharacteristics)
(2)数据读取与解析:
i.定时读取温湿度特征值(wx.readBLECharacteristicValue)
ii.监听特征值变化(wx.onBLECharacteristicValueChange),将接收到的 ArrayBuffer 按小端序解析为 Int32,再除以 100 还原为浮点数
(3)UI 数据绑定:
i.通过 this.setData() 更新页面的 temperature、humidity、logList、连接状态等
(4)辅助功能:
i.连接/断开按钮的交互逻辑
ii.调试日志输出(addLog),方便排查问题
iii.页面卸载时关闭蓝牙连接和定时器,释放资源
2、index.wxml——页面结构描述
index.wxml 是 WXML(WeiXin Markup Language)文件,用于描述页面的 UI 结构和组件布局。它类似于 HTML,但包含微信小程序的专用组件和语法。在项目中,index.wxml 定义了以下界面元素:
(1)状态卡片:显示当前蓝牙连接状态(已连接/未连接)
(2)数据卡片:展示温度和湿度的数值,使用 {{temperature}} 和 {{humidity}} 绑定 index.js 中的数据
(3)按钮组:连接设备和断开设备的按钮,绑定 bindtap 事件到对应的 JS 函数(connectDevice、disconnectDevice)
(4)调试日志区域:使用 `` 循环展示 logList 数组中的每条日志,支持错误项高亮
3、index.wxss —— 页面样式表
index.wxss 是 WXSS(WeiXin Style Sheet)文件,用于定义页面的外观样式,类似于网页中的 CSS。
它负责控制:
(1)布局:使用 flex 布局、边距、圆角、背景渐变等
(2)颜色与字体:状态卡片白色背景、数据卡片紫色渐变背景、温度湿度数值大字号、日志区域黑色背景等
(3)响应式:通过 rpx 单位实现不同屏幕适配
(4)滚动区域:日志容器固定高度并允许滚动(overflow-y: scroll)
4、app.json——全局应用配置
app.json 是微信小程序的全局配置文件,位于项目的根目录。它不针对单个页面,而是定义整个小程序的行为和窗口样式。
在项目中,app.json 主要配置了:
(1)页面路径:"pages": ["pages/index/index"] —— 指定小程序包含哪些页面,且第一个为启动页。
(2)窗口样式:"navigationBarTitleText": "环境监测" —— 设置导航栏标题;"navigationBarBackgroundColor": "#ffffff" 设置背景色。
(3)权限声明:"permission": { "scope.bluetooth": { "desc": "需要蓝牙权限以连接设备读取温湿度数据" } } —— 在用户首次使用蓝牙时弹窗说明用途,这是必须配置的,否则无法调用蓝牙 API。
wx-Bluetooth工程的代码见文末附件。
六、成果演示
在进行成果演示前,还需要烧写蓝牙处理器固件,这里我参考了https://forum.eepw.com.cn/thread/399760/1/#1这位大佬写的【FRDM-MCXW71】过程帖:基于Zephyr的BLE心率计测试,选择的NBU固件为mcxw71_nbu_ble.sb3。
同时,建议在编写自己的项目工程前先试运行Zephyr提供的demo例程,以确保项目搭建环境无误。
1、打开VS Code,点击MCUXpresso 扩展以打开low_bluetooth工程。
2、点击Build Project。


保证项目编译无误。
3、用USB Type-C数据线将开发板与主机连接,在主机能识别到开发板串口信息后,点击Debug。

开发板状态如图

4、打开串口监视器软件,设置波特率115200。

可以看到串口已打印出温湿度数据(Temperature: 25.20°C, Humidity: 55.40%RH),同时,为了实现低功耗模式,开发板会以30s为间隔开启传感器进行采样。
5、打开手机中的nRF Connect蓝牙软件,点击SCAN。
6、找到“DHT22_Env_Monitor”,点击CONNECT。

7、在CLIENT页面下点击Unknown Service,下面会出现两个不同UUID的Unknown Characteristic,根据代码分析,UUID为12345678-1234-5678-1234-56789abcdef1是温度数据,UUID为12345678-1234-5678-1234-56789abcdef2是湿度数据,两个数据的值(Value)是以十六进制数据显示的,需将这两个十六进制数据转化为十进制数据,再除以100,即为环境温湿度数据。

数据0A-0A-00-00转化后为25.70。
数据C2-15-00-00转化后为55.70。
8、打开微信小程序“温湿度检测计”,点击连接设备。

小程序即会显示当前温湿度数据并播报调试日志。
至此,整个低功耗蓝牙温湿度计模块演示完成。
七、结论
综合上述内容,本研究实现了以下功能:
1、环境数据采集
硬件连接:通过设备树覆盖文件 (.overlay) 将 DHT22 的 DATA 引脚连接到 FRDM-MCXW71 开发板的 PTC5(J1-4 插针),并配置了上拉电阻和低电平有效。
驱动集成:利用 Zephyr 内置的 aosong,dht 驱动,通过 sensor_sample_fetch() 和 sensor_channel_get() 读取温度和湿度原始值,并转换为浮点数(摄氏度、相对湿度百分比)。
串口输出:每隔 30 秒通过 printk 在串口终端输出格式化的数据,例如:Temperature: 23.5°C, Humidity: 45.2%RH。
2、低功耗优化
深度睡眠:主循环中使用 k_sleep(K_SECONDS(30)),配合电源管理配置 (CONFIG_PM=y、CONFIG_TICKLESS_KERNEL=y),使得系统在空闲时自动进入深度睡眠,仅每 30 秒唤醒一次进行采样和蓝牙广播。
传感器间歇供电:设计了 sensor_power_control() 函数(可扩展实际 GPIO 控制),在采样前给传感器上电,采样完成后立即断电,进一步降低系统平均功耗。
3、蓝牙功能
外设角色:配置为 BLE 外设,设备名称为 DHT22_Env_Monitor,广播时携带自定义服务 UUID,可被手机等中心设备扫描发现。
自定义 GATT 服务:
定义了一个 128-bit 的服务 UUID(12345678-1234-5678-1234-56789abcdef0)。
包含两个只读特征:温度特征和湿度特征,各自使用独立的 128-bit UUID。
数据交互:
当中心设备(如微信小程序)读取温度或湿度特征时,GATT 回调函数会将缓存的浮点数乘以 100 转换为 int32 整数,以小端序返回。
支持 iOS/Android 通用 BLE 调试工具(如 nRF Connect)直接连接和读取数据。
4、微信小程序功能
蓝牙连接管理:
自动扫描并连接名为 DHT22_Env_Monitor 的设备。
获取自定义服务和特征值,支持手动连接/断开。
实时数据读取:
定时(每 2 秒)读取温度和湿度特征值。
将接收到的 4 字节 int32 数据除以 100,还原为浮点数并显示在界面上。
提供调试日志窗口,记录蓝牙操作步骤,便于问题排查。
用户界面:包含状态指示、数据卡片、操作按钮和日志区域,界面美观且适配移动端。
八、附件

我要赚赏金
