GXHT30温湿度传感器——与SHT30 pin to pin 兼容的温湿度传感器

2022-07-28,,

GXHT30温湿度传感器——与SHT30 pin to pin 兼容的温湿度传感器


 

文章目录

 

目录

GXHT30温湿度传感器——与SHT30 pin to pin 兼容的温湿度传感器

文章目录

前言

一、传感器参数

二、使用示例(STM8l驱动) 

1.IO口配置

2.配置SDA输入输出

3.通信子函数

 4.读取数据

三.总结


 


前言

GXHT30温湿度传感器是一款国产温湿度I2C传感器芯片,由北京中科银河芯研发并量产,其性能与通信方式与SHT30完全兼容,可pin to pin替代SHT30,本文将针对该传感器的一些工作参数与通信进行介绍。


 

一、传感器参数

GXHT30温湿度传感器的工作参数与SHT30相差不大,对比如下。

      GXHT30                                                                                                   SHT30

工作电压:2.4~5.5V                                                                              工作电压:2.4~5.5V

精度:±3%RH  ,±0.2℃                                                                       精度:±3%RH  ,±0.3℃

接口:I2C                                                                                              接口:I2C

尺寸:2.5*2.5*0.9(mm)                                                                    尺寸:2.5*2.5*0.9(mm)

 如图为贴了防尘透气膜的GXHT30温湿度传感器。

二、使用示例(STM8l驱动) 

1.IO口配置

I2C端口初始化:使用C0和C1分别配置为SDA和SCL。

#define I2C_SCL GPIO_Pin_1	  
#define I2C_SDA GPIO_Pin_0	  
#define GPIO_I2C GPIOC

#define I2C_SCL_H GPIO_SetBits(GPIO_I2C,I2C_SCL)
#define I2C_SCL_L GPIO_ResetBits(GPIO_I2C,I2C_SCL)

#define I2C_SDA_H GPIO_SetBits(GPIO_I2C,I2C_SDA)
#define I2C_SDA_L GPIO_ResetBits(GPIO_I2C,I2C_SDA)
/****************************************************************************
* Function Name  : IIC_Config
* Description    : 初始化GPIO.(GXCAS-GXHT30)
* Input          : None
* Output         : None
* Return         : None
****************************************************************************/
void I2C_INIT()
{
	
        GPIO_Init(GPIO_I2C, I2C_SCL, GPIO_Mode_Out_OD_HiZ_Fast);
        GPIO_Init(GPIO_I2C, I2C_SDA, GPIO_Mode_Out_OD_HiZ_Fast);
        I2C_SCL_H;
	I2C_SDA_H;
       
}

 

2.配置SDA输入输出

/*******************************************************************************
* 函 数 名         : I2C_SDA_OUT
* 函数功能          : SDA输出配置	   
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void I2C_SDA_OUT()
{
       
  GPIO_Init(GPIO_I2C, I2C_SDA, GPIO_Mode_Out_OD_HiZ_Fast);
}

/*******************************************************************************
* 函 数 名         : I2C_SDA_IN
* 函数功能         : SDA输入配置	   
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void I2C_SDA_IN(void)
{
	
  GPIO_Init(GPIO_I2C, I2C_SDA, GPIO_Mode_In_FL_No_IT);
}

3.通信子函数

这里是I2C通信的标准格式,就不多作赘述,需要注意的是 I2C_Read_Byte(u8 ack)函数中的 while(!GPIO_ReadInputDataBit(GPIO_I2C,I2C_SCL));这一句,因为SHT30在读取数据时有两种模式,如下图:

 

 在后面读取数据时我使用了clock stretching模式命令,因此温湿度数据转换好时SCL会拉高。如果不使用clock stretching模式命令,则在发送转换命令后需要等待约20ms,然后再发送传感器地址读温湿度。

//产生起始信号
void I2C_Start(void)
{
    I2C_SDA_OUT();
	
    I2C_SDA_H;
    I2C_SCL_H;
    delay_10us(1);
    I2C_SDA_L;
    delay_10us(1);
    I2C_SCL_L;
}

//产生停止信号
void I2C_Stop(void)
{
    I2C_SDA_OUT();

    I2C_SCL_L;
    I2C_SDA_L;
    I2C_SCL_H;
    delay_10us(1);
    I2C_SDA_H;
    delay_10us(1);
}

//主机产生应答信号ACK
void I2C_Ack(void)
{
   I2C_SDA_OUT();
   I2C_SCL_L;
   I2C_SDA_OUT();
   I2C_SDA_L;
   delay_10us(1);
   I2C_SCL_H;
   delay_10us(1);
   I2C_SCL_L;
}

//主机不产生应答信号NACK
void I2C_NAck(void)
{
   I2C_SDA_OUT();
   I2C_SCL_L;
   
   I2C_SDA_H;
   
   I2C_SCL_H;
   delay_10us(1);
   I2C_SCL_L;
}
//等待从机应答信号
//返回值:1 接收应答失败
//       0 接收应答成功
u8 I2C_Wait_Ack(void)
{
	u8 tempTime=0;

	I2C_SDA_IN();

	I2C_SDA_H;
	//delay_us(1);
	I2C_SCL_H;
	//delay_us(1);

	while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
	{
		tempTime++;
		if(tempTime>250)
		{
			I2C_Stop();
			return 1;
		}	 
	}

	I2C_SCL_L;
	return 0;
}
//I2C 发送一个字节
void I2C_Send_Byte(u8 txd)
{
	u8 i=0;

	I2C_SDA_OUT();
	I2C_SCL_L;//拉低时钟开始数据传输

	for(i=0;i<8;i++)
	{
		if((txd&0x80)>0) //0x80  1000 0000
			I2C_SDA_H;
		else
			I2C_SDA_L;

		txd<<=1;
		I2C_SCL_H;
		//delay_us(2); //发送数据
		I2C_SCL_L;
		//delay_us(2);
	}
}

//I2C 读取一个字节

u8 I2C_Read_Byte(u8 ack)
{
   u8 i=0,receive=0;

   I2C_SDA_IN();
   for(i=0;i<8;i++)
   {
   		I2C_SCL_L;
		//delay_us(2);
		I2C_SCL_H;
                while(!GPIO_ReadInputDataBit(GPIO_I2C,I2C_SCL));
		receive<<=1;
		if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
		receive++;
		//delay_us(1);	
   }

   	if(ack==0)
	   	I2C_NAck();
	else
		I2C_Ack();

	return receive;
}

 4.读取数据

 

void GXHT30_read_result(u8 addr)
{
	u16 tem,hum;
	//u16 tem1[8];
	u16 buff[6];
	//float Temperature1[129]={0};
	//float Temperature2=0;
	float Temperature=0;
	float Humidity=0;
	
	I2C_Start();
	I2C_Send_Byte(addr<<1 | write);//0
	I2C_Wait_Ack();
	I2C_Send_Byte(0x2C);
	I2C_Wait_Ack();
	I2C_Send_Byte(0x10);
	I2C_Wait_Ack();
	I2C_Stop();
	delay_10us(5);
	I2C_Start();
	I2C_Send_Byte(addr<<1 | read);//1
	if(I2C_Wait_Ack()==0)
	{
		I2C_SDA_IN();
		
		
		
		buff[0]=I2C_Read_Byte(1);
		
		buff[1]=I2C_Read_Byte(1);
		
		buff[2]=I2C_Read_Byte(1);
		
		buff[3]=I2C_Read_Byte(1);
		
		buff[4]=I2C_Read_Byte(1);
		
		buff[5]=I2C_Read_Byte(0);
		
		I2C_Stop();
		
	}
	
	tem = ((buff[0]<<8) | buff[1]);//
	hum = ((buff[3]<<8) | buff[4]);//
	
	
	Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)
	Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)
        
        hum=0;
	tem=0;
}

 此函数用于读取芯片转换好的温度与湿度数据。需要注意的是在传感器的SCL和SDA接口需要加上拉电阻,4.7或者10K都可以,此外芯片的ADDR接口如果接地,则芯片地址为0X44,如果接高电平则为0X45。这一点也和SHT30一致。


三.总结

以上程序是使用STM8L152来驱动GXHT30的代码,GXHT30温湿度传感器与SHT30兼容,因此此程序可驱动两颗传感器。

 

本文地址:https://blog.csdn.net/qq_44668817/article/details/108419725

《GXHT30温湿度传感器——与SHT30 pin to pin 兼容的温湿度传感器.doc》

下载本文的Word格式文档,以方便收藏与打印。