GXHT3W 温湿度传感器,1-Wire 单总线可实现长达上百米通信距离、多点分布式测温湿度

GXHT3W 温湿度传感器,1-Wire 单总线可实现长达上百米通信距离、多点分布式测温湿度,附 STM32 驱动

一、资源说明

二、基本参数

三、参考驱动

四、注意事项

 一、资源说明

        GXHT3W 是新型高精度单芯片集成温湿度传感IC是“在硅基CMOS晶圆上集成高灵敏度MEMS湿敏元件,把温度补偿和标定数据都集成在一个电路里”,实现湿敏电容结构和信号处理电路的单芯片集成,减少并降低了传感器的体积和成本,同时降低信号传输带来的干扰,提高产品精度、可靠性、一致性。

        GXHT3W  是一款低功耗的温湿度传感器,该传感器使用 1-Write 单总线通信协议,能够实现上百米的通信距离,并支持多颗分布式芯片挂载在同一根总线上进行温湿度的测量。非常适合有长远距离通信或者多颗芯片在同一条总线上进行测量温湿度的应用场景。如:粮情监测、工业温湿度变送器、温室大棚、智慧农业、智慧冷链等等。

        工作电压 2.4 ~ 5.5V 宽电压工作,温度测量范围为-45°C ~ 135°C,湿度测量范围为 0 ~ 100%RH,可支持二次过标准回流焊接,限制最高温度为260℃,焊接完成无需水合处理,常温下24小时自然恢复,并有防尘透气膜、可喷三防漆膜、防腐蚀、防熏蒸模组产品形态。

二、基本参数

        目前国内、行业内唯一的一款单总线通信协议实现温湿度的测量,GXHT3W基本参数如下。

 三、参考驱动

1、GXHT3W芯片引脚定义图

 2、GXHT3W不同温度下的湿度精度

 3、标准单总线通信时序(25℃ @ 3.3V)

4、GXHT3W两种不同的供电方式参考电气电路

 4.1 寄生供电模式
 4.2 外部供电模式

 5、GXHT3W存储器介绍

        存储器的 byte 0 和 byte 1 字节分别为温度寄存器的 LSB 和 MSB,这两个字节的存储器为只读存储器。第 2 和第 3 字节是 TH 和 TL高低温阈值。第 4 字节是配置寄存器数据,寄存器被详述于配置寄存器节。第 5 字节被器件保留,禁止写入;第 6 和第 7 字节分别为湿度寄存器的 LSB 和 MSB。 存储器的第 8 字节是只读的,包含以上八个字节的 CRC 码。

6、参考驱动程序 (基于STM32)

        bsp_GXHT3W.h
#ifndef __GXHT3W_H
#define	__GXHT3W_H


#include "stm32f10x.h"
#include "string.h"
#include "stdio.h"
#include "usart.h"

#define MaxSensorNum 8  //最大挂在数量
extern uint8_t  GXHT3W_SensorNum;
extern uint8_t  ucGXHT3WId [MaxSensorNum][ 8 ];

/************************** GXHT3W 连接引脚定义********************************/
#define      GXHT3W_DQ_SCK_APBxClock_FUN              RCC_APB2PeriphClockCmd
#define      GXHT3W_DQ_GPIO_CLK                       RCC_APB2Periph_GPIOA

#define      GXHT3W_DQ_GPIO_PORT                      GPIOA
#define      GXHT3W_DQ_GPIO_PIN                       GPIO_Pin_4



/************************** GXHT3W 函数宏定义********************************/
#define      GXHT3W_DQ_0	                            GPIO_ResetBits ( GXHT3W_DQ_GPIO_PORT, GXHT3W_DQ_GPIO_PIN ) 
#define      GXHT3W_DQ_1	                            GPIO_SetBits ( GXHT3W_DQ_GPIO_PORT, GXHT3W_DQ_GPIO_PIN ) 

#define      GXHT3W_DQ_IN()	                         GPIO_ReadInputDataBit ( GXHT3W_DQ_GPIO_PORT, GXHT3W_DQ_GPIO_PIN ) 



/************************** GXHT3W 函数声明 ********************************/
uint8_t                  GXHT3W_Init                      ( void );
void                     GXHT3W_ReadId                    ( uint8_t * GXHT3W_id );
void                     GXHT3W_Search_Rom                ( void);
void                     GXHT3w_GetTemp_SkipRom           ( void );
void                     GXHT3w_GetTemp_MatchRom          ( uint8_t * GXHT3W_id ,float* temp, float* humi);

#endif
        bsp_GXHT3W.c
#include "bsp_GXHT3W.h"
#include "string.h"
#include "delay.h"
#include "usart.h"
#include "stdio.h"

unsigned char Humiture_buff2[100];
uint8_t  ucGXHT3WId [MaxSensorNum][ 8 ] = {0};// 存检测到的传感器GXHT3W_ID的数组,前面的维数代表单根线传感器数量上限
uint8_t GXHT3W_SensorNum;                     //检测到的传感器数量(从1开始,例如显示1代表1个,8代表8个)

static void                           GXHT3W_GPIO_Config                       ( void );
static void                           GXHT3W_Mode_IPU                          ( void );
static void                           GXHT3W_Mode_Out_PP                       ( void );
static void                           GXHT3W_Rst                               ( void );
static uint8_t                        GXHT3W_Presence                          ( void );
static uint8_t                        GXHT3W_ReadBit                           ( void );
static uint8_t                        GXHT3W_ReadByte                          ( void );
static void                           GXHT3W_WriteByte                         ( uint8_t dat );
static void                           GXHT3W_SkipRom                           ( void );
static void                           GXHT3W_MatchRom                          ( void );



 /*
  * @brief  GXHT3W 初始化函数
  */

uint8_t GXHT3W_Init(void)
{
	GXHT3W_GPIO_Config ();
	
	GXHT3W_DQ_1;
	
	GXHT3W_Rst();
	
	return GXHT3W_Presence ();
	
}


/*
 * 函数名:GXHT3W_GPIO_Config
 * 描述  :配置GXHT3W用到的I/O口
 */

static void GXHT3W_GPIO_Config(void)
{		
	/*定义一个GPIO_InitTypeDef类型的结构体*/
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*开启DS18B20_DQ_GPIO_PORT的外设时钟*/
	GXHT3W_DQ_SCK_APBxClock_FUN ( GXHT3W_DQ_GPIO_CLK, ENABLE); 

	/*选择要控制的DS18B20_DQ_GPIO_PORT引脚*/															   
  	GPIO_InitStructure.GPIO_Pin = GXHT3W_DQ_GPIO_PIN;	

	/*设置引脚模式为通用推挽输出*/
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

	/*设置引脚速率为50MHz */   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数,初始化DS18B20_DQ_GPIO_PORT*/
  	GPIO_Init ( GXHT3W_DQ_GPIO_PORT , &GPIO_InitStructure );

}

/*
 * 函数名:GXHT3W_Mode_IPU
 * 描述  :使GXHT3W-DATA引脚变为输入模式
 */

static void GXHT3W_Mode_IPU(void)
{
 	  GPIO_InitTypeDef GPIO_InitStructure;

	  /*选择要控制的DS18B20_DQ_GPIO_PORT引脚*/	
	  GPIO_InitStructure.GPIO_Pin = GXHT3W_DQ_GPIO_PIN;

	  /*设置引脚模式为浮空输入模式*/ 
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	

	  /*调用库函数,初始化DS18B20_DQ_GPIO_PORT*/
	  GPIO_Init(GXHT3W_DQ_GPIO_PORT, &GPIO_InitStructure);
}


/*
 * 函数名:GXHT3W_Mode_Out_PP
 * 描述  :使GXHT3W-DATA引脚变为输出模式
 */

static void GXHT3W_Mode_Out_PP(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;

	/*选择要控制的DS18B20_DQ_GPIO_PORT引脚*/															   
  	GPIO_InitStructure.GPIO_Pin = GXHT3W_DQ_GPIO_PIN;	

	/*设置引脚模式为通用推挽输出*/
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

	/*设置引脚速率为50MHz */   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	/*调用库函数,初始化DS18B20_DQ_GPIO_PORT*/
  	GPIO_Init(GXHT3W_DQ_GPIO_PORT, &GPIO_InitStructure);
}


/*
 *主机给从机发送复位脉冲
 */

static void GXHT3W_Rst(void)
{
	/* 主机设置为推挽输出 */
	GXHT3W_Mode_Out_PP();
	
	GXHT3W_DQ_0;
	/* 主机至少产生480us的低电平复位信号 */
	delay_us(750);
	
	/* 主机在产生复位信号后,需将总线拉高 */
	GXHT3W_DQ_1;
	
	/*从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲*/
	delay_us(15);
}


/*
 * 检测从机给主机返回的存在脉冲
 * 0:成功
 * 1:失败
 */
static uint8_t GXHT3W_Presence(void)
{
	uint8_t pulse_time = 0;
	
	/* 主机设置为上拉输入 */
	GXHT3W_Mode_IPU();
	
	/* 等待存在脉冲的到来,存在脉冲为一个60~240us的低电平信号 
	 * 如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲
	 */
	while( GXHT3W_DQ_IN() && pulse_time<100 )
	{
		pulse_time++;
		delay_us(1);
	}	
	/* 经过100us后,存在脉冲都还没有到来*/
	if( pulse_time >=100 )
		return 1;
	else
		pulse_time = 0;
	
	/* 存在脉冲到来,且存在的时间不能超过240us */
	while( !GXHT3W_DQ_IN() && pulse_time<240 )
	{
		pulse_time++;
		delay_us(1);
	}	
	if( pulse_time >=240 )
		return 1;
	else
		return 0;
}


/*
 * 从GXHT3W读取一个bit
 */

static uint8_t GXHT3W_ReadBit(void)
{
	uint8_t dat;
	
	/* 读0和读1的时间至少要大于60us */	
	GXHT3W_Mode_Out_PP();
	/* 读时间的起始:必须由主机产生 >1us <15us 的低电平信号 */
	GXHT3W_DQ_0;
	delay_us(10);
	
	/* 设置成输入,释放总线,由外部上拉电阻将总线拉高 */
	GXHT3W_Mode_IPU();
	//DS18B20_DELAY_US(2);
	
	if( GXHT3W_DQ_IN() == SET )
		dat = 1;
	else
		dat = 0;
	
	/* 这个延时参数请参考时序图 */
	delay_us(45);
	
	return dat;
}


/*
 * 从GXHT3W读一个字节,低位先行
 */
static uint8_t GXHT3W_ReadByte(void)
{
	uint8_t i, j, dat = 0;	
	
	for(i=0; i<8; i++) 
	{
		j = GXHT3W_ReadBit();		
		dat = (dat) | (j<<i);
	}
	
	return dat;
}


/*
 * 写一个字节到GXHT3W,低位先行
 */

static void GXHT3W_WriteByte(uint8_t dat)
{
	uint8_t i, testb;
	GXHT3W_Mode_Out_PP();
	
	for( i=0; i<8; i++ )
	{
		testb = dat&0x01;
		dat = dat>>1;		
		/* 写0和写1的时间至少要大于60us */
		if (testb)
		{			
			GXHT3W_DQ_0;
			/* 1us < 这个延时 < 15us */
			delay_us(8);
			
			GXHT3W_DQ_1;
			delay_us(58);
		}		
		else
		{			
			GXHT3W_DQ_0;
			/* 60us < Tx 0 < 120us */
			delay_us(70);
			
			GXHT3W_DQ_1;			
			/* 1us < Trec(恢复时间) < 无穷大*/
			delay_us(2);
		}
	}
}


 /**
  * @brief  跳过匹配 DS18B20 ROM
  * @param  无
  * @retval 无
  */
static void GXHT3W_SkipRom ( void )
{
	GXHT3W_Rst();	   
	
	GXHT3W_Presence();	 
	
	GXHT3W_WriteByte(0XCC);		/* 跳过 ROM */
	
}


 /**
  * @brief  执行匹配 GXHT3W ROM
  * @param  无
  * @retval 无
  */
static void GXHT3W_MatchRom ( void )
{
	GXHT3W_Rst();	   
	
	GXHT3W_Presence();	 
	
	GXHT3W_WriteByte(0X55);		/* 匹配 ROM */
	
}


/**
  * @brief  在匹配 ROM 情况下获取 GXHT3W 温湿度度值 
  * @param  GXHT3W_id:存放 GXHT3W 序列号的数组的首地址
  * @retval 温度值
  */

void GXHT3w_GetTemp_MatchRom ( uint8_t * GXHT3W_id ,float* temp, float* humi)
{
	uint8_t tpmsb, tplsb, Th, Tl, con, res, humil, humim, crc, i;
	u16 tem,hum;

	float Temperature=0;
	float Humidity=0;

	GXHT3W_MatchRom ();            //匹配ROM
	
    for(i=0;i<8;i++)
	GXHT3W_WriteByte ( GXHT3W_id [ i ] );	
	
	GXHT3W_WriteByte(0X44);		   /* 开始转换 */
	
	GXHT3W_MatchRom ();            //匹配ROM
	
	for(i=0;i<8;i++)
	GXHT3W_WriteByte ( GXHT3W_id [ i ] );	
	
    delay_ms(50);
	
    GXHT3W_WriteByte(0XBE);			/* 读温度值 */
	
	tplsb = GXHT3W_ReadByte();		 
	tpmsb = GXHT3W_ReadByte(); 
	Th    = GXHT3W_ReadByte(); 
	Tl    = GXHT3W_ReadByte();
	con   = GXHT3W_ReadByte();
	res   = GXHT3W_ReadByte();
	humil = GXHT3W_ReadByte();
	humim = GXHT3W_ReadByte();
	crc   = GXHT3W_ReadByte();
	tpmsb = 0x0f & tpmsb;

	tem = ((tpmsb<<8) | tplsb);//温度拼接	
	hum = ((humil<<8) | humim);//湿度拼接
	
    Temperature= (175.0*(float)tem /4095.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)
	Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)
			
	*temp = Temperature;
	*humi = Humidity;
    
    tem = 0;
    hum = 0;				
}


/**
  * @brief  在skip ROM 情况下获取 GXHT3W 温湿度度值 
  * @param  GXHT3W_id:存放 GXHT3W 序列号的数组的首地址
  * @retval 温度值
  */

void GXHT3w_GetTemp_SkipRom ( void )
{
	uint8_t tpmsb, tplsb, Th, Tl, con, res, humil, humim, crc, i;
	u16 tem,hum;

	float Temperature=0;
	float Humidity=0;
		
	GXHT3W_SkipRom ();
	GXHT3W_WriteByte(0X44);				/* 开始转换 */
	
	delay_ms(3);
	GXHT3W_SkipRom ();
	GXHT3W_WriteByte(0XBE);				/* 读温度值 */
	
	tplsb = GXHT3W_ReadByte();		 
	tpmsb = GXHT3W_ReadByte(); 
	Th    = GXHT3W_ReadByte(); 
	Tl    = GXHT3W_ReadByte();
	con   = GXHT3W_ReadByte();
	res   = GXHT3W_ReadByte();
	humil = GXHT3W_ReadByte();
	humim = GXHT3W_ReadByte();
	crc   = GXHT3W_ReadByte();
	
	tpmsb = 0x0f & tpmsb;

	tem = ((tpmsb<<8) | tplsb);//温度拼接
	hum = ((humil<<8) | humim);//湿度拼接

    Temperature= (175.0*(float)tem /4095.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)	
	Humidity= (100.0*(float)hum/65535.0);         // RH = hum*100 / (2^16-1)
	
	printf("Temperature:%.2f,Humidity:%.2f\r\n",Temperature,Humidity);
			
}

/*************************************END OF FILE******************************/

四、注意事项

1、单总线DQ须加上拉电阻,建议1~10K,一般建议选择4.7K即可;

2、主机发送完数据转换命令,须加一定的延时,确保芯片完成数据转换,再读数据;

友情提示:

      欢迎各位伙伴咨询、测试GXHT3W温湿度传感器,有任何问题可随时沟通交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值