今天整理一下代码,顺便搞一下温湿度传感器 AHT10把之前在自动生成的文件下写的代码都移植出来,写成单独的.c和.h文件放在单独的文件夹下,然后之后我们其他地方用的话,我们可以直接复制走,这就是传说中的,模块化编程,具体可以查看大Z老师之前的老帖子

工程右键,属性



我们先移植一下模拟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);
我要赚赏金
