STM32学习之SHT20温湿度传感器

一、产品综述

SHT20, 新一代 Sensirion 湿度和温度传感器在尺寸与智能方面建立了新的标准:它嵌入了适于回流焊的双列扁平无引脚 DFN 封装, 底面 3 x3mm ,高度 1.1mm。传感器输出经过标定的数字信号,标准 I 2 C 格式。SHT20 配有一个全新设计的 CMOSens®芯片、一个经过改进的电容式湿度传感元件和一个标准的能隙温度传感元件,其性能已经大大提升甚至超出了前一代传器(SHT1x 和 SHT7x)的可靠性水平。例如,新一代湿度传感器,已经经过改进使其在高湿环境下的性能更稳定。每一个传感器都经过校准和测试。在产品表面印有产品批号,同时在芯片内存储了电子识别码-可以通过输入命令读出这些识别码。此外,SHT20的分辨率可以通过输入命令进行改变(8/12bit乃至12/14bit的 RH/T),传感器可以检测到电池低电量状态,并且输出校验和,有助于提高通信的可靠性。由于对传感器做了改良和微型化改进,因此它的性价比更高-并且最终所有设备都将得益于尖端的节能运行模式。可以使用一个新的测试包 EK-H4 对SHT20进行测试。

二、精度与量程

温度

在这里插入图片描述

相对湿度

在这里插入图片描述

三、接口定义

在这里插入图片描述

四、程序设计

相信来看本帖的同学对SHT20有一定的了解,所以这里直奔主题,关于SHT20的具体说明可看文末的中、英文数据手册和例程。

SHT20采用的I2C通信,基本命令如下表:
在这里插入图片描述

其中主机通讯的时序如图
在这里插入图片描述
首先发送写地址,再发送命令,然后是读地址,随后等待测量即可,测量时间如下图,传感器内部设置的默认分辨率为相对湿度 12位和温度 14位。45发送NACK时可取消校验。
在这里插入图片描述
下面是读取数据的代码,0x40是主机地址,先发送写命令,然后写入触发测量命令,再写入读命令,准备接收数据,数据一共三字节,依次是数据高字节、低字节、校验字节。

SHT20_ADDRESS  = 0x40;

u16 SHT20_Get_Data(u8 Cmd)
{
    
    
	u16 data;
	u8 addr, checksum;
	u8 buf[2];
  
    addr = SHT20_ADDRESS << 1;		//IIC地址是7bit,这里需要左移1位,bit0:1-读	0-写
	
	IIC_Start();					//起始信号
	
	IIC_Write_Byte(addr);			//发送设备地址(写)
	IIC_Wait_Ack();					//等待应答
	
	IIC_Write_Byte(Cmd);			//发送命令
	IIC_Wait_Ack();
	
	IIC_Start();					//重启信号
	
	IIC_Write_Byte(addr + 1);		//发送设备地址(读)
	IIC_Wait_Ack();
	
	delay_ms(70);					//等待测量
	
	buf[0] = IIC_Read_Byte();		//数据高位
	IIC_Ack();						//产生ACK应答
	buf[1] = IIC_Read_Byte();		//数据低位
	IIC_Ack();						//产生ACK应答  如果这里不应答  则不传送校验位
	
	checksum = IIC_Read_Byte();		//校验位
	IIC_NAck();						//不应答
	
	IIC_Stop();						//结束信号
	
	data = (buf[0] << 8) + buf[1];
	
	if(CRC_Check(buf, 2, checksum) == 0)		//校验
	{
    
    
		if(Cmd == SHT20_Measurement_T_HM)
		{
    
    
			data = (175.72 * data / 65536 - 46.85) * 10;	//温度计算公式
		}
		else data = (125.0 * data / 65536 - 6.0) * 10;		//湿度计算公式
		
		return data;
	}
	else return 0xFFFF;										//校验不通过返回0xFFFF
}

SHT20采用的是CRC8校验、模型为X8 + X5 +X4 +1,即CRC_MODEL = 0x131。
CRC校验的代码如下

#define CRC_MODEL 0x131

u8 CRC_Check(u8 *ptr, u8 len, u8 checksum)
{
    
    
    u8 i; 
    u8 crc = 0x00; 				//计算的初始crc值 
 
    while(len--)
    {
    
    
        crc ^= *ptr++;  		//每次先与需要计算的数据异或,计算完指向下一数据  
		
        for (i = 8; i > 0; --i) //下面这段计算过程与计算一个字节crc一样 
        {
    
     
            if (crc & 0x80)
			{
    
    
				crc = (crc << 1) ^ CRC_MODEL;
			}    
            else
                crc = (crc << 1);
        }
    }
 
    if(checksum == crc)
	{
    
    
		return 0;
	}
	else return 1;
}

源代码和中英文手册下载地址

猜你喜欢

转载自blog.csdn.net/qq_36973838/article/details/104983757