前面主要介绍了基于模拟信号的传感器使用,本次说一说数字式传感器的使用,作为数字式传感器它也有许多种,
如温湿度传感器、光强度传感器、气温气压传感器等。
DHT22是一种检测检测常规状态下温湿度的传感器,它采用单总线结构,因此十分节省系统资源。
DHT22的采集精度要高于DHT11,它的精度可达小数点后1位,而DHT11只能到整数位。
由于是采用单总线工作,这一条线既要能输出,又要能输入。
在这里,是使用PA12来与DHT22的DAT引脚相连。
使其输出高低电平和进行输入的语句如下:
#define DHT11_D0_H GPIOA_SetBits( GPIO_Pin_12 )
#define DHT11_D0_L GPIOA_ResetBits( GPIO_Pin_12 )
#define DHT11_D0_R GPIOA_ReadPortPin( GPIO_Pin_12 )
配置引脚为输入/输出功能的函数为:
void DHT11_IO_IN(void)
{
GPIOA_ModeCfg( GPIO_Pin_12, GPIO_ModeIN_PU );
}
void DHT11_IO_OUT(void)
{
GPIOA_ModeCfg( GPIO_Pin_12, GPIO_ModeOut_PP_5mA );
}
显示温湿度值的主程序为:
int main()
{
u8 senflag;
mDelaymS(100);
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"CH579M TEST",16);
OLED_ShowString(0,2,"DHT22_OLED",16);
senflag=DHT11_Init();
if(senflag) OLED_ShowString(64,0,"NO SEN!",16);
else OLED_ShowString(64,0,"SEN OK!",16);
while(1)
{
if(!senflag)
{
OLED_ShowString(0,2,"T= . C ",16);
OLED_ShowString(64,2,"H= . %",16);
DHT11_Read_Data();
OLED_ShowNum(16,2,temperature/10,2,16);
OLED_ShowNum(40,2,(temperature%10),1,16);
OLED_ShowNum(80,2,humidity/10,2,16);
OLED_ShowNum(104,2,(humidity%10),1,16);
}
mDelaymS(1000);
}
}
经编译、下载,其运行效果如下图所示。
温湿度检测效果图
|