DHT11是一款数字温湿度传感器,只用1个GPIO即可完成通讯,通讯协议就不介绍了,网上都能搜到
先放上已经写好的驱动
接线
读数
接下来介绍如何使用,在代码中包含头文件my_dht11.h实现GPIO控制方法:
- #include "my_dht11.h"
- //设置输出电平
- void gpio_set_lev(MY_GPIO_DEV_Type *io,uint8_t lev)
- {
- if(lev)
- bflb_gpio_set(io->gpio, io->pin);
- else
- bflb_gpio_reset(io->gpio, io->pin);
- }
- //读取输入电平
- uint8_t gpio_get_lev(MY_GPIO_DEV_Type *io)
- {
- return bflb_gpio_read(io->gpio, io->pin);
- }
- //更改输入输出
- void gpio_inout(MY_GPIO_DEV_Type *io,uint8_t inout)
- {
- if(inout == MY_GPIO_ODIN)
- {
- bflb_gpio_init(io->gpio, io->pin, GPIO_INPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
- }
- else
- {
- bflb_gpio_init(io->gpio, io->pin, GPIO_OUTPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
- }
- }
复制代码 定义一个MY_DHT11_DEV_Type类型的结构体全局变量,然后按照下面的方法初始化
- struct bflb_device_s *gpio;
- MY_DHT11_DEV_Type dht11_dev;
- void dht11_init()
- {
- gpio = bflb_device_get_by_name("gpio");
- dht11_dev.gpio_dat.gpio = gpio;
- dht11_dev.gpio_dat.pin = GPIO_PIN_18;
- dht11_dev.dat_getlev_func = gpio_get_lev;
- dht11_dev.dat_setlev_func = gpio_set_lev;
- dht11_dev.dat_inout_func = gpio_inout;
- dht11_dev.delayus_func = bflb_mtimer_delay_us;
- MY_DHT11_Init(&dht11_dev);
- }
复制代码 在main函数中定时调用读取方法,注意读取到的温湿度都是放大10倍的
- int main(void)
- {
- int16_t tem,hum;
- board_init();
- dht11_init();
- gpio = bflb_device_get_by_name("gpio");
- bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_OUTPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
- while (1) {
- bflb_gpio_set(gpio, GPIO_PIN_12);
- bflb_mtimer_delay_ms(1000);
- bflb_gpio_reset(gpio, GPIO_PIN_12);
- bflb_mtimer_delay_ms(1000);
- if(MY_DHT11_ReadHT(&dht11_dev,&tem,&hum) == MY_DHT11_OK)
- printf("温度:%.1f℃ 湿度:%.1f%%\r\n",tem/10.0,hum/10.0);
- }
- }
复制代码
|