欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-22 09:42:07
GXHT30温湿度传感器——与SHT30 pin to pin 兼容的温湿度传感器例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言GXHT30温湿度传感器是一款国产温湿度I2C传感器芯片,由北京中科银河芯研发并量产,其性能与通信方式与SHT30完全兼容,可pin to pin.....

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温湿度传感器——与SHT30 pin to pin 兼容的温湿度传感器

 如图为贴了防尘透气膜的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在读取数据时有两种模式,如下图:

 

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

 在后面读取数据时我使用了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