这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32G070RB探测17-模拟IIC采集温湿度显示到OLED

共1条 1/1 1 跳转至

STM32G070RB探测17-模拟IIC采集温湿度显示到OLED

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

单片机模块化编程---第一弹(一)

添加头文件所在文件夹的方式

工程右键,属性

进入正题,今天我来采集一下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);



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]