STM32CubeMX系列 | DHT11温湿度传感器

发布时间:2023-03-23  

1. DHT11简介

DHT11是一款温湿度一体化的数字传感器,该传感器包括一个电阻式测湿元件和一个NTC测温元件,并与一个高性能8位单片机连接。通过单片机微处理器简单的电路连接就能够实时的采集湿度和温度。DHT11与STM32之间能采用简单的单总线进行通讯,仅需一个IO口。传感器内部温度和湿度数据40个bit的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。 DHT11采用单总线数据格式,即单个数据引脚端口完成输入输出双向传输。其数据包由5个字节(40Bit)组成。数据分小数和整数部分,一次完整的数据传输为40bit,高位先出。数据格式如下图示

根据以上数据,即可算出温度和湿度的值,计算方法如下:

湿度 = byte4.byte3 温度 = byte2.byte1 校验 = byte4 + byte3 + byte2 + byte1

DHT11和单片机的一次通讯最大为3ms左右,建议主机连续读取时间间隔不要小于100ms,下面是DHT11的三种时序:

  • 数据发送时序:首先主机发送开始信号,即拉低数据线保持t1(至少18ms)时间,接着拉高数据线t2(20 ~ 40us)时间;然后读取DHT11的响应,正常的话DHT11会拉低数据线并保持t3(40 ~ 50us)时间作为响应信号,接着DHT11拉高数据线并保持t4(40 ~ 50us)时间后,开始传输数据

  • DHT11输出0时序

  • DHT11输出1时序

2. 硬件设计

D1指示灯用来提示系统运行状态,PG11连接DHT11温湿度传感器用来检测环境温湿度,串口1用来打印温度值

  • D1指示灯

  • PG11

  • USART1

  • TIM7(提供us延时)

3. 软件设计

3.1 STM32CubeMX设置

  • RCC设置外接HSE,时钟设置为72M

  • PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平

  • USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位

  • PG11设置为GPIO推挽输出模式、上拉、高速

  • 激活TIM7,预分频因子设为72-1,向上计数,自动重载值为65535;因此计数器CNT_CLK = 1MHz,计数器周期为1us

  • 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码

3.2 MDK-ARM编程

  • 在tim.c文件下实现微秒延时(us)函数

void delay_us(uint16_t us){

    uint16_t differ = 0xffff-us-5;              

    __HAL_TIM_SET_COUNTER(&htim7,differ);   //设定TIM7计数器起始值

    HAL_TIM_Base_Start(&htim7);     //启动定时器 


    while(differ < 0xffff-5){   //判断

        differ = __HAL_TIM_GET_COUNTER(&htim7);     //查询计数器的计数值

    }

    HAL_TIM_Base_Stop(&htim7);

}

创建按键驱动文件DHT11.c 和相关头文件DHT11.h

void DHT11_IO_IN(void){     //IO口方向设置为输入

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.Pin = GPIO_PIN_11;

    GPIO_InitStructure.Mode = GPIO_MODE_INPUT;

    HAL_GPIO_Init(GPIOG,&GPIO_InitStructure);

}


void DHT11_IO_OUT(void){    //IO口方向设置为输出

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.Pin = GPIO_PIN_11;

    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOG,&GPIO_InitStructure);

}


void DHT11_Rst(void){                 

    DHT11_IO_OUT();     //设置为输出

    DHT11_DQ_OUT_LOW;   //拉低

    HAL_Delay(20);      //至少18ms

    DHT11_DQ_OUT_HIGH;  //拉高 

    delay_us(30);       //至少20~40us

}


uint8_t DHT11_Check(void){   

    uint8_t retry=0;

    DHT11_IO_IN();      

    while (DHT11_DQ_IN&&retry<100){ //拉低40~80us

        retry++;

        delay_us(1);

    };   

    if(retry>=100)return 1;

    else retry=0;

    while (!DHT11_DQ_IN&&retry<100){ //拉高40~80us

        retry++;

        delay_us(1);

    };

    if(retry>=100)return 1;     

    return 0;   //检测到DHT11返回0

}


uint8_t DHT11_Read_Bit(void){

    uint8_t retry=0;

    while(DHT11_DQ_IN&&retry<100){  //等待变为低电平

        retry++;

        delay_us(1);

    }

    retry=0;

    while(!DHT11_DQ_IN&&retry<100){ //等待变为高电平

        retry++;

        delay_us(1);

    }

    delay_us(40);   //等待40us

    if(DHT11_DQ_IN)return 1;

    else return 0;         

}


uint8_t DHT11_Read_Byte(void){        

    uint8_t i,dat;

    dat=0;

    for (i=0;i<8;i++){

        dat<<=1; 

        dat|=DHT11_Read_Bit();

    }                           

    return dat;

}


uint8_t DHT11_Read_Data(uint16_t *temp,uint16_t *humi){        

    uint8_t buf[5];

    uint8_t i;

    DHT11_Rst();

    if(DHT11_Check()==0){

        for(i=0;i<5;i++){

            buf[i]=DHT11_Read_Byte();

        }

        if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){

            *humi=(buf[0]<<8) + buf[1];

            *temp=(buf[2]<<8) + buf[3];

        }

    }else return 1;

    return 0;       

}


uint8_t DHT11_Init(void){

    GPIO_InitTypeDef GPIO_Initure;  //PG11的初始化已经在cubemx中完成,可以忽略此段初始化代码

    __HAL_RCC_GPIOG_CLK_ENABLE();           

    GPIO_Initure.Pin=GPIO_PIN_11;           

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  

    GPIO_Initure.Pull=GPIO_PULLUP;         

    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOG,&GPIO_Initure);    

    DHT11_Rst();

    return DHT11_Check();

}

在main.c文件下编写DHT11测试代码

int main(void){

  /* USER CODE BEGIN 1 */

  uint16_t temperature;

  uint16_t humidity;

  /* USER CODE END 1 */

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  MX_TIM7_Init();

  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  while(DHT11_Init()){

    printf("DHT11 Checked failed!!!rn");

    HAL_Delay(500);

  }

  printf("DHT11 Checked Sucess!!!rn");

  /* USER CODE END 2 */

  while (1){

    DHT11_Read_Data(&temperature,&humidity);

    printf("DHT11 Temperature = %d.%d degreern",temperature>>8,temperature&0xff);

    printf("DHT11 Humidity = %d.%d%%rn",humidity>>8,humidity&0xff);       

    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);

    HAL_Delay(500);

  }

}


4. 下载验证

编译无误下载到开发板后,可以看到D1指示灯不断闪烁,串口不断打印出当前温湿度值。串口输出如下信息:


DHT11 Checked Sucess!!! DHT11 Temperature = 28.20 degree DHT11 Humidity = 30.21%

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    才能成就智能化的电冰箱。  通过对直冷式电冰箱制冷系统的改进和采用温度传感器技术,实现了电冰箱的双温双控。这样,电冰箱便能根据使用条件的变化,迅速合理地调节制冷量,且节能效果良好。目前温度传感器产品已经从模拟集成温度传感器......
    温度传感器在工业中的应用有哪些 室外环境温度传感器接线图;温度传感器在工业中的应用有哪些 温度传感器在工业中有广泛的应用。以下是一些常见的应用场景: 1. 温度监测和控制:温度......
    支持数字/模拟输出,纳芯微推出车规级CMOS集成式温度传感器;2024年5月17日,上海——纳芯微宣布推出车规级数字输出温度传感器NST175-Q1和模拟输出温度传感器NST235-Q1、NST86......
    疫情带火的温度传感器,是否会迎来市场爆发期?; 去年,全球温度传感器市场规模超过70亿美元。如今疫情的突发是否是温度传感器市场爆发的一个契机?据Global Market......
    基于 STM32U5 片内温度传感器正确测算温度;1.    引言本文引用地址:STM32 在内部都带有一个, 也不例外。这个位于晶圆上的温度 传感器虽然不太适合用来测量外部环境的温度,但是用于监控一下晶圆上的温度......
    ADALM2000实验:IC温度传感器;本实验活动的目标是使用集成电路温度传感器测量环境温度,这些温度传感器提供与绝对温度成比例的输出(电流或电压)。本文引用地址:使用AD22100测量温度 背景......
    温度传感器在可穿戴设备中的作用;可穿戴设备例如智能手表主打智能助理、健康、安全和运动等多功能定位深受消费者喜爱。后疫情时代,消费者更加关注自身健康,体温......
    纳芯微低功耗数字温度传感器NST112x用于可穿戴测温; 【导读】可穿戴设备例如智能手表主打智能助理、健康、安全和运动等多功能定位深受消费者喜爱。后疫情时代,消费者更加关注自身健康,体温......
    的性能可能会随着时间的推移而出现长期漂移或下降。 可能需要定期重新校准以保持准确的测量。 3.温度依赖性:电阻湿度传感器可能具有一定程度的温度依赖性。 温度波动会影响电阻测量,需要温度补偿技术来获得准确的湿度读数。 4.响应时间:电阻湿度传感器......
    学子专区—ADALM2000实验:IC温度传感器;目标 本实验活动的目标是使用集成电路温度传感器测量环境温度,这些温度传感器提供与绝对温度成比例的输出(电流或电压)。 使用AD22100测量温度......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>