STM32——DHT11温湿度传感器

本文详细介绍了DHT11数字湿度传感器的工作电压、电流、测量范围和精度等技术特性。它采用单总线数据格式,数据包由5Byte组成,包括湿度和温度的整数和小数部分以及校验和。数据发送流程包括主机发送开始信号、等待传感器响应以及读取数据。代码段展示了如何进行复位、等待响应、读取数据位和字节的过程。通过这些步骤,可以获取并计算湿度和温度的准确值。
摘要由CSDN通过智能技术生成

一、DHT11介绍

1、DHT11技术性能特征

工作电压范围:3.3V~5.5V

工作电流:平均0.5mA

输出:单总线数字信号

测量范围:湿度20~90%RH,温度0~50°C

精度:湿度±5%,温度±2°C

分辨率:湿度±1%,温度±1°C

DHT11数字湿度传感器采用单总线数据格式。单个数据引脚端口完成输入输出双向传输。其中数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。

DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。其中校验和数据为前四个字节相加。传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。例如,某次从DHT11读到的数据如图所示:

由以上数据就可得到湿度和温度的值,计算方法:

湿度=byte4.byte3=45.0(%RH)

温度=byte2.byte1=28.0(°C)

校验=byte4+byte3+byte2+byte1=73(校验正确)

二、数据发送流程

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

DHT11输出数字‘0’的时序如图:

 

DHT11输出数字‘1’的时序如图:

 

硬件连接:

 

信号线:PG9

//IO方向设置
#define DHT11_IO_IN()  {GPIOG->MODER&=~(3<<(9*2));  GPIOG->MODER|=0<<9*2;}  //PG9输入模
#define DHT11_IN_OUT() {GPIOG->MODER&~=(3<<(9*2));  GPIOG->MODER|=0<<9*2;}  //PG9输出模
//IO操作
#define DHT11_DQ_OUT PGout(9);//数据端口 PG9
#define DHT11_DQ_IN  PGin(9);//数据端口 PG9

三、代码解析

复位:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(20~40us)时间

 

//复位DHT11
void DHT11_Rst(void)
{
  DHT11_IO_OUT();//SET OUTPUT
  DHT11_DQ_OUT=0;//拉低DQ
  delay-ms(20);//拉低至少18ms
  DHT11_DQ_OUT=1;
  delay_us(30);//主机拉高20~40us
}

等待回应:

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
  u8 retry=0;
  DHT11_IO_IN();
  while(DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
  {
    retry++;
    delay_us(1);
  }
  if(retry>=100) return 1;
  else retry=0;
  while(!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
  {
    retry++;
    delay_us(1);
  }
  if(retry>=100) return 1;
  return 0;
}

读数据一个bit:

从DHT11读取一个位,返回值:1/0
u8 DHT11_Read_bit(void)
{
  u8 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;
}

读数据(一个字节):

//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)
{
  u8 i,dat;
  dat=0;
  for(i=0;i<8;i++)
  {
    dat<<=1;
    dat|=DHT11_Read_Bit();
  }
  return dat;
}

解析湿度和温度值:

//从DHT11读取一次数据
//temp:温度值(范围0~50°C)
//humi:湿度值(范围20%~90%)
//返回值:0正常  1:读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
  u8 buf[5];
  u8 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];
      *temp=buf[2];
    }
  }else return 1;
  return 0;
}

u8 DHT11_Init(void);//初始化DHT11

u8 DHT11_Read_Data(u8 *temp,u8 *hmi);//读取温湿度

u8 DHT11_Read_Byte(void);//读出一个字节

u8 DHT11_Read_Bit(void);//读出一个位

u8 DHT11_Check(void);//检测是否存在DHT11

void DHT11_Rst(void);//复位DHT11

关于串口初始化的配置:

u8 DHT11_Init(void)
{
  GPIO_INitTypeDef GPIO_InitABC;
  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);//使能GPIO时钟
  
  GPIO_InitABC.GPIO_Pin=GPIO_Pin_9;
  GPIO_InitABC.GPIO_Mode=GPIO_Mode_OUT;//普通输出模式
  GPIO_InitABC.GPIO_OType=GPIO_OType_PP;//推挽输出
  GPIO_InitABC.GPIO_Speed=GPIO_Speed_50MHz;//50MHz
  GPIO_InitABC.GPIO_PuPd=GPIO_PuPd_UP;//上拉
  GPO_Init(GPIOG,&GPIO_InitABC);//初始化
  
  DHT11_Rst();
  return DHT11_Check();
}

DHT11是一款数字湿度传感器,它具有已校准数字信号输出的特点,采用专用的数字模块采集技术和湿度传感技术,确保产品具有高可靠性和长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测元件,并与一个高性能8位单片机相连接。该传感器具有超快响应、抗干扰能力强、性价比高等优点。每个DHT11传感器都在湿度校验室中进行精确校准,校准系数以程序的形式存在内存中,传感器在处理过程中会调用这些校准系数。它采用单线制串行接口,使系统集成变得简易快捷。此外,DHT11具有超小的体积和极低的功耗,适用于各种应用场合。\[1\] 在本项目中,采用了STM32F407ZGT6开发板作为主控芯片,该芯片属于ARM Cortex-M4系列。同时,使用了常见通用的DHT11湿度传感器。传感器将采集到的数据传输到STM32主控进行数据处理,并通过串口打印出来。\[2\] DHT11的数据格式为8bit湿度整数数据、8bit湿度小数数据、8bit度整数数据、8bit度小数数据和8bit校验和。校验和数据是前四个字节相加的结果。传感器输出的是未编码的二进制数据,需要将数据(湿度、度、整数、小数)分开处理。\[3\] #### 引用[.reference_title] - *1* [STM32学习之传感器篇——DHT11湿度传感器](https://blog.csdn.net/qq_42930154/article/details/104532523)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【STM32】使用DHT11湿度传感器](https://blog.csdn.net/silver_lf/article/details/117919328)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32——DHT11湿度传感器](https://blog.csdn.net/weixin_62584795/article/details/126897942)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值