本帖最后由 jinglixixi 于 2021-1-27 19:49 编辑
DHT22是一种数字式温湿度传感器,它以单总线的方式来工作,因此使用它进行温湿度检测比较简单,且节省I/O资源,其检测效果如下图所示。 OLED 屏与MCU的连接关系为: DAT---PB11
检测效果图 该引脚输入及高低电平输出的语句定义如下: #define DHT22_D0_H GPIOB->BSRE= GPIO_Pins_11 #define DHT22_D0_L GPIOB->BRE= GPIO_Pins_11 #define DHT22_D0_R GPIO_ReadInputDataBit(GPIOB,GPIO_Pins_11) 将该引脚配置为输出功能的函数为: void DHT22_IO_OUT(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz; //50
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
读取温湿度的函数为: uint8_t DHT22_Read_Data(uint8_t *temp,uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
DHT22_Rst();
if(DHT22_Check()==0)
{
for(i=0;i<5;i++)
{
buf[i]=DHT22_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=(buf[0]*256+buf[1])/10;
*temp=(buf[2]*256+buf[3])/10;
}
}else return 1;
return 0;
}
形成显示效果的主程序为: int main(void)
{
uint8_t senflag;
AT32_Board_Init();
AT32_OLED_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AT_START_F407",16);
OLED_ShowString(0,2,"OLED & DHT22",16);
Delay_ms(1000u);
OLED_ShowString(0,2,"T= C H= %RH",16);
senflag=DHT22_Init();
if(senflag) OLED_ShowString(112,0,"NO",16);
else OLED_ShowString(112,0,"OK",16);
while(1)
{
if(!senflag)
{
DHT22_Read_Data(&temperature,&humidity);
OLED_ShowNum(16,2,temperature,2,16);
OLED_ShowNum(64,2,humidity,2,16);
}
Delay_ms(500u);
}
}
|