DHT11和DHT22使用区别(基于STM32)

本文详细介绍了DHT11和DHT22温湿度传感器的区别,包括起始信号时长、数据传输细节以及代码实现。DHT11需要18ms的起始信号拉低时间,而DHT22只需1ms。在数据处理上,DHT22需要进行16bit精度的计算。在实际应用中,DHT22读取失败可能由于拉低时间不足1ms导致,建议延时2ms。文章还提供了相应的代码实现和调试建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

温湿度模块DHT11和DHT22小项目用得比较多,虽然二者均是1-wire协议,但是细节部分还是有所差异。1-wire协议我就不多介绍了,网上很详细。这里着重介绍二者使用的区别。

DHT11
DHT11
DHT22

在这里插入图片描述

DHT系列区别

DHT11和DHT22

芯片手册
提取:hgew

起始信号

DHT11

在这里插入图片描述

在这里插入图片描述

DHT22

在这里插入图片描述
在这里插入图片描述

显然DHT11拉低要>18ms,而DHT22拉低只要>1ms就足够。

代码实现

/*
 * 一次完整的数据传输为40bit,高位先出
 * 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和 
 */
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{  
	/*输出模式*/
	DHT11_Mode_Out_PP();
	/*主机拉低*/
	DHT11_Dout_0;
	
	/*延时18ms*/
	DHT11_DELAY_MS(18); //dht11
	//DHT11_DELAY_MS(2); //dht22
	
	/*总线拉高 主机延时30us*/
	DHT11_Dout_1; 

	DHT11_DELAY_US(30);   //延时30us

	/*主机设为输入 判断从机响应信号*/ 
	DHT11_Mode_IPU();

	/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   
	if(DHT11_Dout_IN()==Bit_RESET)     
	{
		/*轮询直到从机发出 的80us 低电平 响应信号结束*/  
		while(DHT11_Dout_IN()==Bit_RESET);

		/*轮询直到从机发出的 80us 高电平 标置信号结束*/
		while(DHT11_Dout_IN()==Bit_SET);

		/*开始接收数据*/   
		DHT11_Data->humi_int= DHT11_ReadByte();

		DHT11_Data->humi_deci= DHT11_ReadByte();

		DHT11_Data->temp_int= DHT11_ReadByte();

		DHT11_Data->temp_deci= DHT11_ReadByte();

		DHT11_Data->check_sum= DHT11_ReadByte();


		/*读取结束,引脚改为输出模式*/
		DHT11_Mode_Out_PP();
		/*主机拉高*/
		DHT11_Dout_1;

		/*检查读取的数据是否正确*/
		if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
			return SUCCESS;
		else 
			return ERROR;
	}
	
	else
		return ERROR;
	
}

13行 DHT11_DELAY_MS(18); 14行 DHT11_DELAY_MS(2); //DHT11时,延时18ms;DHT22时,延时1ms(建议2ms,经测试1ms有可能读取失败)

数据处理

DHT11

在这里插入图片描述
在这里插入图片描述

DHT22

在这里插入图片描述
在这里插入图片描述

代码实现

/*
 * 一次完整的数据传输为40bit,高位先出
 * 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和 
 */
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{  
	uint32_t humi=0;
	uint32_t temp =0;
	
	/*输出模式*/
	DHT11_Mode_Out_PP();
	/*主机拉低*/
	DHT11_Dout_0;
	/*延时2ms*/
	DHT11_DELAY_MS(2);

	/*总线拉高 主机延时30us*/
	DHT11_Dout_1; 

	DHT11_DELAY_US(30);   //延时30us

	/*主机设为输入 判断从机响应信号*/ 
	DHT11_Mode_IPU();

	/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   
	if(DHT11_Dout_IN()==Bit_RESET)     
	{
		/*轮询直到从机发出 的80us 低电平 响应信号结束*/  
		while(DHT11_Dout_IN()==Bit_RESET);

		/*轮询直到从机发出的 80us 高电平 标置信号结束*/
		while(DHT11_Dout_IN()==Bit_SET);

		/*开始接收数据,需要修改的计算方式跟dht11不同*/   
		DHT11_Data->humi_int= DHT11_ReadByte();

		DHT11_Data->humi_deci= DHT11_ReadByte();

		DHT11_Data->temp_int= DHT11_ReadByte();

		DHT11_Data->temp_deci= DHT11_ReadByte();

		DHT11_Data->check_sum= DHT11_ReadByte();


		/*读取结束,引脚改为输出模式*/
		DHT11_Mode_Out_PP();
		/*主机拉高*/
		DHT11_Dout_1;

		/*检查读取的数据是否正确*/
		if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
		{	/*----------------------------------数据处理-----------------------*/
			/*----------------DHT22温湿度16bit精度,故需要分高低字节计算,且需要uint32_t变量装载---------------------*/
			/*-----------------------------湿度和温度的高八位需要乘以256再加上低八位---------------------------------*/
			humi = DHT11_Data->humi_int *256 + DHT11_Data->humi_deci;
			temp = DHT11_Data->temp_int *256 + DHT11_Data->temp_deci;
			
			
			DHT11_Data->humi_int = (uint8_t)(humi*0.1);
			DHT11_Data->humi_deci = humi%10;
			
			DHT11_Data->temp_int = (uint8_t)(temp*0.1);
			DHT11_Data->humi_deci = temp%10;
			
			return SUCCESS;
		}
		else 
			return ERROR;
	}
	
	else
		return ERROR;
	
}

此处并没有错,我的程序通过改变宏定义即可切换dht11或dht22测量。所以函数名称没改回来。

调试问题

DHT22读取失败

1.主机拉低发送起始信号延时1ms时会读取失败,但延时2ms能完美解决问题。
2.两次数据读取时间过短,建议大于2s。

实现代码

代码地址

<think>好的,用户想了解DHT22DHT11传感器的区别,包括规格、特性对比。首先,我需要回忆这两款传感器的基本信息,然后找出它们的主要差异点。 DHT11DHT22都是温湿度传感器,常用于Arduino等项目中。它们的接口可能类似,但性能参数不同。记得DHT11的价格较低,但精度测量范围可能不如DHT22。需要具体对比温度测量范围、湿度测量范围、精度、响应时间、功耗等方面。 温度范围方面,DHT11可能在0-50度,而DHT22更广,比如-40到80度。湿度范围DHT11是20-90%RH,DHT22可能更宽,0-100%RH。精度方面,DHT11的温度精度±2度,湿度±5%,而DHT22的温度±0.5度,湿度±2-3%。这些参数需要准确,不能混淆。 响应时间方面,DHT22可能更快,但需要查证。功耗方面,两者都是低功耗,但具体数值可能有差异。价格部分,DHT11更便宜,适合低成本项目,而DHT22适合高精度需求。 还要注意它们的输出信号是否都是数字信号,接口是否兼容,是否需要额外的上拉电阻。此外,应用场景的差异,比如DHT22适合更苛刻的环境,而DHT11适合室内一般用途。 需要确认引用的资料是否准确,特别是参数部分。用户提供的引用中,引用[1]提到DHT相关的内容可能不直接相关,但引用[3]的链接可能包含具体对比数据。需要检查引用内容是否支持所说的参数,或者是否需要依赖其他可靠来源。 最后,生成相关问题时要围绕用户可能关心的点,比如如何选择、校准方法、替代型号等。确保回答结构清晰,分点对比,帮助用户快速理解差异。</think>### DHT22DHT11传感器对比 DHT22DHT11是两种常用的温湿度传感器,均采用单总线数字信号输出,但性能参数适用场景有显著差异。以下是主要对比: #### 1. **测量范围** - **温度范围** - DHT11:$0^\circ C \sim 50^\circ C$(精度 $\pm 2^\circ C$)[^3] - DHT22:$-40^\circ C \sim 80^\circ C$(精度 $\pm 0.5^\circ C$)[^3] - **湿度范围** - DHT11:$20\% \text{RH} \sim 90\% \text{RH}$(精度 $\pm 5\% \text{RH}$) - DHT22:$0\% \text{RH} \sim 100\% \text{RH}$(精度 $\pm 2\% \text{RH}$) #### 2. **响应时间与功耗** - **响应时间** - DHT11:约6秒 - DHT22:约2秒 - **功耗** - 两者均为低功耗设计,工作电流约1.5mA(休眠时更低)。 #### 3. **成本与应用场景** - **价格** - DHT11价格更低,适合低成本项目; - DHT22成本较高,但适用于高精度需求。 - **场景** - DHT11:室内环境监测(如智能家居); - DHT22:工业环境、极端温湿度条件(如冷库、温室)。 #### 4. **接口兼容性** - 两者均使用单总线协议,可直接连接微控制器(如Arduino、Raspberry Pi),但DHT22可能需要更高频率的时序控制。 ```c // 示例代码(Arduino读取DHT11/DHT22) #include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT22 // 或 DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print("Humidity: "); Serial.print(h); Serial.print("%"); Serial.print(" | Temperature: "); Serial.print(t); Serial.println("°C"); delay(2000); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值