STM32驱动 DHT11 获取温湿度|DHT11读数固定原因|DHT11读数一会有一会没有

DHT11读数固定原因:
如果读数始终为0XFF,说明是驱动程序有问题,
如果能读出温湿度,但是数值固定不变化,说明是DHT11正负极接反烧了,换一个即可正常使用。

DHT11读数一会有一会没有原因:
每次测量需要留出时间间隔,如果短时间(几百毫秒内)多次测量,就会出现这种情况。保证2秒以上的测量间隔,就不会出现这种情况。

stm32驱动DHT11代码
DHT11.H文件

#ifndef __DHT11_H
#define	__DHT11_H

#include "sys.h"
#include "main.h" 
#include "delay.h"

#define HIGH  1
#define LOW   0
typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;
typedef struct
{
	uint8_t  humi_int;		//ʪ¶ÈµÄÕûÊý²¿·Ö
	uint8_t  humi_deci;	 	//ʪ¶ÈµÄСÊý²¿·Ö
	uint8_t  temp_int;	 	//ζȵÄÕûÊý²¿·Ö5
	uint8_t  temp_deci;	 	//ζȵÄСÊý²¿·Ö
	uint8_t  check_sum;	 	//УÑéºÍ
		                 
}DHT11_Data_TypeDef;
//IO选择为PA3
#define DHT11_IO_IN()  {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8<<12;}
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3<<12;}			
						   
#define	DHT11_DQ_OUT PAout(3) //Êý¾Ý¶Ë¿Ú	PA0 
#define	DHT11_DQ_IN  PAin(3)  //Êý¾Ý¶Ë¿Ú	PA0 

u8 DHT11_Init(void);//³õʼ»¯DHT11
void DHT11_Rst(void);//¸´Î»DHT11 
u8 DHT11_Read_Byte(void);//¶Á³öÒ»¸ö×Ö½Ú
u8 DHT11_Read_Bit(void);//¶Á³öÒ»¸öλ
u8 DHT11_Check(void);//¼ì²âÊÇ·ñ´æÔÚDHT11

uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data);

#endif /* __DHT11_H */

DHT11.C文件

#include "dht11.h"

//¸´Î»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
}
//µÈ´ý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;
}
//´Ó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µÄIO¿Ú DQ ͬʱ¼ì²âDHT11µÄ´æÔÚ
//·µ»Ø1:²»´æÔÚ
//·µ»Ø0:´æÔÚ    	 
u8 DHT11_Init(void)
{	 
// 	GPIO_InitTypeDef  GPIO_InitStructure;
// 	
// 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);	 //ʹÄÜPG¶Ë¿ÚʱÖÓ
//	
// 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;				 //PG11¶Ë¿ÚÅäÖÃ
// 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //ÍÆÍìÊä³ö
// 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// 	GPIO_Init(GPIOE, &GPIO_InitStructure);				 //³õʼ»¯IO¿Ú
 	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//GPIO_SetBits(GPIOE,GPIO_Pin_1);						 //PG11 Êä³ö¸ß
			    
	DHT11_Rst();  //¸´Î»DHT11
	return DHT11_Check();//µÈ´ýDHT11µÄ»ØÓ¦
} 

uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
{  
	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])
		{
			DHT11_Data->humi_int=buf[0];
			DHT11_Data->humi_deci=buf[1];
			DHT11_Data->temp_int=buf[2];
			DHT11_Data->temp_deci=buf[3];
			DHT11_Data->check_sum=buf[4];
		}
	}else return 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;	    
}

	  


/*************************************END OF FILE******************************/

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值