DHT22数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合型传感器。它运用数字模块采集技术和温湿度传感技术,来确保产品具有极高的可靠性与长期的稳定性。
传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此它具有响应快、抗干扰能力强、性价比高的优点。
DHT22是一种采用单总线结构的器件,使其体积小、功耗低,信号传输距离可达20米以上,成为各类应用甚至是最为苛刻应用场合的最佳选则。在对环境温度与湿度测量要求较高的情况下使用,该产品具有极高的可靠性和出色的稳定性。
它共有三个引脚,即:VCC(3.3-5V)、GND及DATA。
除电源引脚外只需一个引脚就可工作。其中,DATA 引脚用于传输数据。
DHT22数字温湿度传感器精度较高,可以替代昂贵的进口SHT10温湿度传感器。
相较于DHT11,DHT22要比DHT11的精度高,可达到小数级的精度。
温度范围:-40-80℃ 分辨率0.1℃ 误差±0.5℃
湿度范围:0-100%RH 分辨率0.1%RH 误差±2%RH
DHT22一次完整的传输数据有40bit,高位在前,即16位湿度+16位温度+8位校验码。

图1 DHT22传感器
为便于程序设计,对输出高低电平和检测引脚状态的定义如下:
#define DHT22_PIN_SET GPIO_SetHigh(GPIO5,GPIO_BIT4)
#define DHT22_PIN_CLR GPIO_SetLow(GPIO5,GPIO_BIT4)
#define DHT22_PIN_Read (GPIO_GetValue(GPIO5,GPIO_BIT4))
注:GPIO5_4 对应引脚PIN_57
由于DHT22是单总线器件,故在收发数据时需进行工作模式的切换,相应的函数为:
设置所用引脚为输入模式的函数为:
void DHT22_IN()
{
GPIO_SetInput(GPIO5,GPIO_BIT4);
}设置所用引脚为输出模式的函数为:
void DHT22_OUT()
{
GPIO_SetOutput(GPIO5, GPIO_BIT4);
}DHT22的复位函数为:
void DHT22_Reset()
{
DHT22_OUT();
DHT22_PIN_CLR;
UTIL_IdleUs(20e3);
DHT22_PIN_SET;
UTIL_IdleUs(30);
}DHT22的检测函数为:
int DHT22_Check()
{
int retry=0;
DHT22_IN();
while (DHT22_PIN_Read&&retry<100)
{
retry++;
UTIL_IdleUs(1);
};
if(retry>=100)return 1;
else retry=0;
while (!DHT22_PIN_Read&&retry<100)
{
retry++;
UTIL_IdleUs(1);
};
if(retry>=100) return 1;
return 0;
}DHT22的初始化函数为:
int DHT22_Init()
{
GPIO_SetOutput(GPIO5, GPIO_BIT4);
DHT22_Reset();
return DHT22_Check();
}DHT22的位数据读取函数为:
int DHT22_Read_Bit()
{
int retry=0;
while(DHT22_PIN_Read&&retry<100)
{
retry++;
UTIL_IdleUs(1);
}
retry=0;
while(!DHT22_PIN_Read&&retry<100)
{
retry++;
UTIL_IdleUs(1);
}
UTIL_IdleUs(40);
if(DHT22_PIN_Read) return 1;
else return 0;
}DHT22的字节数据读取函数为:
char DHT22_Read_Byte()
{
char i,dat;
dat=0;
for(i=0;i<8;i++)
{
dat<<=1;
dat|=DHT22_Read_Bit();
}
return dat;
}DHT22的温湿度读取函数为:
int DHT22_Read_Data(uint16_t *temp,uint16_t *humi)
{
char buf[5],i;
DHT22_Reset();
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]); // 储存湿度数据
*temp=(buf[2]*256+buf[3]); // 储存温度度数据
}
}
else return 1;
return 0;
}DHT22的温湿度检测主程序为:
int main(void)
{
uint16_t temp=0,i;
uint16_t humi=0;
board_init();
SYS_EnableAPBClock(APB_MASK_GPIO5);
GPIO_SetOutput(GPIO5, GPIO_BIT4);
GPIO_AF_ENABLE(UART0_UARTRXD);
GPIO_AF_ENABLE(UART0_UARTTXD);
SYS_EnableAPBClock(APB_MASK_UAR22);
DHT22_Init();
while (1)
{
DHT22_Read_Data(&temp,&humi);
printf("Temp:%d.%d Humi:%d.%d \r\n",temp/10,temp%10,humi/10,humi%10);
UTIL_IdleUs(100e3);
}
}经程序的编译和下载,在按图2连接器件的情况下,其测试结果如图3所示。

图2 器件连接

图3 测试结果
我要赚赏金
