DHT11和DHT22(AM2302)比较及使用方法

DHT11和DHT22(AM2302)技术性能特征

DHT11: DHT22:
工作电压范围:3.3V-5.5V
工作电流 :平均0.5mA
输出:单总线数字信号
测量范围:湿度20–90%RH,温度0~50℃ 湿度0–99.9%RH,温度-40-80℃
精度 :湿度±5%,温度±2℃ 湿度±2%,温度±0.5℃
分辨率 :湿度1%,温度1℃ 湿度:0.1%RH,温度:0.1℃

DHT11和DHT22介绍

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

DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。

其中校验和数据为前四个字节相加。
传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。
在这里插入图片描述
由以上数据就可得到湿度和温度的值,计算方法:
湿度= byte4 . byte3=45.0 (%RH)
温度= byte2 . byte1=28.0 ( ℃)
校验= byte4+ byte3+ byte2+ byte1=73(校验正确)
DHT22与DHT11主要有以下不同:
校验格式相同,但是温湿度取值算法不同,传感器输出的温湿度值要除以10才得到真正的温湿度值温度最高位(Bit15)等于1表示负温度,等于0表示正温度,(Bit14-Bit0)表示温度值。
在这里插入图片描述
DHT22还具有以下特性:
在这里插入图片描述

DHT11和DHT22使用方法分析

//IO方向设置
#define DHT11_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}   //上拉下拉输入模式
#define DHT11_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}   //推挽输出
IO操作函数											   
#define	DHT11_DQ_OUT PGout(11) //数据端口	PG11
#define	DHT11_DQ_IN  PGin(11)  //数据端口	PG11

数据发送流程是相同的,但是时间上有差异
数据发送流程
数据发送流程图
DHT11:首先主机发送开始信号,即:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(20-40us),然后读取DHT11的响应,正常的话,DHT11会拉低数据线,保持t3(40-50us)作为响应信号,然后DHT11拉高数据线,保持t4(40~50us)时间后,开始输出数据。
DHT22:首先主机发送开始信号,DHT22从低功耗模式转换为高速模式,保持t1(至少500us)时间,然后拉高数据线t2(20-40us),然后读取DHT11的响应,正常的话,DHT11会拉低数据线,保持t3(80us左右)作为响应信号,然后DHT11拉高数据线,保持t4(80us左右)时间后,开始输出数据。
代码解析
复位
在这里插入图片描述
拉低数据线,保持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; 	//DQ=1 
	delay_us(30);     	//主机拉高20~40us
}
//复位DHT22
void DHT22_Rst(void)	   
{                 
	DHT22_IO_OUT(); 	//SET OUTPUT
    DHT22_DQ_OUT=0; 	//拉低DQ
    delay_ms(1);    	//拉低至少500us,此处1ms
    DHT22_DQ_OUT=1; 	//DQ=1 
	delay_us(30);     	//主机拉高20~40us
}

等待回应
在这里插入图片描述

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在   出现由低到高的变化即可
u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	DHT11_IO_IN();//SET INPUT	 
    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;
}

在这里插入图片描述

//等待DHT22的回应
//返回1:未检测到DHT22的存在
//返回0:存在   出现由低到高的变化即可
u8 DHT22_Check(void) 	   
{   
	u8 retry=0;
	DHT22_IO_IN();//SET INPUT	 
	
    while (!DHT22_DQ_IN&&retry<100)//DHT22会拉低80us左右
	{
		retry++;
		delay_us(1);
	} 
	if(retry>=100)return 1;
	else retry=0;
    while (DHT22_DQ_IN&&retry<100)//DHT22拉低后会再次拉高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;		   
}

在这里插入图片描述

//从DHT22读取一个位
//返回值:1/0
u8 DHT22_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT22_DQ_IN&&retry<100)//等待变为低电平
	{
		retry++;
		delay_us(1);
	}
	retry=0;
	while(!DHT22_DQ_IN&&retry<100)//等待变高电平
	{
		retry++;
		delay_us(1);
	}
	delay_us(40);//等待40us
	if(DHT22_DQ_IN)return 1;
	else return 0;		   
}

DHT11和DHT22读取一个字节是相同的

//从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°)
//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++)//读取40位数据
		{
			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;	    
}
//从DHT22读取一次数据
//temp:温度值(范围:-40--80°)
//humi:湿度值(范围:0%--99.9%)
//返回值:0,正常;1,读取失败
u8 DHT22_Read_Data(float *temp,float *humi)  
{        
 	u8 buf[5];
	u8 i;
	DHT22_Rst();
	if(DHT22_Check()==0)
	{
		for(i=0;i<5;i++)//读取40位数据
		{
			buf[i]=DHT22_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*humi=((float)((buf[0]<<8)+buf[1]))/10;
			*temp=((float)((buf[2]<<8)+buf[3]))/10;
		}
	}else return 1;
	return 0;	    
}

程序下载链接

程序下载链接

  • 18
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值