《DNESP32P4开辟指南_V1.0》第三十二章 DHT11实行

[复制链接]
发表于 2026-6-29 15:28:02 | 显示全部楼层 |阅读模式
第三十二章 DHT11实行
本章,我们将先容数字温湿度传感器DHT11的利用,与前一章的温度传感器相比,该传感器不光能测温度,还能测湿度。我们将学习怎样获取DHT11传感器的温湿度数据,并把数据表现在LCD上。
本章分为如下几个末节:
32.1 DHT11先容
32.2 硬件计划
32.3 步调计划
32.4 下载验证
32.1 DHT11先容
32.1.1 DHT11简介
DHT11是一款温湿度一体化的数字传感器,实物图如下图所示。

图32.1.1.1 DHT11实物图
该传感器包罗一个电容式测湿元件和一个NTC测温元件,并与一个高性能8位单片机相毗连。通过单片机等微处置惩罚器简朴的电路毗连就可以或许实时的收罗当地湿度和温度。DHT11与单片机之间能采取简朴的单总线举行通讯,仅仅须要一个I/O口。传感器内部湿度和温度数据40Bit的数据一次性传给单片机,数据采取校验和方式举行校验,有效的包管数据传输的正确性。DHT11功耗很低,5V电源电压下,工作匀称最大电流0.5mA。
DHT11的技能参数如下:
        工作电压范围:3.3V ~ 5.5V
        工作电流:匀称0.5mA
        输出:单总线数字信号
        丈量范围:湿度5 ~ 95%RH,温度-20 ~ 60℃
        精度:湿度±5%,温度±2℃
        分辨率:湿度1%,温度0.1℃
DHT11的管脚分列如下图所示:

图32.1.1.2 DHT11管脚分列图
32.1.2 DHT11时序先容
固然DHT11与DS18B20雷同,都是单总线访问,但是DHT11的访问,相对DS18B20来说简朴许多。下面我们先来看看DHT11的数据结构。
DHT11数字温湿度传感器采取单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5byte(40bit)构成。数据分小数部门和整数部门,一次完备的数据传输为40bit,高位先处。DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数部门+8bit校验和。此中校验和数据为前面四个字节相加。
传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处置惩罚。比方,某次从DHT11读到的数据如下图所示:

图32.1.2.1 某次读取到DHT11数据
由以上数据就可得到湿度和温度的值,盘算方法:
湿度 = byte4 . byte3 = 45.0(%RH)
温度 = byte2 . byte1 = 28.0(℃)
校验 = byte4 + byte3 + byte2 + byte1 = 73 (= 湿度 + 温度) (校验正确)
可以看出,DHT11的数据格式非常简朴的,DHT11和MCU的一次通讯最大为34ms左右,发起主机一连读取时间隔断不要小于2s。
下面,我们先容一下DHT11的传输时序。DHT11的数据发送流程如下图所示。

图32.1.2.2 DHT11数据发送流程图
起首主机发送开始信号,即:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(1035us)时间,然后读取DHT11的相应,正常的话,DHT11会拉低数据线,保持t3(7888us)时间,作为相应信号,然后DHT11拉高数据线,保持t4(80~92us)时间后,开始输出数据。
DHT11输出数字‘0’时序如下图所示。

图32.1.2.3 DHT11数字‘0’时序图
DHT11输出数字‘1’的时序如下图所示:

图32.1.2.4 DHT11输出数字‘1’时序图
DHT11输出数字‘0’和‘1’时序,一开始都是DHT11拉低数据线54us,反面拉高数据线保持的时间就不一样,数字‘0’就是2327us,而数字‘1’就是6874us。
通过以上相识,我们就可以通过ESP32-S3来实现对DHT11的读取了。
DHT11的先容就到这里,更详细的先容,请参考DHT11的数据手册。
32.2 硬件计划
32.2.1 例程功能
DHT11每隔100ms左右读取一次数据,并把温度和湿度表现在LCD上。LED0闪灼用于提示步调正在运行。
32.2.2 硬件资源
1)LED灯
LED        0        - IO51
2)RGBLCD / MIPILCD(引脚太多,不摆列出来)
3)DHT11
1WIRE_DQ        - IO23
32.2.3 原理图
DHT11干系原理图和DS18B20原理图是一样的,这里就不再列出来了。
DHT11和DS18B20的接口是共用一个的,不外DHT11有4条腿,须要把U4的4个接口都用上,将DHT11传感器插入到这个上面就可以通过ESP32-P4来读取温湿度值了。毗连表示图如图32.2.1所示:

图32.2.3.2 DHT11与开辟板毗连图
32.3 步调计划
本例程告急用到的是GPIO函数,GPIO函数已在11.3.1章节中详细论述,为克制重复,此处不再赘述。发起读者查阅第十一章的函数分析章节,以获取更多关于GPIO函数的信息。
32.3.1 步调流程图

图32.3.1.1 DHT11实行步调流程图
32.3.2 步调分析
在23_dht11例程中,作者在23_dht11\components\BSP路径下新增了1个文件夹DHT11,而且须要更改CMakeLists.txt内容,以便在其他文件上调用。
1. DHT11驱动代码
这里我们只解说焦点代码,详细的源码请各人参考光盘本实行对应源码。DHT11驱动源码包罗两个文件:dht11.c和dht11.h。
下面先分析dht11.h的步调。对DHT11的数据引脚做了干系界说。
  1. #define DHT11_DQ_GPIO_PIN      GPIO_NUM_23
复制代码
由于数据线会存在获取高低电平以及设置高低电平,以是为DHT11_DQ_GPIO_PIN 做了干系宏函数供单总线时序函数调用。
  1. #define DHT11_DQ_IN              gpio_get_level(DHT11_DQ_GPIO_PIN)        /* IO操作 */
  2. #define DHT11_DQ_OUT(x)         do { x ?                                       \
  3.                                       gpio_set_level(DHT11_DQ_GPIO_PIN, 1):         \
  4.                                      gpio_set_level(DHT11_DQ_GPIO_PIN, 0);         \
  5.                                   } while(0)                                                        /* DHT11端口定义 */
复制代码
接下来,分析一下dht11.c的步调,起首来看一下DHT11初始化函数dht11_init,代码如下:
  1. /**
  2. * @brief              初始化DHT11
  3. * @param             无
  4. * @retval            0, 正常; 1, 不存在/不正常
  5. */
  6. uint8_t dht11_init(void)
  7. {
  8.     gpio_config_t gpio_init_struct;
  9.     gpio_init_struct.intr_type = GPIO_INTR_DISABLE;                   /* 失能引脚中断 */
  10.     gpio_init_struct.mode = GPIO_MODE_INPUT_OUTPUT_OD;          /* 开漏输入和输出 */
  11.     gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE;           /* 使能上拉 */
  12.     gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE;      /* 失能下拉 */
  13.     gpio_init_struct.pin_bit_mask = 1ull << DHT11_DQ_GPIO_PIN;  /* 设置位掩码 */
  14.     gpio_config(&gpio_init_struct);        /* 配置DHT11引脚 */
  15.     dht11_reset();                                /* 复位DHT11 */
  16.     return dht11_check();                /* 等待DHT11的响应 */
  17. }
复制代码
以上两个函数分别代表着前面所说的复位脉冲与应答信号,各人可以对比前面的时序图举行明白。那么在上一章DS18B20的实行中,也对复位脉冲以及应答信号举行了详细的表明,各人也可以对比明白。
DHT11与DS18B20有所差别,DHT11是不须要写函数,只须要读函数即可,下面我们看一下读函数:
[code]/** * @brief             从DHT11读取一个位 * @param             无 * @retval            读取到的位值: 0 / 1 */uint8_t dht11_read_bit(void){    uint8_t retry = 0;    while (DHT11_DQ_IN && retry < 100)  /* 等候变为低电平 */    {        retry++;        esp_rom_delay_us(1);    }    retry = 0;    while (!DHT11_DQ_IN && retry < 100) /* 等候变高电平 */    {        retry++;        esp_rom_delay_us(1);    }    esp_rom_delay_us(40);               /* 等候40us */    if (DHT11_DQ_IN)                    /* 根据引脚状态返回 bit */    {        return 1;    }    else     {        return 0;    }}/** * @brief              从DHT11读取一个字节 * @param              无 * @retval             data:读到的数据 */static uint8_t dht11_read_byte(void){    uint8_t i, data = 0;    for (i = 0; i < 8; i++)         /* 循环读取8位数据 */    {        data

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表