这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【e起DIY总结】基于NRF54L15-DK的BLE温湿度计:SHT30采集与手

共2条 1/1 1 跳转至

【e起DIY总结】基于NRF54L15-DK的BLE温湿度计:SHT30采集与手机端实时显示

助工
2026-06-23 00:26:15     打赏

本次项目基于 NRF54L15-DK 开发板和 SHT30 温湿度传感器,实现了一个可以通过手机查看数据的 BLE 温湿度计。整体流程分为两步:第一步通过 I2C 读取 SHT30 温湿度数据,第二步通过 BLE GATT Notify 将数据实时推送到手机端显示。

一、项目目标

本项目最终希望实现以下功能:

  1. NRF54L15-DK 通过 I2C 驱动 SHT30 温湿度传感器。

  2. 周期性读取温度和湿度数据。

  3. 对 SHT30 返回的数据进行 CRC 校验,保证数据可靠。

  4. 将温湿度数据转换为直观的字符串格式。

  5. 手机通过 nRF Connect 连接开发板,并实时接收温湿度数据。

二、硬件连接与供电注意事项

实验中使用的是淘宝购买的 SHT30 模块。刚开始调试时,传感器在 NRF54L15-DK 上一直无法正常驱动,但换到其他板卡后可以工作。经过排查,问题主要出在供电电压上。

SHT30 对电压比较敏感,本次实验中需要将 NRF54L15-DK 的 VDDIO 调整到 3.3V 后,I2C 通信才稳定正常。NRF54L15-DK 板载 nPM1300 电源管理芯片,可以通过 Board Configurator 修改 VDDIO 输出电压。

操作流程大致如下:

  1. 打开 Board Configurator。

  2. 选择对应的 NRF54L15-DK 开发板。

  3. 将 VDDIO 输出电压修改为 3.3V。

  4. 写入配置后重新编译烧录。

  5. 再通过 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 的读取过程可以概括为:

  1. 发送单次高精度测量命令。

  2. 等待传感器完成测量。

  3. 读取 6 字节原始数据。

  4. 对温度和湿度分别做 CRC 校验。

  5. 将原始数据换算为实际温度和湿度。

  6. 每 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:

  1. 开发板作为 BLE 外设。

  2. 手机主动连接开发板。

  3. 开发板创建自定义 GATT 服务。

  4. 温湿度数据放在特征值中。

  5. 手机开启 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

程序中需要完成以下工作:

  1. 初始化蓝牙协议栈。

  2. 设置设备名 SHT30_GATT。

  3. 创建自定义 128-bit UUID 的 GATT 服务。

  4. 创建支持 Read 和 Notify 的特征值。

  5. 监听手机是否开启 Notify。

  6. 连接成功后保存连接对象。

  7. 读取 SHT30 数据后,通过 Notify 推送给手机。

核心思路是:I2C 负责采集,GATT Characteristic 负责承载数据,Notify 负责主动推送。

八、手机端验证方法

使用 nRF Connect APP 验证时,步骤如下:

  1. 打开 nRF Connect。

  2. 扫描 BLE 设备,找到 SHT30_GATT。

  3. 点击连接。

  4. 展开 Unknown Service,也就是自定义服务。

  5. 找到对应特征值。

  6. 将数据显示格式切换为 UTF-8 或 String。

  7. 点击 Notify 按钮。

  8. 等待数据每 2 秒自动刷新。

如果一切正常,就可以在手机端看到实时温湿度字符串。

九、调试经验总结

这次实验中比较关键的点有几个:

  1. SHT30 供电电压要确认,NRF54L15-DK 上建议先把 VDDIO 调到 3.3V。

  2. I2C 地址要先扫描确认,本次使用的是 0x44。

  3. overlay 中的 I2C 总线和引脚必须与实际连接一致。

  4. 浮点打印需要打开 CONFIG_CBPRINTF_FP_SUPPORT。

  5. SHT30 数据建议加入 CRC 校验,提高稳定性。

  6. BLE 广播适合发送少量原始数据,但不适合直接做直观文本显示。

  7. 如果希望手机端实时看到可读数据,GATT Notify 更合适。

  8. nRF Connect 中要手动开启 Notify,否则只能读到静态值或看不到实时刷新。

相关详细文章:https://forum.eepw.com.cn/thread/400137/1
 https://forum.eepw.com.cn/thread/400138/1


专家
2026-06-23 08:42:48     打赏
2楼

感谢楼主分享


共2条 1/1 1 跳转至

回复

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