这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 有奖活动 » AT32VH407下使用温湿度传感器DHT22进行检测

共1条 1/1 1 跳转至

AT32VH407下使用温湿度传感器DHT22进行检测

助工
2026-04-13 14:55:47     打赏

DHT22数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它运用数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与长期的稳定性。

传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此具有响应快、抗干扰能力强、性价比高优点。

DHT22是一种采用单总线结构的器件,使体积小、功耗低,信号传输距离可达20米以上,成为各类应用甚至最为苛刻应用场合的最佳选则。在对环境温度与湿度测量要求较高的情况下使用,该产品具有极高的可靠性和出色的稳定性。

它共有三个引脚VCC3.3-5V)、GNDDATA

除电源引脚外只需一个引脚就可工作。其中,DATA 引脚用于传输数据。
DHT22数字温湿度传感器精度较高,可以替代昂贵的进口SHT10温湿度传感器。

相较于DHT11DHT22要比DHT11的精度高,可达到小数级的精度。

温度范围:-40-80℃ 分辨率0.1℃  误差±0.5℃

湿度范围:0-100%RH 分辨率0.1%RH 误差±2%RH

DHT22一次完整的传输数据有40bit,高位在前,即16位湿度+16位温度+8位校验码。

image.png


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所示。

image.png

2 器件连接

image.png

3 测试结果










关键词: AG32VH407    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]