LOADING

加载过慢请开启缓存 浏览器默认开启

DHT20(硬件I2C)

2024/1/29 MCU

ASAIR继DHT11推出了DHT20,采用I2C协议通信。除此外,两者在量程与精度上也有些许差别,详见:

DHT20 http://www.aosong.com/en/products-67.html

DHT11 http://www.aosong.com/en/products-21.html

引脚定义 & 从机地址

数据格式

DHT20上电之后需等待100ms并初始化,测量时的数据格式如图示:

示例代码

    void dht20_run(float *pdht20)
    {
        uint8_t pt_DAT[] = {0xAC,0x33,0x00};
        uint8_t pr_DAT[7] = {0x00};
        static char init = 1;
        
        if(init)
        {
            HAL_Delay(100);//上电100ms等待
            init -= 1;
        }
        HAL_I2C_Master_Receive(&hi2c1,0x71,pr_DAT,1,100);//读状态字
            
        if( (pr_DAT[0] & 0x10) && (pr_DAT[0] &0x08) )
        {
            HAL_Delay(10);
            HAL_I2C_Master_Transmit(&hi2c1,0x71,pt_DAT,3,100);//触发测量
        }
        else
        {
            //dht20_RegInit();//初始化1B\1C\1E寄存器
            //return Reg_status;
        }  
        HAL_Delay(80);//等待转换

        HAL_I2C_Master_Receive(&hi2c1,0x71,pr_DAT,7,100);//接受数据
        while( pr_DAT[0]&0x80 )
        {
            //Busy_handler();//正忙
        }
        
        pdht20[0] = (((pr_DAT[1]<<12) + (pr_DAT[2]<<4) + (pr_DAT[3]>>4))*100.0) / 0xfffff;
        pdht20[1] = ((((pr_DAT[3]<<28)>>12) + (pr_DAT[4]<<8) + (pr_DAT[5]))*200.0) / 0xfffff - 50;
    }

数据转换

测量后分别将获得温湿度的20位数据带入下图公式计算得出测量值。


如数据:1c(状态字)8c 67 34 e5 2c,计算得到湿度:54.844951%RH,温度:11.190032℃.

CRC8 (X8+X5+X4+1)

DHT20支持CRC校验,在收到六个字节的数据后,可响应ACK/NACK来接收/拒绝CRC校验值 .

DHT20CRC的初始化结构体与参数配置如下图:

        typedef struct
        {
            uint8_t DefaultPolynomialUse;		//是否使用默认多项式
            uint8_t DefaultInitValueUse;		//是否使用默认初始值
            uint32_t GeneratingPolynomial;		//配置多项式--不使用默认时
            uint32_t CRCLength;				    //CRC校验的位数
            uint32_t InitValue;				    //配置初始值--不使用默认时
            uint32_t InputDataInversionMode;    //输入数据反转模式
            uint32_t OutputDataInversionMode;   //输出数据反转模式
        } CRC_InitTypeDef;

        hcrc.Instance = CRC;
        hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;
        hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;
        hcrc.Init.GeneratingPolynomial = 49;//1|00110001
        hcrc.Init.CRCLength = CRC_POLYLENGTH_8B;
        hcrc.Init.InitValue = 0xffff;
        hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
        hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
        hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
  • 需要仔细与HAL_CRC_Calculate不同,HAL_CRC_Accumulate不会自动重置CRC_DR,在使用前需要手动添加__HAL_CRC_DR_RESET重置CRC_DR .
        uint8_t dht20_crc(CRC_HandleTypeDef *hcrc, uint8_t *pBuffer)
        {
            uint8_t crc_val = 0;
            // __HAL_CRC_DR_RESET(hcrc);                                //置位控制寄存器 CRC_CR[0] 以重置数据寄存器 CRC_DR[31:0]
            // return crc_val  = HAL_CRC_Accumulate(hcrc, pBuffer, 6);  //累计CRC校验
            return crc_val  = HAL_CRC_Calculate(hcrc, pBuffer, 6);      //单次CRC校验
        }