GXHT30温湿度传感器——与SHT30 pin to pin 兼容的温湿度传感器
GXHT30温湿度传感器——与SHT30 pin to pin 兼容的温湿度传感器
前言
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
下一篇: 树莓派64位系统成功安装bcm2835库