这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【e起DIY】低功耗蓝牙温湿度计:MQTT传输

共1条 1/1 1 跳转至

【e起DIY】低功耗蓝牙温湿度计:MQTT传输

工程师
2026-06-13 20:07:41     打赏

【e起DIY】低功耗蓝牙温湿度计:MQTT传输

本文介绍了恩智浦 FRDM-MCXW71 开发板使用 Zephyr 开发环境实现 DHT11 温湿度读取,并通过串口通信和蓝牙模块实现 MQTT 数据传输的项目设计,包括环境搭建、工程测试、关键代码、物联网 MQTT 接入、LabVIEW 上位机设计及数据采集等。

项目介绍

  • 准备工作:硬件连接、流程图、开发环境准备等;

  • 工程代码:包括主程序代码和配置文件代码;

  • 效果演示:编译上传,串口打印 JSON 消息与温湿度数据;

  • 物联网MQTT:接入云端 MQTT 服务器,实现消息转发与订阅;

  • LabVIEW 上位机:设计自动化数据采集的 labview 程序,实现温湿度演化曲线记录与存储。

硬件连接

传感器与开发板接线方式如下


DHT11MCXW71Note
DATAPA19(Arduino D4 引脚)Data line
GNDGNDGround
VCC3V3Power

为了实现 MQTT 通信,这里使用 D20 - DTU 模块,通过串口通信接口获取开发板采集的传感器温湿度数据,并转发至 MQTT 云端服务器;

D20 与开发板的接线方式如下

D20 - DTUMCXW71Note
TXRX - UART1(Arduino A0 引脚)Transmite
RXTX - UART1(Arduino A1 引脚)Receive
GNDGNDGround

实物图

connect_dht_mqtt.jpg

串口参数

  • 加载工程文件夹,在顶部搜索框输入 zephyr.dts 并打开 dht_polling 工程文件目录下的对应配置文件;

  • 搜索 zephyr,console 获取开发板对应的串口物理配置;

lpuart1_zephyr_dts.jpg

  • 由原理图可知 LPUART1 对应 PTC2 (RX) 和 PTC3 (TX) 引脚;

lpuart1_pinout.jpg

  • UART1 的 RX 和 TX 端分别对应 Arduino 的 A0 和 A1 引脚;

uart1_pinout.jpg

  • 若仅考虑温湿度上报,则连接 UART1 的发送引脚 A1 即可。

环境搭建

  • 下载 并安装 Visual Studio Code 软件;

  • 安装 MCUXpresso for VS Code 扩展插件;

  • 使用 MCUXpresso 安装程序搭建 Zephyr 开发环境。

详见:【e起DIY】低功耗蓝牙温湿度计:介绍、环境搭建、工程测试 .

流程图

flowchart_dht11_mqtt.jpg

工程创建

  • 从 Zephyr 仓库导入目标工程,在 快速启动面板 中点击 “从仓库导入示例” ;

  • 开发板选择 frdm_mcxw71 开发板;

  • 示例选择 zephyr/samples/sensor/dht_polling ;

  • 应用程序类型,选择存储库应用程序;

  • 点击导入,示例应会添加到项目视图中。

详见:【e起DIY】低功耗蓝牙温湿度计:DHT11驱动 .

配置文件

  • 展开左侧 Projects 目录,右击 dht_polling/Project Files/boards 文件夹;

  • 新建 frdm_mcxw71.overlay 配置文件;

  • 点击 frdm_mcxw71.overlay 并添加如下代码

 / {
  aliases {
   dht0 = &dht11_node;
  };
     dht11_node: dht11 {  
         compatible = "aosong,dht";  
         dio-gpios = <&gpioa 19 GPIO_ACTIVE_LOW>;  
         status = "okay";  
     }; 
 };
 
 &gpioa {  
     status = "okay";  
 };

保存文件。

详见:【e起DIY】低功耗蓝牙温湿度计:DHT11驱动 .

工程代码

展开左侧 Projects 目录,点击 dht_polling/Project Files/src/main.c 文件并打开

 #include <stdio.h>
 #include <stdlib.h>
 
 #include <zephyr/device.h>
 #include <zephyr/sys/util_macro.h>
 #include <zephyr/kernel.h>
 #include <zephyr/drivers/sensor.h>
 #include <zephyr/drivers/sensor_data_types.h>
 #include <zephyr/rtio/rtio.h>
 #include <zephyr/dsp/print_format.h>
 
 #define DHT_ALIAS(i) DT_ALIAS(_CONCAT(dht, i))
 #define DHT_DEVICE(i, _)                                                      \
  IF_ENABLED(DT_NODE_EXISTS(DHT_ALIAS(i)), (DEVICE_DT_GET(DHT_ALIAS(i)),))
 
 /* Support up to 10 temperature/humidity sensors */
 static const struct device *const sensors[] = {LISTIFY(10, DHT_DEVICE, ())};
 
 #define DHT_IODEV(i, _)                                                      \
  IF_ENABLED(DT_NODE_EXISTS(DHT_ALIAS(i)),                                 \
   (SENSOR_DT_READ_IODEV(_CONCAT(dht_iodev, i), DHT_ALIAS(i),           \
   {SENSOR_CHAN_AMBIENT_TEMP, 0},                                       \
   {SENSOR_CHAN_HUMIDITY, 0})))
 
 LISTIFY(10, DHT_IODEV, (;));
 
 #define DHT_IODEV_REF(i, _)                                                   \
  COND_CODE_1(DT_NODE_EXISTS(DHT_ALIAS(i)), (CONCAT(&dht_iodev, i)), (NULL))
 
 static struct rtio_iodev *dht_iodev[] = { LISTIFY(10, DHT_IODEV_REF, (,)) };
 
 RTIO_DEFINE(dht_ctx, 1, 1);
 
 int main(void)
 {
  int rc;
 
  for (size_t i = 0; i < ARRAY_SIZE(sensors); i++) {
   if (!device_is_ready(sensors[i])) {
    printk("sensor: device %s not ready.\n", sensors[i]->name);
    return 0;
   }
  }
 
  while (1) {
   for (size_t i = 0; i < ARRAY_SIZE(sensors); i++) {
    struct device *dev = (struct device *) sensors[i];
 
    uint8_t buf[128];
 
    rc = sensor_read(dht_iodev[i], &dht_ctx, buf, 128);
 
    if (rc != 0) {
     printk("%s: sensor_read() failed: %d\n", dev->name, rc);
     return rc;
    }
 
    const struct sensor_decoder_api *decoder;
 
    rc = sensor_get_decoder(dev, &decoder);
 
    if (rc != 0) {
     printk("%s: sensor_get_decode() failed: %d\n", dev->name, rc);
     return rc;
    }
 
    uint32_t temp_fit = 0;
    struct sensor_q31_data temp_data = {0};
 
    decoder->decode(buf,
      (struct sensor_chan_spec) {SENSOR_CHAN_AMBIENT_TEMP, 0},
      &temp_fit, 1, &temp_data);
 
    uint32_t hum_fit = 0;
    struct sensor_q31_data hum_data = {0};
 
    decoder->decode(buf,
      (struct sensor_chan_spec) {SENSOR_CHAN_HUMIDITY, 0},
      &hum_fit, 1, &hum_data);
 
    printk("{\"dev\":\"%s\",\"temp\":%s%d.%d,\"humidity\":%s%d.%d}\n", dev->name,
     PRIq_arg(temp_data.readings[0].temperature, 2, temp_data.shift),
     PRIq_arg(hum_data.readings[0].humidity, 2, hum_data.shift));
   }
   k_msleep(1000);
  }
  return 0;
 }

保存代码。

效果演示

  • 打开串口调试助手软件,配置串口参数并连接;

  • 连续接收 DHT11 温湿度 JSON 消息;

dht_print_json.jpg

MQTT

使用 DTU 模块实现温湿度 JSON 报文的 MQTT 上传。

DTU 配置

  • 使用 USB 转 TTL 工具,连接 DTU 模块和电脑;

  • 打开 DTU 配置软件,配置 WiFi 信息;

  • 打开模式配置标签页,工作模式 MQTT,服务器地址为 iot.kittenbot.cn ,端口 1883,发布主题定义等;

dtu_config.jpg

云服务器

物联网 IoT 云端平台使用 KZone喵星球

  • 打开物联网 IoT 服务器平台 https://kzone2.kittenbot.cn/iot-studio

  • 进入 话题中心 界面,点击小齿轮(设置)按钮,配置服务器地址、前缀路径等;

  • kitt_topic_setting.jpg

  • 进入 话题中心 模块,新建话题;

kitt_topic_new.jpg

  • 配置话题,包括 ID、Topic、描述备注等;

  • 打开目标话题,接收 MCXW71 发送的传感器数据;

dht_data_mqtt_message.jpg

详见:快速开始 | IoT Studio .

MQTTX

  • 安装并运行 MQTTX 客户端;

  • 新建连接,输入 IoT 服务器地址 iot.kittenbot.cn ,端口 1883 等参数;

  • 点击 Connect 按钮,连接 MQTT 服务器;

  • 添加订阅主题,连续接收温湿度的 JSON 消息;

mqttx_dht_message.jpg


LabVIEW 上位机

包括前面板和程序面板设计。

前面板

前面板设计包括IoT服务器地址、订阅主题、实时演化曲线、数据保存等模块。

labview_front_panel.jpg

程序面板

程序面板采用模块化设计,将 MQTT 服务器配置封装,JSON 消息接收与数据提取,确保任务稳定执行。

labview_bock_panel.jpg

数据采集

  • 配置目标 MQTT 服务器地址、端口、订阅主题 Topic,运行程序;

  • 点击 START 按钮,接入 MQTT 服务器,连续接收温湿度数据;

动态演示

  • LabVIEW 程序运行后,当目标订阅主题接收到数据时,便执行 JSON 消息解析,提取温度和湿度数据;

  • 多种显示方案,包括指针仪表盘、演化曲线、数组等;

labview_dht_mqtt.jpg


数据存储

  • 数据采集完成后,点击 Quit 按钮终止程序,数据自动存储至目标路径;

  • 数据保存格式为第一列日期,第二列时间,第三列温度值,第四列湿度值;

labview_data_save.jpg


总结

本文介绍了恩智浦 FRDM-MCXW71 开发板使用 Zephyr 开发环境实现 DHT11 温湿度读取,并通过串口通信和蓝牙模块实现 MQTT 数据传输的项目设计,包括环境搭建、工程测试、关键代码、物联网 MQTT 接入、LabVIEW 上位机设计及数据的自动化采集等,为相关产品在工业物联网领域的快速开发和应用设计提供了参考。





关键词: 开发板     mqtt     物联网     zephyr     传感器    

共1条 1/1 1 跳转至

回复

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