这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 终于搞定Zephyr开发环境啦!简单读取DHT11

共1条 1/1 1 跳转至

终于搞定Zephyr开发环境啦!简单读取DHT11

助工
2026-05-27 15:56:21     打赏

拿到开发板有段时间啦!Zephyr开发环境一直搞不定。来来回回折腾了好久。最终在群里老师的指导下,使用steam++翻墙,在家里的PC上,清早成功下载了Zephyr。然后再将家里下载成功的环境,通过U盘,拷贝到办公室的电脑上,终于在办公室的电脑上搭建起来了环境。

image.png

将下载好的环境拷贝到办公室的电脑上,解压,然后在vscode中,导入Zephyr。

b3352f3837c40e61f22a29a13afa577d.png

在这一步一定要留意,当对话框里出现“Loading……”时,一定要耐心等待。一开始以为这里是出错了呢!就直接关掉了vscode,然后重装,折腾了好久。其实只是电脑慢,等待几分钟,就能够下拉选择了。我的板子是MCXW72,所以开发板我选择了MCXW72。

ba42311db62417436ae9157618ee6c73.png

参考着论坛里老师的帖子,选择例程“dht_polling”。用这个例程项目来实现DHT11的读取。

c54d1bb4bad1a2f8a91eb44fd6b45e86.png

打开例程项目后,在boards里边添加一个文件,添加文件内容。用来指定DHT11对应的管脚。main文件不用动,就使用例程的。

c19e38106e0ab530bce6eee0fe7da236.png

/*
 * Copyright (c) 2023 Ian Morris
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#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;
}

DHT11接3.3v电压供电,信号脚接在板子J1上的第5脚。

image.png

编译程序,烧录。然后就可以通过打开串口,看见开发板读取到了温湿度信息啦!

14495e393007f4ad629aaf81db7de678.png

d3c6b0a0b2cc8dc16b16454290bcf74f.png

每次读取温湿度,板子上的绿灯就会闪烁一次。开发板终于可以玩起来啦!

image.png




共1条 1/1 1 跳转至

回复

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