嵌入式STM32使用SHT31温湿度传感器测量环境数据

目录

简介

1、原理图 

2、时序说明 

数据传输

起始信号 

结束信号 

3、SHT31读写数据 

SHT31指令集

读数据 

温湿度转换

4、温湿度转换应用 

sht3x初始化

读取温湿度 


简介

什么是SHT31?  一主机多从机–通过寻址的方式–每个从机都有唯一的地址(器件地址0x44+引脚地址)<<1 + 读写位(读1写0)

 SHT31新一代 Sensirion 湿度和温度传感器在尺寸与智能方面建立了新的标准:它嵌入了适于回流焊的双列扁平无引脚 DFN 封装, 底面 3 x 3mm ,高度 1.1mm。传感器输出经过标定的数字信号,标准 I2C 格式。

1、原理图 

 

配置为通用开漏输出

PB6–SCL   

PB7–SDA

 器件地址  引脚地址–ADDR引脚的高低电平

0x44+  0

           1

 

2、时序说明 

数据传输

 SDA 引脚用于传感器的数据输入和输出。当向传感器发送命令时, SDA 在串行时钟(SCL)的上升沿
有效, 且当 SCL 为高电平时, SDA 必须保持稳定。在 SCL 下降沿之后, SDA 值可被改变。为确保通讯
安全, SDA 的有效时间在 SCL 上升沿之前和下降沿之后应该分别延长至 TSU and THO -参考图 9。当从传感器读取数据时, SDA 在 SCL 变低以后有效(TV),且维持到下一个 SCL 的下降沿 。

为避免信号冲突,微处理器(MCU)必须只能驱动SDA 和 SCL 在低电平。需要一个外部的上拉电阻(例如: 10kΩ)将信号提拉至高电平。上拉电阻通常可能已包含在微处理器的 I/O 电路中。

起始信号 

结束信号 

3、SHT31读写数据 

SHT31指令集

了解一下如下SHT31命令集:

 

读数据 

工作顺序为:先发送IIC通信开始标志Start后,写入左移一位的地址,并将空出来的位写0表示写数据。当收到传感器应答后,即可发送命令的高八位,再次等待应答,再发送余下的低八位。然后等待ACK应答即可。

 

(读 R:‘1’,写 W:‘0’)。在第 8 个 SCL时钟下降沿之后,通过拉低 SDA 引脚(ACK 位),指示传感器数据接收正常。

校验:发送一次读取指令,收到6字节数据;期中1、2字节数温度的,第三字节是温度的校验字节;4、5字节是湿度的,第6字节是湿度的校验字节。校验方式采用。

温湿度转换

4、温湿度转换应用 

sht3x初始化

读取温湿度 

/*********************************************************************************************************
* 函 数 名 : Sht3x_Read_TemperatureHumidity
* 功能说明 : 读取SHT3x温湿度数据
* 形    参 : HT:存储温湿度的结构体指针
* 返 回 值 : 无
*********************************************************************************************************/ 
int Sht3x_Read_TemperatureHumidity(Sht3x_TypeDef *temp)
{
	unsigned char buff[6] = {0};
	unsigned char i = 0;
	
	IIC_Start();										//起止信号
	IIC_WriteByte(SHT3X_ADDR<<1 | IIC_WRITE);			//器件地址+写
	if(IIC_Wait_ACK() == ACK){							//对方应答了,继续执行
		IIC_WriteByte(SHT3X_READ_TEMP_HUM>>8);			//命令的高位
		if(IIC_Wait_ACK() == ACK){						//对方应答了,继续执行
			IIC_WriteByte(SHT3X_READ_TEMP_HUM&0xff);	//命令的低位
			if(IIC_Wait_ACK() == ACK){					//对方应答了,继续执行
				do{
					if(++i > 20){
						return 4;
					}
					IIC_Stop();
					Delay_Ms(2);							//等待对方采集好数据
					IIC_Start();
					IIC_WriteByte(SHT3X_ADDR<<1 | IIC_READ);//询问是否采集好了数据
				}while(IIC_Wait_ACK() != ACK);				//如果条件成立,表示传感器采集数据未完成
				
				for(i=0; i<5; i++){
					buff[i] = IIC_ReadByte(ACK);
				}
				buff[5] = IIC_ReadByte(NACK);
				IIC_Stop();
				
		}
		//转换温湿度
if(crc8(buff, 2) == buff[2] && crc8(&buff[3], 2) == buff[5])
{
	temp->temperature = (buff[0]<<8|buff[1])/65535.0*175-45;
	temp->humidity = (buff[3]<<8|buff[4])/65535.0*100;
}

物联沃分享整理
物联沃-IOTWORD物联网 » 嵌入式STM32使用SHT31温湿度传感器测量环境数据

发表评论