
DHT11数字温湿度传感器 本章,我们将介绍数字温湿度传感器DHT11的使用,与前一章的温度传感器相比,该传感器不但能测温度,还能测湿度。我们将学习如何获取DHT11传感器的温湿度数据,并把数据显示在LCD上。 40.1 DHT11及时序简介 40.1.1 DHT11简介 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的管脚排列如图40.1.1所示: ![]() 图40.1.1.1 DHT11管脚排列图 40.1.2 DHT11时序简介 虽然DHT11与DS18B20类似,都是单总线访问,但是DHT11的访问,相对DS18B20来说简单很多。下面我们先来看看DHT11的数据结构。 DHT11数字温湿度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5byte(40bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先处。DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数部分+8bit校验和。其中校验和数据为前面四个字节相加。 传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。例如,某次从DHT11读到的数据如图40.1.2.1所示: ![]() 图40.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的数据发送流程如图40.1.2.2所示: ![]() 图40.1.2.2 DHT11数据发送流程图 首先主机发送开始信号,即:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(1035us)时间,然后读取DHT11的响应,正常的话,DHT11会拉低数据线,保持t3(7888us)时间,作为响应信号,然后DHT11拉高数据线,保持t4(80~92us)时间后,开始输出数据。 DHT11输出数字‘0’时序如图40.1.2.3所示: ![]() 图40.1.2.3 DHT11数字‘0’时序图 DHT11输出数字‘1’的时序如图40.1.2.4所示: ![]() 图40.1.2.4 DHT11输出数字‘1’时序图 DHT11输出数字‘0’和‘1’时序,一开始都是DHT11拉低数据线54us,后面拉高数据线保持的时间就不一样,数字‘0’就是2327us,而数字‘1’就是6874us。 通过以上了解,我们就可以通过STM32H750来实现对DHT11的读取了。DHT11的介绍就到这里,更详细的介绍,请参考DHT11的数据手册。 40.2 硬件设计 1.例程功能 本实验开机的时候先检测是否有DHT11存在,如果没有,则提示错误。只有在检测到DHT11之后才开始读取温湿度值,并显示在LCD上,如果发现了DHT11,则程序每隔100ms左右读取一次数据,并把温湿度显示在LCD上。LED0闪烁,提示程序运行。 2.硬件资源 1)LED灯 LED0 – PB4 2)串口1(PA9/PA10连接在板载USB转串口芯片CH340上面) 3)正点原子2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动) 4)DHT11传感器(接在PC13上) 3.原理图 DHT11接口与STM32的连接关系跟上一章节中DS18B20和STM32的关系是一样的,使用到的GPIO口是PC13。这里原理图就不列出来了,可以翻看上一章节原理图。 DHT11和DS18B20的接口是共用一个的,不过DHT11有4条腿,需要把U6的4个接口都用上,将DHT11传感器插入到这个上面就可以通过STM32来读取温湿度值了。连接示意图如图40.2.1所示: ![]() 图40.2.2 DHT11连接示意图 这里要注意,将DHT11贴有字的一面朝内,而有很多孔的一面(网面)朝外,然后插入如图所示的四个孔内就可以了。 40.3 程序设计 DHT11实验中使用的是单总线协议,用到的是HAL中GPIO相关函数,前面也有介绍到,这里就不做展开了。下面介绍一下如何驱动DHT11。 DHT11配置步骤 1)使能DHT11数据线对应的GPIO时钟。 本实验中DHT11的数据线引脚是PC13,因此需要先使能GPIOC的时钟,代码如下: __HAL_RCC_GPIOC_CLK_ENABLE(); /* PC口时钟使能 */ 2)设置对应GPIO工作模式(开漏输出) 本实验GPIO使用开漏输出模式,通过函数HAL_GPIO_Init设置实现。 3)参考单总线协议,编写信号代码(复位脉冲、应答脉冲、读0/1) 复位脉冲:拉低数据线,保持至少18ms时间,然后拉高数据线10~35us时间。 应答脉冲:DHT11拉低数据线,保持78~88us时间。 读0/1信号:DHT11拉低数据线延时54us,然后拉高数据线延时一定时间,主机通过判断高电平时间得到0或者1。 4)编写DHT11的读函数 基于读1bit数据的基础上,编写DHT11读1字节函数。 5)编写DHT11获取温度函数 参考DHT11典型温湿度读取过程,编写获取温湿度函数。 40.3.1 程序流程图 ![]() 图40.3.1.1 DHT11实验程序流程图 40.3.2 程序解析 1.DHT11驱动代码 这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。DHT11驱动源码包括两个文件:dht11.c和dht11.h。 首先我们先看一下dht11.h头文件里面的内容,其定义如下:
在DHT11的初始化函数中,主要对用到的GPIO口进行初始化,同时在函数最后调用复位函数和自检函数,这两个函数在后面会解释到。 下面介绍的是复位DHT11函数和等待DHT11的回应函数,它们的定义如下:
以上两个函数分别代表着前面所说的复位脉冲与应答信号,大家可以对比前面的时序图进行理解。那么在上一章DS18B20的实验中,也对复位脉冲以及应答信号进行了详细的解释,大家也可以对比理解。 DHT11与DS18B20有所不同,DHT11是不需要写函数,只需要读函数即可,下面介绍从DHT11读取一个位函数和从DHT11读取一个字节函数,它们的定义如下:
在这里dht11_read_bit函数从DHT11处读取1位数据,大家可以对照前面的读时序图进行分析,读数字0和1的不同,在于高电平的持续时间,所以这个作为判断的依据。dht11_read_byte函数就是调用一字节读取函数进行实现。 下面介绍读取温湿度函数,其定义如下:
主函数代码比较简单,一系列硬件初始化后,如果DHT11初始化成功,那么在循环中调用dht11_get_temperature函数获取温湿度值,每隔100ms读取数据并显示在LCD上。 40.4 下载验证 假定DHT11传感器已经接上去正确的位置,将程序下载到开发板后,可以看到LED0不停的闪烁,提示程序已经在运行了。LCD显示当前的温度值的内容如图40.4.1所示: ![]() 图40.4.1 程序运行效果图 至此,本章实验结束。大家可以将本章通过DHT11读取到的温度值,和前一章的通过DS18B20读取到的温度值对比一下,看看哪个更准确? ———————————————— 版权声明:正点原子 |
【经验分享】STM32H7时钟
拷打cubemx【003】——找不到的芯片包
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享4-使用MVP架构从硬件外设读取数据并显示到图形界面、从图形界面发送指令控制硬件外设
【2025·STM32峰会】GUI解决方案实训分享3-搭建空白TouchGFX例程并实现简单的功能(含硬件部分的串口打印)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
【2025·STM32峰会】+TouchGFX实现动态进度显示以及界面切换
【2025·STM32峰会】+使用TouchGFX快速创建GUI
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
实战经验 | 关于STM32H7使用LL库生成ADC代码工作异常问题说明