当前位置: 代码迷 >> 综合 >> STM32温湿度传感器——DHT11(HAL库)
  详细解决方案

STM32温湿度传感器——DHT11(HAL库)

热度:14   发布时间:2023-11-30 19:56:19.0

传感器

  • 1. DHT11温湿度传感器
    • 1.1 引脚说明
    • 1.2 通信原理
      • 1.2.1 原始数据的处理
      • 1.2.2 时序图
    • 1.3 使用教程
      • 1.3.1 CubeMx配置
      • 1.3.2 代码的移植
      • 1.3.3 引脚的修改(十分重要)

1. DHT11温湿度传感器

1.1 引脚说明

DHT11的引脚组成

1.2 通信原理

1.2.1 原始数据的处理

DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。

  • 数据分小数部分和整数部分,高位先出,校验和数据为前四个字节相加。在这里插入图片描述

  • 传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。如果,某次从传感器中读取如下5Byte数据:
    读取数据的示例

  • 由以上数据就可得到湿度和温度的值,计算方法:
    humi (湿度)= byte4 . byte3=45.0 (%RH)
    temp (温度)= byte2 . byte1=28.0 ( ℃)
    jiaoyan(校验)= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校验正确)
    注意:DHT11一次通讯时间最大3ms,主机连续采样间隔建议不小于100ms。

1.2.2 时序图

1.3 使用教程

1.3.1 CubeMx配置

GPIOdata引脚的配置
由于四个引脚中两个引脚是电源,一个是空接,所以就只需要配置一个简单的GPIO即可

1.3.2 代码的移植

  1. 把DH11的C文件和H文件移进去就好了,然后记得在main.c中初始化延迟函数(因为使用的是原子哥的所以要初始化延迟函数)
  2. 关于修改引脚
    DH11头文件

(编辑于2021/11/14)

1.3.3 引脚的修改(十分重要)

前言:在之前的学习和使用中,以为只要修改上述说过的端口号和PGout什么的就好了,但是那时候的我只是把PG11改成了PA11的引脚使用而已,在某次使用中CubeMx把我的引脚换到了PC0中,然后我就懵逼了。所以这点十分值得注意,因为在修改原子哥的例程中是很值得去解决的。

  1. 在CubeMx中配置引脚的时候记得加上User Label的定义 这样代码的移植性会大大增加。
  2. 在DHT11.h文件中修改如下代码(数据引脚PG11改成PC0的操作)
//IO方向设置
//如果要修改数据IO口的话
//端口号修改,不过我用了User Label封装的较好,随后还要改引脚管脚号的设置以及模式的寄存器
//CRH为8~16的高位寄存器,CRL为0~7的低位寄存器,F表示了引脚几|=8<引脚号*4
#define DHT11_IO_IN() {
      DHT11_GPIO_Port->CRL&=0XFFFFFFF0;DHT11_GPIO_Port->CRL|=8<<0;}
#define DHT11_IO_OUT() {
      DHT11_GPIO_Port->CRL&=0XFFFFFFF0;DHT11_GPIO_Port->CRL|=3<<0;}//IO操作函数
//这里也要相应的更改
//同时要修改的是DHT11初始化函数那里
#define DHT11_DQ_OUT PCout(0)//数据端口 PG11
#define DHT11_DQ_IN PCin(0) //数据端口 PG11

上面的操作中IO方向设置是有关于寄存器编程的一点小知识详细可以查看
STM32寄存器编程
3. 在DHT11.c文件下修改如下代码(数据引脚PG11改成PC0的操作)

//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在 
u8 DHT11_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOC_CLK_ENABLE();			//开启GPIOG时钟GPIO_Initure.Pin=DHT11_Pin;           //PG11GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(DHT11_GPIO_Port,&GPIO_Initure);     //初始化DHT11_Rst();return DHT11_Check();
}

以上可以看出User Label设定的好处了,它会自动帮你宏定义这两个
User Label 设置修改的东西
(编辑结束)