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();
}
欢迎大家交流。