DHT22单总线,按照湿度整数部分(1B)+湿度小数部分 (1B)+温度整数部分(1B)+温度小数部分(1B)+校验和(1B)格式对外发送数据,这里设置PTB5做数据口,
#define DHT22_GPIO_PIN 5
static const struct device *dht_gpio_dev;
dht_gpio_dev = DEVICE_DT_GET(DT_NODELABEL(gpiob));
主要读取函数:
int dht22_read(struct dht22_data *data)
{
uint8_t buf[5] = {0};
dht22_set_output(0);
k_msleep(18);
dht22_set_output(1);
delay_us(20);
dht22_set_input();
delay_us(30);
if (gpio_pin_get(dht_gpio_dev, DHT22_GPIO_PIN)) return -EIO;
while (!gpio_pin_get(dht_gpio_dev, DHT22_GPIO_PIN));
while (gpio_pin_get(dht_gpio_dev, DHT22_GPIO_PIN));
for (int i = 0; i < 5; i++) {
buf[i] = dht22_read_byte();
}
printk("Data=%02x %02x %02x %02x %02x\n",
buf[0], buf[1], buf[2], buf[3], buf[4]);
uint16_t check = buf[0] + buf[1] + buf[2] + buf[3];
if ((uint8_t)check != buf[4]) {
printk("Check fail\n");
return -EINVAL;
}
data->humidity = (buf[0] << 8 | buf[1]) / 10.0f;
data->temperature = ((buf[2] & 0x7F) << 8 | buf[3]) / 10.0f;
if (buf[2] & 0x80) data->temperature = -data->temperature;
return 0;
}
或者配置设备树:
/ {
aliases {
dht22 = &dht22;
};
dht22: dht22 {
compatible = "aosong,dht22";
dio-gpios = <&gpiob 5 GPIO_ACTIVE_LOW>; /* P500 */
status = "okay";
};
};
运行后可以看到温湿度数据:

我要赚赏金
