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******************************/