【STM32】AHT20温湿度模块
AHT20温度模块采用的是I2C硬件通信协议。本篇文章会根据时序图实现AHT20模块初始化,以及读取温湿度
AHT20温度模块对应电路图
得到设备地址,读地址的话设备地址为0x71,写的话为0x70
1.根据手册写aht20初始化代码
void aht20_init()
{ uint8_t readdata;
uint8_t writedata[3]={0XBE,0X08,0X00};
HAL_Delay(40);
HAL_I2C_Master_Receive(&hi2c1,ReadAddress,&readdata,1,HAL_MAX_DELAY);
if((readdata&0X08)==0X00)
{
HAL_I2C_Master_Transmit(&hi2c1,WriteAddress,writedata,3,HAL_MAX_DELAY);
}
}
2.根据手册写读取温湿度函数
void aht20_read(float*tmp,float*hum)
{
uint8_t data[3]={0XAC,0X33,0X00};
uint8_t readdata[6];
HAL_I2C_Master_Transmit(&hi2c1,WriteAddress,data,3,HAL_MAX_DELAY);
HAL_Delay(75);
HAL_I2C_Master_Receive(&hi2c1,ReadAddress,readdata,6,HAL_MAX_DELAY);
if((readdata[0]&0X80)==0X00)
{
uint32_t data;
data=((uint32_t)readdata[3]>>4)+((uint32_t)readdata[2]<<4)+((uint32_t)readdata[1]<<12);
*hum=data*100.0f/(1<<20);
data=(((uint32_t)readdata[3]&0X0F)<<16)+((uint32_t)readdata[4]<<8)+(uint32_t)readdata[5];
*tmp=(data*200.0f/(1<<20))-50;
}
}
main.c
OLED_Init();
aht20_init();
char message[50]="";
float tmp=0;
float hum=0;
while (1)
{
OLED_NewFrame();
aht20_read(&tmp,&hum);
sprintf(message,"tmp:%.2f",tmp);
OLED_PrintString(10, 10, message,&font16x16, OLED_COLOR_NORMAL);
sprintf(message,"hum:%.2f",hum);
OLED_PrintString(10, 30, message,&font16x16, OLED_COLOR_NORMAL);
OLED_ShowFrame();
HAL_Delay(500);
}