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采用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);
}

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值