当前位置 博文首页 > freemote的博客:【玩转ESP32】4、ESP32驱动DHT11

    freemote的博客:【玩转ESP32】4、ESP32驱动DHT11

    作者:[db:作者] 时间:2021-07-05 09:57

    系列文章:
    【玩转ESP32】1、开发环境搭建
    【玩转ESP32】2、开发参考资料
    【玩转ESP32】3、点亮LED,Blink,blink,blink

    1、新建dht11工程

    把上节的blink工程复制一份,修改名称为dht11,其中CMakeLists.txt、Makefile、包括源文件名也改为dht11,然后试着编译,发现可以编译通过,这样就可以先不用去管CMakeLists.txt、Makefile等文件的编写。
    在这里插入图片描述

    3、硬件连接

    注意避开那几个只能用作输入的IO口即可。
    DHT11 开发板
    VCC <-----------> VCC
    GND <-----------> GND
    DOUT <------------>GPIO21(模块的丝印G21的引脚)
    在这里插入图片描述

    4、代码驱动

    #include <stdio.h>
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "driver/gpio.h"
    #include "sdkconfig.h"
    
    #define DHT11_PIN     (21)   //可通过宏定义,修改引脚
    
    #define DHT11_CLR     gpio_set_level(DHT11_PIN, 0) 
    #define DHT11_SET     gpio_set_level(DHT11_PIN, 1) 
    #define DHT11_IN      gpio_set_direction(DHT11_PIN, GPIO_MODE_INPUT)
    #define DHT11_OUT     gpio_set_direction(DHT11_PIN, GPIO_MODE_OUTPUT)
    
    uint8_t DHT11Data[4]={0};
    uint8_t Temp, Humi;
    
    //us延时函数,误差不能太大
    void DelayUs(  uint32_t nCount)  
    {
        ets_delay_us(nCount);
    }  
    
    void DHT11_Start(void)
    { 
      DHT11_OUT;      //设置端口方向
      DHT11_CLR;      //拉低端口  
      DelayUs(19*1000);   
    //   vTaskDelay(19 * portTICK_RATE_MS); //持续最低18ms;
    
      DHT11_SET;      //释放总线
      DelayUs(30);    //总线由上拉电阻拉高,主机延时30uS;
      DHT11_IN;       //设置端口方向
    
      while(!gpio_get_level(DHT11_PIN));   //DHT11等待80us低电平响应信号结束
      while(gpio_get_level(DHT11_PIN));//DHT11   将总线拉高80us
    }
    
    uint8_t DHT11_ReadValue(void)
    { 
      uint8_t i,sbuf=0;
      for(i=8;i>0;i--)
      {
        sbuf<<=1; 
        while(!gpio_get_level(DHT11_PIN));
        DelayUs(30);                        // 延时 30us 后检测数据线是否还是高电平 
        if(gpio_get_level(DHT11_PIN))
        {
          sbuf|=1;  
        }
        else
        {
          sbuf|=0;
        }
        while(gpio_get_level(DHT11_PIN));
      }
      return sbuf;   
    }
    
    uint8_t DHT11_ReadTemHum(uint8_t *buf)
    {
      uint8_t check;
    
      buf[0]=DHT11_ReadValue();
      buf[1]=DHT11_ReadValue();
      buf[2]=DHT11_ReadValue();
      buf[3]=DHT11_ReadValue();
        
      check =DHT11_ReadValue();
    
      if(check == buf[0]+buf[1]+buf[2]+buf[3])
        return 1;
      else
        return 0;
    } 
    
    void app_main(void)
    {
        printf(rrr"ESP32 DHT11 TEST:%s,%s!\r\n",__DATE__,__TIME__);
        gpio_pad_select_gpio(DHT11_PIN);
        while(1) {
            DHT11_Start();
            if(DHT11_ReadTemHum(DHT11Data))
            {
                Temp=DHT11Data[2];
                Humi=DHT11Data[0];      
                printf("Temp=%d, Humi=%d\r\n",Temp,Humi);
            }
            else
            {
                printf("DHT11 Error!\r\n");
            }
            vTaskDelay(5000 / portTICK_PERIOD_MS);
        }
    }
    

    5、读取温湿度

    在这里插入图片描述

    cs