本次项目基于 NRF54L15-DK 开发板和 SHT30 温湿度传感器,实现了一个可以通过手机查看数据的 BLE 温湿度计。整体流程分为两步:第一步通过 I2C 读取 SHT30 温湿度数据,第二步通过 BLE GATT Notify 将数据实时推送到手机端显示。
一、项目目标
本项目最终希望实现以下功能:
NRF54L15-DK 通过 I2C 驱动 SHT30 温湿度传感器。
周期性读取温度和湿度数据。
对 SHT30 返回的数据进行 CRC 校验,保证数据可靠。
将温湿度数据转换为直观的字符串格式。
手机通过 nRF Connect 连接开发板,并实时接收温湿度数据。
二、硬件连接与供电注意事项
实验中使用的是淘宝购买的 SHT30 模块。刚开始调试时,传感器在 NRF54L15-DK 上一直无法正常驱动,但换到其他板卡后可以工作。经过排查,问题主要出在供电电压上。
SHT30 对电压比较敏感,本次实验中需要将 NRF54L15-DK 的 VDDIO 调整到 3.3V 后,I2C 通信才稳定正常。NRF54L15-DK 板载 nPM1300 电源管理芯片,可以通过 Board Configurator 修改 VDDIO 输出电压。
操作流程大致如下:
打开 Board Configurator。
选择对应的 NRF54L15-DK 开发板。
将 VDDIO 输出电压修改为 3.3V。
写入配置后重新编译烧录。
再通过 I2C 扫描确认 SHT30 地址。
本次实验中,SHT30 的 I2C 地址为 0x44。
三、Zephyr 设备树配置
I2C 部分通过 app.overlay 配置。实验中使用 i2c21,SCL 和 SDA 分别配置到 P1.11、P1.12,并开启上拉。
配置重点包括:
&i2c21 {
status = "okay";
clock-frequency = <I2C_BITRATE_STANDARD>;
sht3xd@44 {
compatible = "sensirion,sht3xd";
reg = <0x44>;
};
};引脚部分需要将 TWIM 的 SCL、SDA 绑定到实际接线的 GPIO 上:
&pinctrl {
i2c21_default: i2c21_default {
group1 {
psels = <NRF_PSEL(TWIM_SCL, 1, 11)>,
<NRF_PSEL(TWIM_SDA, 1, 12)>;
bias-pull-up;
};
};
};这里要特别注意,设备树中的 I2C 总线、引脚号和实际接线必须一致,否则程序能编译,但传感器读不到数据。
四、工程配置 prj.conf
第一阶段只需要先打开 I2C、打印和浮点数输出支持:
CONFIG_I2C=y CONFIG_PRINTK=y CONFIG_NRFX_TWIM=y CONFIG_CBPRINTF_FP_SUPPORT=y
其中 CONFIG_CBPRINTF_FP_SUPPORT=y 比较关键,如果不开启,串口打印浮点数时可能显示异常。
五、SHT30 数据读取流程
SHT30 的读取过程可以概括为:
发送单次高精度测量命令。
等待传感器完成测量。
读取 6 字节原始数据。
对温度和湿度分别做 CRC 校验。
将原始数据换算为实际温度和湿度。
每 2 秒循环读取一次。
SHT30 返回的数据格式为:
温度高字节、温度低字节、温度 CRC、 湿度高字节、湿度低字节、湿度 CRC
换算公式为:
温度 = -45 + 175 * raw_t / 65535 湿度 = 100 * raw_rh / 65535
加入 CRC 校验后,可以避免 I2C 通信异常时产生错误数据。调试阶段建议先通过串口打印原始数据和换算后的温湿度,确认 I2C 驱动部分工作正常,再进行 BLE 部分开发。
六、BLE 方案选择
一开始尝试直接把温湿度数据放进 BLE 广播包里,例如 Manufacturer Data。但实际用 nRF Connect 查看时,广播数据通常会显示为十六进制,不够直观。每次都要把 Hex 转成 ASCII,体验不太好。
因此最终改为使用 BLE GATT Server:
开发板作为 BLE 外设。
手机主动连接开发板。
开发板创建自定义 GATT 服务。
温湿度数据放在特征值中。
手机开启 Notify 后,开发板周期性推送字符串数据。
这样手机端就可以直接看到类似:
T:24.5C H:45.2%
这种人眼可读的数据。
七、BLE 配置
在原有 I2C 配置基础上,增加 BLE 外设相关配置:
CONFIG_BT=y CONFIG_BT_DEVICE_NAME="SHT30_GATT" CONFIG_BT_PERIPHERAL=y CONFIG_BT_GATT_CLIENT=n
程序中需要完成以下工作:
初始化蓝牙协议栈。
设置设备名 SHT30_GATT。
创建自定义 128-bit UUID 的 GATT 服务。
创建支持 Read 和 Notify 的特征值。
监听手机是否开启 Notify。
连接成功后保存连接对象。
读取 SHT30 数据后,通过 Notify 推送给手机。
核心思路是:I2C 负责采集,GATT Characteristic 负责承载数据,Notify 负责主动推送。
八、手机端验证方法
使用 nRF Connect APP 验证时,步骤如下:
打开 nRF Connect。
扫描 BLE 设备,找到 SHT30_GATT。
点击连接。
展开 Unknown Service,也就是自定义服务。
找到对应特征值。
将数据显示格式切换为 UTF-8 或 String。
点击 Notify 按钮。
等待数据每 2 秒自动刷新。
如果一切正常,就可以在手机端看到实时温湿度字符串。
九、调试经验总结
这次实验中比较关键的点有几个:
SHT30 供电电压要确认,NRF54L15-DK 上建议先把 VDDIO 调到 3.3V。
I2C 地址要先扫描确认,本次使用的是 0x44。
overlay 中的 I2C 总线和引脚必须与实际连接一致。
浮点打印需要打开 CONFIG_CBPRINTF_FP_SUPPORT。
SHT30 数据建议加入 CRC 校验,提高稳定性。
BLE 广播适合发送少量原始数据,但不适合直接做直观文本显示。
如果希望手机端实时看到可读数据,GATT Notify 更合适。
nRF Connect 中要手动开启 Notify,否则只能读到静态值或看不到实时刷新。
相关详细文章:https://forum.eepw.com.cn/thread/400137/1
https://forum.eepw.com.cn/thread/400138/1
我要赚赏金
