工程右键,属性
进入正题,今天我来采集一下AHT10的温湿度,同时把它显示在OLED上(AHT10和OLED是同一个IIC总线)我们先移植一下模拟IIC,我是直接导入了我之前用过的库,只需修改宏定义即可
同样库文件我会放在帖子最后
搞好了IIC驱动,下一步就是看AHT10的手册了IIC首先要确定设备地址 从数据手册可知,设备地址为0X38
我们可以计算出来读地址和写地址
#define AHT10_ADDRESS 0x38 #define AHT10_WRITE (AHT10_ADDRESS<<1) #define AHT10_READ (AHT10_WRITE+1)
根据手册编写初始化函数
发送0XE1表示初始化,据此编写
/** brief AHT10初始化函数 param NONE return NONE */ void AHT10Init() { IIC_Init(); IIC_Start(); IIC_Send_Byte(AHT10_ADDRESS); IIC_Send_Byte(0xe1); IIC_Stop(); delay_ms(40);//延时20ms让传感器稳定 }
然后编写读取函数,继续看手册
整个流程写的一清二楚
再看下转换公式
开写
/** brief 检查AHT10读温湿度数据 param *temperature:需要读出的温度数据,float指针类型,精度范围+-0.3C param *humidity:需要读出的湿度数据,u8指针类型,精度范围+-2RH return 0 读数据正常 1读数据失败 */ u8 AHT10ReadData(float *temperature,u8 *humidity) { u8 ack; u32 SRH=0,ST=0; u8 databuff[6]; IIC_Start(); IIC_Send_Byte(AHT10_WRITE); IIC_Wait_Ack(); IIC_Send_Byte(0xac); IIC_Wait_Ack(); IIC_Send_Byte(0x33); IIC_Wait_Ack(); IIC_Send_Byte(0x00); IIC_Wait_Ack(); IIC_Stop(); delay_ms(80);//延时一会等待数据读出 IIC_Start(); IIC_Send_Byte(AHT10_READ); IIC_Wait_Ack(); ack=IIC_Read_Byte(1); if((ack&0x40)==0) { databuff[0]=IIC_Read_Byte(1); databuff[1]=IIC_Read_Byte(1); databuff[2]=IIC_Read_Byte(1); databuff[3]=IIC_Read_Byte(1); databuff[4]=IIC_Read_Byte(0); IIC_Stop(); SRH=(databuff[0]<<12)+(databuff[1]<<4)+(databuff[2]>>4); ST=((databuff[2]&0X0f)<<16)+(databuff[3]<<8)+(databuff[4]); *humidity=(int)(SRH*100.0/1024/1024+0.5); *temperature=((int)(ST*2000.0/1024/1024+0.5))/10.0-50; return 0; } IIC_Stop(); return 1; }主函数来了
初始化
OLED_Init(); AHT10Init();
while(1)
while (1) { if(AHT10ReadData(&tem,&hum)==0) { printf("tem:%.1f\r\nhum:%d%%\r\n",tem,hum); } else { printf("aht10 not read\r\n"); } OLED_ShowCHinese(0u,0u,0); OLED_ShowCHinese(16u,0u,1); OLED_ShowCHinese(32u,0u,2); OLED_ShowCHinese(48u,0u,3); OLED_ShowCHinese(64u,0u,4); OLED_ShowCHinese(80u,0u,5); OLED_P8x16Str(0u,2u,(uint8_t *)"EEPW & STM32"); sprintf(buf,"tem:%.1f",tem); OLED_P8x16Str(0u,4u,(uint8_t *)buf); sprintf(buf,"hum:%d%%",hum); OLED_P8x16Str(0u,6u,(uint8_t *)buf); HAL_Delay(5000); }
效果 展示
能看的出我住的地方害挺暖和,暖气-冬天滴神xxxxxxxxxx OLED_ShowCHinese(0u,0u,0);OLED_ShowCHinese(16u,0u,1);OLED_ShowCHinese(32u,0u,2);OLED_ShowCHinese(48u,0u,3);OLED_ShowCHinese(64u,0u,4);OLED_ShowCHinese(80u,0u,5);