一、 产品简述
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采用iic协议进行通信,关于iic协议这里不多赘述,不了解的伙伴可以百度或者参照产品手册进行学习。
触发测量的命令:
保持主模式测量时序图
无保持主模式测量时序图
五、基于ESP8266 2.0NOS SDK代码
sht20 头文件
#ifndef _I2C_SHT20_H_
#define _I2C_SHT20_H_
#include "ets_sys.h"
#define sht20Addr_W 0x80
#define sht20Addr_R 0x81
//sensor command
typedef enum {
TRIG_T_MEASUREMENT_HM = 0xE3, //触发温度测量 保持主模式
TRIG_RH_MEASUREMENT_HM = 0xE5,//触发湿度测量 保持住模式
TRIG_T_MEASUREMENT_POLL = 0xF3,//触发温度测量 无保持主模式
TRIG_RH_MEASUREMENT_POLL = 0xF5,//触发湿度测量 无保持住模式
USER_REG_W = 0xE6,//用户写寄存器
USER_REG_R = 0xE7 //用户读寄存器
}sht20Cmd;
typedef enum {
SHT2x_RES_12_14BIT = 0x00, // RH=12bit, T=14bit
SHT2x_RES_8_12BIT = 0x01, // RH= 8bit, T=12bit
SHT2x_RES_10_13BIT = 0x80, // RH=10bit, T=13bit
SHT2x_RES_11_11BIT = 0x81, // RH=11bit, T=11bit
SHT2x_RES_MASK = 0x81 // Mask for res. bits (7,0) in user reg.
} SHT2xResolution;
typedef enum {
HUMIDITY,
TEMP
}sht20MeasureType;
typedef struct
{
int tempreture;
int humidity;
} SHT20_INFO;
void sht20GetValue(void);
void SHT20_SetResolution(uint8_t res);
int sht20MeasureHM(sht20MeasureType type );
void sht20SoftReset();
int sht20CalcRH(uint16_t dat);
int sht20CalcTemp(uint16_t dat);
#endif
sht20 c文件
#include "driver/i2c_master.h"
#include "driver/i2c_sht20.h"
#include "user_interface.h"
#include "osapi.h"
const int16_t POLYNOMIAL = 0x131;
SHT20_INFO sht20_info;
void delayms(u32 ms)
{
while(ms--)
{
os_delay_us(1000);
}
}
//检测CRC
// u8 sht20CheckCrc(u8 data[], u8 nbrOfBytes , u8 checksum)
// {
// u8 crc = 0;
// u8 byteCtr;
// u8 bit;
// for(byteCtr = 0; byteCtr<nbrOfBytes;byteCtr++)
// {
// crc ^= (data[byteCtr]);
// for(u8 bit = 0; bit<8 ; bit++)
// {
// if(crc&0x80)
// crc = (crc<<1) ^ POLYNOMIAL;
// else
// crc = (crc<<1);
// }
// }
// if(crc != checksum)
// {
// return 1;
// }else
// return 0;
// }
//驱动sht20测量温湿度
int sht20MeasureHM(sht20MeasureType type )
{
u16 i;
float t = 0;
uint16_t Measurand;
uint8_t data[2] = {0};
//设置测量模式
SHT20_SetResolution(SHT2x_RES_12_14BIT);
//开始测量
i2c_master_start();
i2c_master_writeByte(sht20Addr_W);
if(!i2c_master_checkAck())
{
os_printf("no MeasureHM ack1\n");
}
switch (type)
{
case HUMIDITY: i2c_master_writeByte(TRIG_RH_MEASUREMENT_HM),i2c_master_checkAck();
break;
case TEMP: i2c_master_writeByte(TRIG_T_MEASUREMENT_HM),i2c_master_checkAck();
default:
break;
}
i2c_master_start();
i2c_master_writeByte(sht20Addr_R);
if(!i2c_master_checkAck())
{
os_printf("no MeasureHM ack2\n");
}
i2c_master_wait(20);
for(i=0; i<600; i++)
{
system_soft_wdt_feed();
i2c_master_wait(1000);
}
data[0] = i2c_master_readByte();
i2c_master_send_ack();
data[1] = i2c_master_readByte();
i2c_master_send_nack();
i2c_master_stop();
if(type == HUMIDITY)
{
Measurand = ((uint16_t)data[0]<<8) + (data[1]&0xfc);
t = sht20CalcRH(Measurand);
}else{
Measurand = ((uint16_t)data[0]<<8) + (data[1]&0xfe);
t = sht20CalcTemp(Measurand);
}
return t;
}
//sht20 软件复位
void sht20SoftReset()
{
u8 ack;
i2c_master_start();
i2c_master_writeByte(sht20Addr_W);
ack = i2c_master_checkAck();
i2c_master_writeByte(0xfe);
ack = i2c_master_checkAck();
if(!ack)
{
os_printf("sent Reset cmd failed\n");
}
i2c_master_stop();
delayms(200);
}
//计算湿度值
int sht20CalcRH(uint16_t dat)
{
int humidityRH;
humidityRH = (int)((dat*125.00/(float)65536 - 6.0000)*10);
return humidityRH;
}
//计算温度值
int sht20CalcTemp(uint16_t dat)
{
int temperatureC = 0;
temperatureC = (int)((dat*175.72/(float)65536 - 46.85)*10);
return temperatureC;
}
//获取计算过后的温湿度值并打印输出
void sht20GetValue(void)
{
sht20_info.tempreture = sht20MeasureHM(TEMP); //测量温度值
sht20_info.humidity = sht20MeasureHM(HUMIDITY);//测量湿度值
os_delay_us(25);
os_printf( "Temp: %d.%d℃ RH:%d.%d%\r\n",sht20_info.tempreture/10,sht20_info.tempreture%10, sht20_info.humidity/10, sht20_info.humidity%10);
sht20SoftReset();
}
//设置测量模式
void SHT20_SetResolution(uint8_t res)
{
u8 Register;
u8 ack;
i2c_master_start();//S
i2c_master_writeByte(sht20Addr_W);//I2C Addr + Write
ack = i2c_master_checkAck();
i2c_master_writeByte(USER_REG_R);//Read Register
ack = i2c_master_checkAck();
delayms(20);
i2c_master_start();//S
i2c_master_writeByte(sht20Addr_R);//I2C Addr + Read
ack = i2c_master_checkAck();
Register = i2c_master_readByte();//Read Register content
i2c_master_send_nack();//NoAck
i2c_master_start();//S
i2c_master_writeByte(sht20Addr_W);//I2C Addr + Write
ack = i2c_master_checkAck();
i2c_master_writeByte(USER_REG_W);//Write Register
ack = i2c_master_checkAck();
//修改bit7
if ((res == SHT2x_RES_12_14BIT)||(SHT2x_RES_8_12BIT ==res))
{
Register = Register & 0x7F;
}
else
{
Register = Register | 0x80;
}
//修改bit0
if ((res == SHT2x_RES_12_14BIT)||(SHT2x_RES_10_13BIT ==res))
{
Register = Register & 0xFE;
}
else
{
Register = Register | 0x01;
}
i2c_master_writeByte(Register);//Register content
ack = i2c_master_checkAck();
if(!ack)
{
os_printf("SHT20_SetResolution failed\n");
}
i2c_master_stop();//P
delayms(200);
}