主要特性

HTS221是意法半导体(STMicroelectronics)生产的小体积、数字式温湿度传感器IC。该IC目前在官网仍处在“评估”状态。其主要特性:

  • 工作电压:1.7~3.6V
  • 数据输出频率(ODR)可设:1Hz ~ 12.5Hz
  • 低功耗:2μA@1Hz ODR
  • 温度精度:给出误差典型值+/-0.5°C, 15~40°C;但注明“Typical specifications are not guaranteed.”。无误差最大值信息。
  • 湿度精度:给出误差典型值+/-4.5%RH, 20~80%RH;同样注明“Typical specifications are not guaranteed.”。无误差最大值信息。
  • 内置16-bit ADC
  • 接口:I2C或3-wire SPI
  • 出厂已校准,但需要用户自行读取校准信息、并计算校准后的结果
  • 封装:2 x 2 x 0.9mm HLGA-6L封装,是已知同类传感器中体积最小的
  • 片上集成加热器(heater)

管脚定义

和其他的温湿度传感器比,HTS221的芯片管脚功能更多、也略显复杂:

  • VDD:电源,支持1.7~3.6V电压
  • GND:地
  • CS:I2C/3-wire SPI接口选择,当CS=1时为I2C接口,反之为3-wire SPI接口。默认为1。
  • SCL/SPC:I2C或3-wire SPI接口的时钟线,由CS选择。
  • SDA/SDI/SDO:I2C或3-wire SPI接口的数据线,由CS选择。
  • DRDY:提供Data Ready信号输出。当测量完成、有温湿度数据可供读取时,DRDY为高电平;当无温湿度数据、或温湿度数据已被读取完毕后,DRDY为低电平。该功能也可以通过设置控制寄存器(CTRL_REG3)关闭。

与Arduino的连接

虽然HTS221支持I2C、3-wire SPI接口。对于3-wire SPI接口,其数据输入/输出(SDI/SDO)共用一条信号线,不同于Arduino的四线制SPI,有MOSI、MOSI信号线的区分。因此还是通过I2C接口连接。由于Arduino UNO正常工作在5V电压下,因此二者的连接还需要I2C Logic Level Converter。留意Converter带了I2C总线所需的上拉电阻。

功能调试

1. HTS221内置不少寄存器,每个寄存器都有一个8bit的子地址(sub-address)。在操作时,既可以单独对某个地址的寄存器进行I2C读/写,也可以在一次I2C命令中对连续的多个地址的寄存器进行读/写。

2. 手册没有给出每次测量所需的测量时间,实测默认配置下one shot测量用时约3ms。代码中通过读取STATUS_REG寄存器,来判断一次测量是否完毕。也可以通过读取DRDY管脚信号进行判断。

3. HTS221将出厂前的校准信息保存在内部寄存器中,温度校准有两对数据:t0 & t0out, t1 & t1out,湿度校准亦有两对数据:h0 & h0t0out, h1 & h1t0out。从命名上看,湿度校准数据是在t0温度下做的。MCU将HTS221温湿度输出值得到后,还需要利用这两组校正数据进行反推(线性插值),继而获得所代表的温湿度测量结果。代码在初始化部分,读取了四组校准数据并打印了出来。
    为什么不能像其他传感器那样,读出来的值就是计算好的最终结果呢?

4. Arduino库自带的map()只能对整型进行操作,因此将其改成了对浮点数进行操作。

5. 从测量结果上看,湿度动辄75%以上,明显偏高不少。

6. 尝试用中断函数捕获DRDY上升沿,进而在中断函数中进行数据读取。可是不知为何,中断函数会卡在对I2C的操作上。

测试代码

 /*
Measurement of relative humidity and temperature using HTS221
*/ #include <Wire.h> #define ADDRESS_HTS221 0x5F
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define STATUS_REG 0x27
#define HUMIDITY_OUT_L_REG 0x28
#define T0_degC_x8 0x32
#define T0_OUT 0x3C
#define H0_rH_x2 0x30
#define H0_T0_OUT 0x36
#define H1_T0_OUT 0x3A byte buffer[] = {, , , };
byte status = ; float t0, t1, h0, h1;
int t0out, t1out, h0out, h1out; int outHumi = ;
int outTemp = ;
float valueHumi = ;
float valueTemp = ; void setup()
{
Wire.begin();
Serial.begin(); //turn on the HTS221, set the update mode to one shot
Wire.beginTransmission(ADDRESS_HTS221);
Wire.write(CTRL_REG1);
Wire.write(0x84);
Wire.endTransmission(); ReadCaliData(); //print the calibration coefficients
Serial.println("Calibration coefficients: ");
Serial.print("t0 = "); Serial.print(t0); Serial.print(" `C, t0out = "); Serial.println(t0out);
Serial.print("t1 = "); Serial.print(t1); Serial.print(" `C, t1out = "); Serial.println(t1out);
Serial.print("h0 = "); Serial.print(h0); Serial.print(" \%RH, h0out = "); Serial.println(h0out);
Serial.print("h1 = "); Serial.print(h1); Serial.print(" \%RH, h1out = "); Serial.println(h1out);
Serial.println("------------------------");
} void loop()
{
//perform a measurement
Wire.beginTransmission(ADDRESS_HTS221);
Wire.write(CTRL_REG2);
Wire.write(0x01);
Wire.endTransmission(); //check the status
status = ;
while (status != 0x03) //typical conversition time: 3ms
{
delayMicroseconds();
Wire.beginTransmission(ADDRESS_HTS221);
Wire.write(STATUS_REG);
Wire.endTransmission(); Wire.requestFrom(ADDRESS_HTS221, );
if(Wire.available() >= )
{
status = Wire.read();
}
delayMicroseconds();
// Serial.println(status, HEX);
} //read multiple bytes incrementing the register address
Wire.beginTransmission(ADDRESS_HTS221);
Wire.write(HUMIDITY_OUT_L_REG | 0x80);
Wire.endTransmission(); Wire.requestFrom(ADDRESS_HTS221, );
if (Wire.available() >= )
{
for (byte i = ; i < ; i++)
{
buffer[i] = Wire.read();
}
} outHumi = (buffer[] << ) | buffer[];
outTemp = (buffer[] << ) | buffer[]; valueTemp = mapFloat(outTemp, t0out, t1out, t0, t1);
valueHumi = mapFloat(outHumi, h0out, h1out, h0, h1);
Serial.print(valueTemp); Serial.print(" `C, ");
Serial.print(valueHumi); Serial.println(" \%RH"); delay();
} void ReadCaliData()
{
//read out t0degCx8, t1degCx8
Wire.beginTransmission(ADDRESS_HTS221);
Wire.write(T0_degC_x8 | 0x80);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_HTS221, );
if (Wire.available() >= )
{
for (byte i = ; i < ; i++)
{
buffer[i] = Wire.read();
}
}
word t0degCx8 = ((buffer[] & 0b00000011) << ) | buffer[];
word t1degCx8 = ((buffer[] & 0b00001100) << ) | buffer[];
t0 = t0degCx8/8.0;
t1 = t1degCx8/8.0; //read out t0out, t1out
Wire.beginTransmission(ADDRESS_HTS221);
Wire.write(T0_OUT | 0x80);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_HTS221, );
if (Wire.available() >= )
{
for (byte i = ; i < ; i++)
{
buffer[i] = Wire.read();
}
}
t0out = (buffer[] << ) | buffer[];
t1out = (buffer[] << ) | buffer[]; //read out h0RHx2, h1RHx2
Wire.beginTransmission(ADDRESS_HTS221);
Wire.write(H0_rH_x2 | 0x80);
Wire.endTransmission(); Wire.requestFrom(ADDRESS_HTS221, );
if (Wire.available() >= )
{
for (byte i = ; i < ; i++)
{
buffer[i] = Wire.read();
}
}
byte h0RHx2 = buffer[];
byte h1RHx2 = buffer[];
h0 = h0RHx2/2.0;
h1 = h1RHx2/2.0; //read out h0t0Out
Wire.beginTransmission(ADDRESS_HTS221);
Wire.write(H0_T0_OUT | 0x80);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_HTS221, );
if (Wire.available() >= )
{
for (byte i = ; i < ; i++)
{
buffer[i] = Wire.read();
}
}
h0out = (buffer[] << ) | buffer[]; //read out h1t0Out
Wire.beginTransmission(ADDRESS_HTS221);
Wire.write(H1_T0_OUT | 0x80);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_HTS221, );
if (Wire.available() >= )
{
for (byte i = ; i < ; i++)
{
buffer[i] = Wire.read();
}
}
h1out = (buffer[] << ) | buffer[];
} float mapFloat(int x, int in_min, int in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

首先打印HTS221保存的校准信息,之后会每隔4秒触发一次测量并打印结果:

结论

与Si7021比,HTS221(under evaluation)的体积更小、接口更丰富,使用更灵活,但在硬件接口和软件操作上都略显复杂。精度上,datasheet也并未给出已验证的典型误差和最大误差,实测湿度误差较大。

参考资料

HTS221 Capacitive digital sensor for relative humidity and temperature

Arduino I2C + 温湿度传感器HTS221的更多相关文章

  1. Arduino I2C + 温湿度传感器Si7021

      Si7021是Silicon Labs生产的温湿度传感器芯片.其主要特性: 湿度精度:误差典型值+/-2%RH,最大值+/-3%RH(0~80%RH),出厂已校正 温度精度:误差典型值+/-0.3 ...

  2. Arduino I2C + 温湿度传感器AM2321

    (2015.5.17:本日志的内容有所更新,参见<使用Arduino Wire Library读取温湿度传感器AM2321>.) AM2321是广州奥松电子生产的数字式温湿度传感器.虽是国 ...

  3. 使用Arduino Wire Library读取温湿度传感器AM2321

    AM2321是采用I2C总线或单总线通讯的国产温湿度传感器.在AM2321手册中,当采用I2C通讯时,手册指定了多处需要主机等待的时间间隔,包括: (1)唤醒传感器时,从机不回复ACK,但主机主要等待 ...

  4. Arduino和C51开发DHT11温湿度传感器

    技术:51单片机.Arduino.DHT11.温湿度传感器.传感器   概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...

  5. Arduino连接SHT10温湿度传感器--返回值不正常解决办法

    如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Ar ...

  6. 基于I2C的AHT20温湿度传感器的数据采集

    关于:IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.它是由数据线SDA和时钟SCL构成的串行总线,可 ...

  7. DH11数字温湿度传感器

    DH11数字温湿度传感器是一种集温度.湿度一体的复合传感器,它能把温度和湿度物理量通过温.湿度敏感元件和相应电路转化成方便计算机.PLC.智能仪表等数据采集设备直接读取的数字量.DHT11由电阻式感湿 ...

  8. STM32应用实例五:与SHT1X温湿度传感器通讯

    在这次项目开发中应用到了SHT1X温湿度传感器,该系列有SHT10.SHT11和SHT15,属于Sersirion温湿度传感器家族中的贴片封装系列.包括一个电容性聚合体测湿敏感元件.一个用能隙材料制成 ...

  9. 进阶之路(中级篇) - 016 温湿度传感器DHT11

    如果想使用 Arduino 开发板驱动 DHT11 来获取温湿度的时候建议使用第三方的库,这样可以加快程序的开发速度,而且不容易出错,下面的代码我已经安转了第三方的库了.详细的安装方法请参考极客先锋的 ...

随机推荐

  1. 七牛云存储的 Javascript Web 前端文件上传

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,七牛云存储的 Web 前端文件上传 七牛是不错的云存储产品,特别是有免费的配额可 ...

  2. TortoiseSVN/Git覆盖图标失效的解决方案

    之前在电脑上安装了TortoiseGit和TortoiseSVN这两种版本控制,使用一段时间之后发现,这两种版本控制的覆盖图标都无法显示,起初以为是git和svn使用的图标的不一样,有冲突,导致这两种 ...

  3. flutter container image FittedBox AspectRatio

    当container指定了大小时,里面放入图片后,图片是居中自适应的,根据图片的大小,垂直居中或者水平居中.因为Image的默认自适应就是Contain, BoxFit.Contain 如果conta ...

  4. IE11 - Object doesn't support property or method 'includes'

    IE不支持字符串的includes()方法:可以用indexOf()替换: includes()方法返回true和false; var str = "asdklmn": if(st ...

  5. bash's [ command & [[ keyword

    [bash's [ command & [[ keyword] [ (test) command: bash中的条件测试語句, [ condition ], 并不是一个語句, 而是一个命令, ...

  6. 开发 WebAPP 的几个前端框架(不断更新中)

    http://mobileangularui.com/ http://ionicframework.com/ http://www.idangero.us/framework7/ (中文文档:http ...

  7. 高性能Web服务器Nginx的配置与部署研究(12)应用模块之Memcached做文件缓存时压缩引起的问题

    在上一篇文章中,提到的Nginx的Memcached模块应用场景,主要是作为文件缓存.然后就发现了一个问题,当以字节数组方式缓存较大的文件时,缓存数据会被压缩,从而在读取的时候出现问题. (本文欢迎转 ...

  8. Hibernate一对多操作

    --------------------siwuxie095 Hibernate 一对多操作 以客户和联系人为例,客户是一,联系人是多 即 一个客户里面有多个联系人,一个联系人只能属于一个客户 注意: ...

  9. Node.js简介(转)

    目前,Node.js是在前端页面开发中十分受欢迎的,它是一套用来编写高性能网络服务器的JavaScript工具包,在本文中,将带领各位初学者介绍Node JS的基本知识,要求本文的阅读对象为有一定Ja ...

  10. 最长的相同节点值路径 · Longest Univalue Path

    [抄题]: Given a binary tree, find the length of the longest path where each node in the path has the s ...