DHT11是一种常见的单总线数字式温湿度,且在开发板上配有该温湿度传感器的接口,见图1所示。
由于手头只有DHT22,就直接以它来进行温湿度的检测,其湿度量程范围为:0~99.9%RH,精度为±2%RH;其温度量程范围是-40℃~80℃,精度为±0.5℃。
以杜邦线连接DHT22和开发板的效果如图2所示。
图2 连接与检测效果
由于DHT22是单总线器件,所以DHT22所连接的引脚PB1要在输入和输出2种工作模式间进行切换。
DHT22的初始引脚配置函数为:
Uint16_t DHT22_GPIO_Config( void )
{
GPIO_InitTypeDef GPIO_InitStruct;
__RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.IT= GPIO_IT_NONE;
GPIO_InitStruct.Mode= GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pins= GPIO_PIN_1;
GPIO_InitStruct.Speed= GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOB,&GPIO_InitStruct);
}
DHT22读取数据的函数为:
uint8_t DHT22Read_Data(float*temp,uint8_t *humi)
{
char buf[5];
uint8_t i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0]*256+buf[1];
*temp=buf[2]*256+buf[3];
}
}
else return 1;
return 0;
}
按照相关资料的介绍,在DHT22所读取的40位数据中,其各字节的作用如图3所示。
图3 数据结构与作用
实现图示检测效果,其主程序为:
int main()
{
RCC_Configuration();
GPIO_Configuration();
BTIM_init();
Lcd_Init();
Lcd_Clear(GRAY0);
Redraw_Mainmenu();
while(DHT22_GPIO_Config());
while(1)
{
if(counttime>200)
{
counttime=0;
DHT22_Read_Data(&temperature,&humidity);
sprintf(buff_1,"%d",temperature);
sprintf(buff_2,"%d",humidity);
Gui_DrawFont_GBK16(90,25,BLUE,GRAY0,buff_1);
Gui_DrawFont_GBK16(90,47,BLUE,GRAY0,buff_2);
}
}
}
这样就以DHT22实现了温湿度的检测及显示功能,其检测精度和量程会比DHT11要好一些。
|