【e起DIY】低功耗蓝牙温湿度计:DHT11驱动
本文介绍了恩智浦 FRDM-MCXW71 开发板使用 Zephyr 开发环境实现 DHT11 获取环境温湿度并串口打印的项目设计,包括环境搭建、工程创建、工程代码、编译调试上传、效果演示等流程。
项目介绍
准备工作:硬件连接、流程图、开发环境准备等;
工程代码:包括主程序代码和配置文件代码;
编译上传:工程编译和固件上传等流程;
效果演示:使用串口调试插件显示打印的 DHT11 温湿度数据。
硬件连接
| DHT11 | FRDM-MCXW71 |
| VCC | 3V3 |
| DATA | PA19(Arduino D4 引脚) |
| GND | GND |
实物连接


DHT11 模块 PCB 设计详见:DHT11 模块 .
环境搭建
详见:【e起DIY】低功耗蓝牙温湿度计:介绍、环境搭建、工程测试 .
工程创建
从 Zephyr 仓库导入目标工程,在 快速启动面板 中点击 “从仓库导入示例” ;
开发板选择 frdm_mcxw71 开发板;
示例选择 zephyr/samples/sensor/dht_polling ;
应用程序类型,选择存储库应用程序;
点击导入,示例应会添加到项目视图中。


配置文件
展开左侧 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";
};保存文件。
流程图

工程代码
展开左侧 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("%16s: temp is %s%d.%d °C humidity is %s%d.%d %%RH\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;
}保存代码。
工程编译
点击“构建项目”图标即可构建项目;
构建结束后,终端视图显示内存使用情况;


工程调试
点击 Debug 图标以调试应用程序:
打开串口监视器工具,运行调试,可获取打印温湿度数据;


效果演示
用手触摸 DHT11 模块,模拟环境温湿度变化,串口打印数值随之变化;


总结
本文介绍了恩智浦 FRDM-MCXW71 开发板使用 Zephyr 开发环境实现 DHT11 获取环境温湿度并串口打印的项目设计,包括环境搭建、工程创建、工程代码、编译调试上传、效果演示等流程,为相关产品的快速开发和应用设计提供了参考。
我要赚赏金
