【玩转ESP32】4、ESP32驱动DHT11

2021-03-25 15:31:33 浏览数 (1)

1、新建dht11工程

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

2、硬件连接

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

3、代码驱动

代码语言:javascript复制
#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!rn",__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=%drn",Temp,Humi);
        }
        else
        {
            printf("DHT11 Error!rn");
        }
        vTaskDelay(5000 / portTICK_PERIOD_MS);
    }
}

4、读取温湿度

0 人点赞