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******************************/