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);}