ASAIR 继 DHT11 推出了DHT20
,采用 I2C 协议通信。除此外,两者在量程与精度上也有些许差别,详见:
引脚定义 & 从机地址
数据格式
DHT20
上电之后需等待100ms
并初始化,测量时的数据格式如图示:
示例代码
int8_t 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
校验值 .
DHT20
的CRC
的初始化结构体与参数配置如下图:
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校验
}