在CSDN上看了很多文章都是用的模拟IIC读取的,代码太冗余了。也找到有用hal库的,但是读取出来数据不对,发现是代码有些小问题,改了之后就能用了。下面就把改好的贴在下面。
void AHT20_Init()
{
uint8_t readbuffer;
HAL_Delay(40);
HAL_I2C_Master_Receive(&hi2c1,AHT20_ADDRESS ,&readbuffer, 1,100);
if((readbuffe[0]&0x08) == 0x00)
{
uint8_t sendbuffer[3]={0xBE,0x08,0x00};
HAL_I2C_Master_Transmit(&hi2c1,AHT20_ADDRESS,&readbuffer,3,100);
}
}
void AHT20_Read(float *Temperature, float *Humidity)
{
uint8_t sendbuff[3] = {0xAC,0x33,0x00};
uint8_t readbuff[6];
HAL_I2C_Master_Transmit(&hi2c1,AHT20_ADDRESS,sendbuff,3,100);
HAL_Delay(75);
HAL_I2C_Master_Receive(&hi2c1,AHT20_ADDRESS,readbuff,6,100);//这里读取长度是6个,其他文章贴的1个,读取就会有问题
if((readbuff[0] & 0x80) == 0x00)
{
uint32_t data = 0;
data = ((uint32_t)readbuff[3]>>4)+((uint32_t)readbuff[2]<<4)+((uint32_t)readbuff[1]<<12);
*Humidity = data * 100.0f/ (1<<20);
data = (((uint32_t)readbuff[3] & 0X0F)<<16)+((uint32_t)readbuff[4]<<8)+((uint32_t)readbuff[5]);
*Temperature = (data * 200.0f)/(1<<20) - 50;
}
}
使用方法也很简单,初始化之后直接调用读取函数就行。
HAL_Delay(50);
AHT20_Init();//初始化
HAL_Delay(50);
float temperature, humidity;
AHT20_Read(&temperature,&humidity);//读取