一、SHT20温湿度传感器概述

  SHT20是一款高精度、低功耗的温湿度传感器,专为各种环境监测应用而设计。它结合了先进的传感技术和信号处理算法,能够提供稳定可靠的湿度和温度测量数据。无论是智能家居、工业自动化还是农业监测等领域,sHT20都能满足您对精确环境监控的需求。

1.1 主要特点

  • 高精度:SHT20采用电容式湿度感应元件和热敏电阻式温度感应元件,能够准确测量相对湿度(RH)和温度值。其湿度测量精度可达±3%RH(在典型条件下),温度测量精度可达±0.3°C(在典型条件下)。
  • 低功耗:该传感器具有极低的功耗表现,适用于电池供电的应用场景。在睡眠模式下,其电流消耗仅为微安级别,有助于延长设备的整体使用寿命。
  • 快速响应:SHT20具备快速的响应速度,能够在短时间内达到稳定的测量状态。这使得它在需要实时监测环境变化的应用中表现出色。
  • 数字输出:传感器通过I²C接口与微控制器或其他数字设备进行通信,提供数字信号输出。这简化了系统集成过程,降低了开发难度。
  • 小体积:SHT20采用紧凑的封装形式,便于在各种空间受限的设备中进行安装和使用。
  • 稳定性好:经过严格的校准和测试,SHT20能够在不同的环境条件下保持稳定的性能表现。它还具有长期的稳定性和可靠性,能够满足长期监测的需求。

1.2 性能参数

  • 测量范围:湿度:0%RH至100%RH;温度:-40°C至+125°C
  • 精度:湿度:±3%RH(在25°C,50%RH时);温度:±0.3°C(在25°C时)
  • 分辨率:湿度:0.01%RH;温度:0.01°C
  • 接口类型:I²C,7位I²C地址为1000 000
  • 工作电压:1.8V至3.6V
  • 功耗:睡眠模式:<1μA;活动模式:<5mA

1.3 应用场景

  • 智能家居:用于监测室内环境的湿度和温度,为智能空调、加湿器等设备提供控制依据。
  • 工业自动化:在工厂车间、仓库等场所进行环境监测,确保生产环境的稳定性和安全性。
  • 农业监测:对农田、温室等农业设施内的温湿度进行实时监测,为农业生产提供科学依据。
  • 其他领域:如气象观测、医疗设备、数据存储中心等对温湿度有严格要求的环境监测应用。

二、SHT20,SHT30,SHT40的区别

特性 STH20 SHT30 SHT40
湿度精度(典型) ±3%RH ±2%RH ±1.8%RH
温度精度(典型) ±0.3℃ ±0.3℃ ±0.2℃
测量范围(湿度) 0~100%RH 0~100%RH 0~100%RH
测量范围(温度) -40~+125℃ -40~+125℃ -40~+125℃
工作电压 / 电流 2.1~3.6V / 300uA 2.4~5.5V / 217uA 1.08~3.6V / 320uA
响应时间 (t63%) 湿度:8s;温度:5~30s 湿度:8s;温度:>2s 湿度:4s;温度:2s
7位I2C地址 0x40 0x44 / 0x45 0x44
分辨率 12 / 14bit 16bit 16bit

三、SHT20传感器通讯

3.1 启动传感器

  首先,传感器被供电至选定的供电电压 VDD(介于 2.1V 和 3.6V 之间)。上电后,传感器最多需要 15ms(SCL 为高电平)才能达到空闲状态,即准备好接收来自主控单元(MCU)的指令。启动期间的最大电流消耗为 350µA。当传感器上电但未执行测量或通信时,它将自动进入空闲状态(睡眠模式)。

3.2 开始/停止时序

每个传输序列均以开始条件 (S) 开始,以停止条件 ( P) 结束。
  传输开始条件 (S): SCL 为高电平时,SDA 线路上的高到低电平转换。开始条件是主设备在总线上创建的唯一状态,指示从设备传输序列的开始(开始条件后,总线被视为忙碌)。
  传输停止条件 ( P):SCL 为高电平时,SDA 线路上的低到高电平转换。停止条件是主设备在总线上创建的唯一状态,指示从设备传输序列的结束(停止条件后,总线被视为空闲)。

3.3 发送命令

  发送起始条件后,后续的 I2C 报头包含 7 位 I2C 设备地址“1000000”和一个 SDA 方向位(读取 R:‘1’,写入 W:‘0’)。传感器在第 8 个 SCL 时钟的下降沿之后,通过将 SDA 引脚拉低(ACK 位)来指示已正确接收到一个字节。发出测量命令(温度为“11100011”,相对湿度为“11100101”)后,MCU 必须等待测量完成。基本命令表如下图所示。(RH代表相对湿度,T代表温度)

SHT20在采样时有两种工作模式:hold master模式和no hold master模式,具体采用哪种模式由命令决定。

  hold master模式(保持主模式):测量过程中 SCL 线被阻塞(由传感器控制),即在测量过程中会拉低 SCL 线,强制主设备进入等待状态。释放 SCL 线表示传感器内部处理已终止,可以继续传输数据。

  no hold master模式(非保持主模式):SCL 线保持打开状态,以便传感器在处理测量数据时进行其他通信。非保持主模式允许在传感器测量的同时,总线上的其他 I2C 通信任务也能进行。

hold master模式时序:(灰色的部分是传感器控制)

no hold master模式时序:

  对于这两种模式,由于测量的最大分辨率为 14 位,因此使用最后两个最低有效位(LSB,第 43 位和第 44 位)来传输状态信息。这两个 LSB 中的第 1 位指示测量类型(“0”:温度,“1”:湿度)。第 0 位目前未分配。

  测量的最大持续时间取决于测量类型和所选分辨率,不同分辨率下 RH 和 T 测量的测量时间如下图所示。

3.4 软复位

  此命令(参见上面的基本命令表)用于在不关闭电源的情况下重启传感器系统。收到此命令后,传感器系统将重新初始化并按照默认设置启动运行,软复位耗时小于 15 毫秒。

3.5 用户寄存器

3.6 CRC校验和

  SHT2x提供CRC-8校验和用于错误检测。使用的多项式为x8 + x5 + x4 + 1。

四、数据转换

  SHT20默认分辨率设置为 12 位相对湿度和 14 位温度读数。测量数据以两个字节为一组传输,即以 8 位长度的帧进行传输,其中最高有效位 (MSB) 先传输(左对齐)。每个字节后跟一个确认位。在计算物理值之前,必须将 LSB 的最后两位(状态位)设置为“0”。在上面的hold master模式和no hold master模式时序中,传输的 16 位相对湿度数据为“0110”0011”0101”0000”= 25424。

相对湿度 RH转换(结果以 %RH 为单位):其中 S R H S_{RH} SRH为原始湿度采样值,RH为转换后的实际湿度值。

温度转换(结果单位为 °C):其中 S T S_{T} ST为原始温度采样值,RH为转换后的实际温度值。

五、STM32F103C8T6驱动SHT20读取温湿度数据

5.1 准备工作

#pic_centerSTM32F103C8T6开发板,SHT20温湿度传感器模块,OLED显示屏

5.2 引脚接线

STM32F103C8T6 SHT20
PA0 SCL
PA1 SDA
PB8 OLED-SCL
PB9 OLED-SDA

5.3 代码示例

SHT20.c

#include "bsp_sht20.h"
#include "board.h"
#include "stdio.h"

void SHT20_GPIO_INIT(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_SHT20, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_SCL|GPIO_SDA;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; // 开漏输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(PORT_SHT20, &GPIO_InitStructure);
}

/******************************************************************
 * 函 数 名 称:IIC_Start
 * 函 数 说 明:IIC起始信号
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Start(void)
{
        SDA_OUT();
        
        SCL(0);
        SDA(1);
        SCL(1);
        
        delay_us(5);
        
        SDA(0);
        delay_us(5);
        SCL(0);
        delay_us(5);
}

/******************************************************************
 * 函 数 名 称:IIC_Stop
 * 函 数 说 明:IIC停止信号
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Stop(void)
{
        SDA_OUT();
        
        SCL(0);
        SDA(0);
        
        SCL(1);
        delay_us(5);
        SDA(1);
        delay_us(5); 
}

/******************************************************************
 * 函 数 名 称:IIC_Send_Ack
 * 函 数 说 明:主机发送应答
 * 函 数 形 参:0应答  1非应答
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Send_Ack(uint8_t ack)
{
	SDA_OUT();
	SCL(0);
	SDA(0);
	delay_us(5);
	if(!ack) SDA(0);
	else     SDA(1);
	SCL(1);
	delay_us(5);
	SCL(0);
	SDA(1);
}

/******************************************************************
 * 函 数 名 称:IIC_Wait_Ack
 * 函 数 说 明:等待从机应答
 * 函 数 形 参:无
 * 函 数 返 回:1=无应答   0=有应答
 * 作       者:LC
 * 备       注:无
******************************************************************/
uint8_t IIC_Wait_Ack(void)
{
	char ack = 0;
	unsigned char ack_flag = 10;
	SDA_IN();
	SDA(1);
	delay_us(5);
	SCL(1);
	delay_us(5);
	while( (SDA_GET()==1) && ( ack_flag ) )
	{
			ack_flag--;
			delay_us(5);
	}
	
	if( ack_flag <= 0 )
	{
			IIC_Stop();
			return 1;
	}
	else
	{
			SCL(0);
			SDA_OUT();
	}
	return ack;
}
/******************************************************************
 * 函 数 名 称:IIC_Write
 * 函 数 说 明:IIC写一个字节
 * 函 数 形 参:dat写入的数据
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Write(uint8_t data)
{
	int i = 0;
	SDA_OUT();
	SCL(0);//拉低时钟开始数据传输

	for( i = 0; i < 8; i++ )
	{
		SDA( (data & SHT20_ADDR) >> 7 );
		delay_us(2);
		data<<=1;
		delay_us(6); 
		SCL(1);
		delay_us(4);
		SCL(0);
		delay_us(4);	
	}
}

/******************************************************************
 * 函 数 名 称:IIC_Read
 * 函 数 说 明:IIC读1个字节
 * 函 数 形 参:无
 * 函 数 返 回:读出的1个字节数据
 * 作       者:LC
 * 备       注:无
******************************************************************/
uint8_t IIC_Read(void)
{
	unsigned char i,receive=0;
	SDA_IN();//SDA设置为输入
	for(i=0;i<8;i++ )
	{
		SCL(0);
		delay_us(5);
		SCL(1);
		delay_us(5);
		receive<<=1;
		if( SDA_GET() )
		{        
			receive|=1;   
		}
		delay_us(5); 
	}
	return receive;
}

/******************************************************************
 * 函 数 名 称:SHT20_Read
 * 函 数 说 明:测量温湿度
 * 函 数 形 参:regaddr寄存器地址 regaddr=0xf3测量温度 =0xf5测量湿度 
 * 函 数 返 回:regaddr=0xf3时返回温度,regaddr=0xf5时返回湿度
 * 作       者:LC
 * 备       注:无
******************************************************************/
float SHT20_Read(uint8_t regaddr)
{        
    unsigned char data_H = 0;
    unsigned char data_L = 0;
    float temp = 0;
    IIC_Start();
    IIC_Write(SHT20_ADDR|0);
    if( IIC_Wait_Ack() == 1 ) printf("error -1\r\n");
    IIC_Write(regaddr);
    if( IIC_Wait_Ack() == 1 ) printf("error -2\r\n");
       
    do{
    delay_us(10);
    IIC_Start();
    IIC_Write(SHT20_ADDR|1);
    
    }while( IIC_Wait_Ack() == 1 );

    delay_us(20);
    
    data_H = IIC_Read();
    IIC_Send_Ack(0);
    data_L = IIC_Read();
    IIC_Send_Ack(1);
    IIC_Stop();
    
    if( regaddr == SHT20_TRIGGER_T )
    {
        temp = ((data_H<<8)|data_L) / 65536.0 * 175.72 - 46.85;
    }
    if( regaddr == SHT20_TRIGGER_RH )
    {
        temp = ((data_H<<8)|data_L) / 65536.0 * 125.0 - 6;
    }
   return temp;
}

main.c

#include "stm32f10x.h"
#include "board.h"
#include "bsp_uart.h"
#include "stdio.h"
#include "bsp_sht20.h"
#include "oled.h"

float Temp, Hum;

int main(void)
{
	board_init();
	uart1_init(115200);
	
   //引脚初始化
   SHT20_GPIO_INIT();
   //等待传感器上电初始化完成
   delay_ms(20);

	OLED_Init();
	
	OLED_ShowString(0,0,"SHT20",16,1);
	OLED_Refresh();
	
	while(1)
	{
		Temp = SHT20_Read(SHT20_TRIGGER_T);
		Hum  = SHT20_Read(SHT20_TRIGGER_RH);
		
		OLED_ShowNum(48,18,Temp,2,16,1);
		OLED_ShowString(64,18,".",16,1);
		OLED_ShowNum(70,18,(u32)(Temp*100)%100,2,16,1);
		
		OLED_ShowChinese(0,18,0,16,1);
		OLED_ShowChinese(18,18,1,16,1);
		OLED_ShowString(37,18,"=",16,1);
		OLED_ShowChinese(90,18,2,16,1);
		
		OLED_ShowNum(48,36,Hum,2,16,1);
		OLED_ShowString(64,36,".",16,1);
		OLED_ShowNum(70,36,(u32)(Hum*100)%100,2,16,1);
		
		OLED_ShowChinese(0,36,3,16,1);
		OLED_ShowChinese(18,36,4,16,1);
		OLED_ShowString(37,36,"=",16,1);
		OLED_ShowString(90,36,"%RH",16,1);
		OLED_Refresh();

		//采集温度
     printf("温度 = %.2f℃\r\n", Temp);
     //采集湿度
     printf("湿度 = %.2f%%RH\r\n", Hum);
     printf("\r\n");
     delay_ms(500);
	}
}

5.4 效果展示

六、使用注意事项和常见问题

注意事项

  • 在使用前,请仔细阅读产品手册并遵循相关操作指南。
  • 请勿将传感器暴露在极端高温或低温环境中,以免影响其性能和寿命。
  • 避免传感器长时间处于高湿度环境中,以防止内部电路受潮损坏。
  • 在进行焊接或连接操作时,请注意防静电保护,以免损坏传感器内部的电子元件。

常见问题

  Q: 这个传感器可以测量土壤湿度吗?
  A: 土壤湿度的定义是取1公斤土样,彻底烘干,减少的重量(水的重量)与1公斤的比值成为土壤湿度。空气相对湿度的定义是当前温度下的绝对湿度与当前温度下的饱和湿度的百分比。综上土壤湿度跟空气湿度不是一个概念,也不是一个数量级,土壤湿度10%时土壤中空气的湿度已经100%了。注意:长期埋在土壤里是不会损坏的,即使带电再水里煮也不会损坏,当面对湿度稍大的土壤,土壤中空气湿度会长期是100%,测量就失去了意义。

七、总结

  SHT20作为一款高性能的温湿度传感器,以其高精度、低功耗和稳定的性能表现赢得了广泛的关注和认可。无论是在家庭、工业还是农业等领域,它都能为您提供可靠的环境监测解决方案。如果您正在寻找一款优质的温湿度传感器来满足您的需求,那么SHT20无疑是一个值得考虑的选择。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐