STM32+DHT11 读取数据为0或温湿度过高的常见原因及解决办法

1.读取数据为0

如果代码正确的话,我遇到的温湿度为0的原因主要还是电源的问题,比如没有给开发板单独供电或者连线松动。因为有时候插着ST-Link连接到了电脑,开发板和DHT11的电源指示灯都会亮,但还是需要给开发板连上电源,这样更稳定,插上电源之后复位一下读到的温湿度就正常了。有时候线连的不紧也会这样,连紧一点就好了。

2.温湿度过高,达到八九十

这个原因比较奇怪,因为我确定DHT11的代码是没什么问题的,换了好几种代码结果都是温度89℃,显然不对。最后我在主函数里没有调用DHT11的初始化函数,结果运行起来正常了,我觉得应该是初始化的问题。初始化代码如下。


void DHT11_GPIO_Init_OUT(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; 
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);

}


void DHT11_GPIO_Init_IN(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING; 
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);

}
void DHT11_Start(void)
{
	DHT11_GPIO_Init_OUT();
	
	dht11_high; 
	delay_us(30);
	
	dht11_low; 
	delay_ms(20);
	
	dht11_high; 
	delay_us(30);
	
	DHT11_GPIO_Init_IN(); 
}

欢迎大家交流。

你可能感兴趣的:(物联网毕业设计,STM32,嵌入式硬件,stm32,单片机)