Arduino I2C + 温湿度传感器Si7021

 

Si7021是Silicon Labs生产的温湿度传感器芯片。其主要特性:

  • 湿度精度:误差典型值+/-2%RH,最大值+/-3%RH(0~80%RH),出厂已校正
  • 温度精度:误差典型值+/-0.3%°C,最大值+/-0.4%°C(-10°C~85°C),出厂已校正
  • 测量范围:温度范围0~100%RH;温度范围最大-40°C~125°C
  • 工作电压:1.9~3.6V
  • 低功耗:工作时150μA,待机时60nA
  • 接口:I2C,最大速率支持400kbps
  • 长期稳定性:湿度≤0.25%RH/yr,温度≤0.01°C/yr
  • 封装:3x3 mm DFN
  • 片上集成加热器(heater)
  • 可选的疏水性保护盖

与Arduino的连接

由于Arduino UNO的工作电压是5V,而Si7021无法在5V电平下工作,二者的连接需要电平转换。转换的方法是在Si7021和Arduino中间通过I2C Logic Level Converter进行连接。双向逻辑电平转换器的原理可参考Philips Semiconductor的应用笔记“Bi-directional level shifter for i2c bus and other systems”。转换器两端都自带了I2C总线需要的上拉电阻。

功能调试

1. Si7021测量过程中,可以选择让其将SCL拉低(Hold Master Mode),或者不回应MCU发来的讯息(No Hold Master Mode)。

2. 相对湿度测量包含了温度测量;温度测量可以单独进行。

3. 进行相对湿度或温度测量时,MCU对测量值低字节是否发送ACK,决定了Si7021是否返回CRC校验码。当读取上次相对湿度测量时的温度值时,Si7021不回复CRC校验码。以下代码中有一半内容是CRC校验相关的,并不是必须的,CRC算法也未进行优化。

4. 当Si7021用于环境测量时,芯片放置、PCB热阻隔设计对测量精度、响应时间有很大影响,具体可参见官方“Si70xx Humidity Sensor Designer‘s Guide”文档。

测试代码

  1 /*
  2 Measurement of relative humidity and temperature using Si7021
  3 */
  4
  5 #include <Wire.h>
  6
  7 #define ADDRESS_SI7021 0x40
  8 #define MEASURE_RH_HOLD 0xE5
  9 #define READ_T_FROM_PRE_RH_MEASUREMENT 0xE0
 10
 11 byte buffer[] = {0, 0, 0};
 12 byte crcHumi;
 13
 14 word outHumi = 0;
 15 word outTemp = 0;
 16 float valueHumi = 0;
 17 float valueTemp = 0;
 18
 19 void setup()
 20 {
 21     Wire.begin();
 22     Serial.begin(115200);
 23 }
 24
 25 void loop()
 26 {
 27     //perform a RH measurement and read back the RH value
 28     Wire.beginTransmission(ADDRESS_SI7021);
 29     Wire.write(MEASURE_RH_HOLD);
 30     Wire.endTransmission();
 31
 32     Wire.requestFrom(ADDRESS_SI7021, 3);
 33     if(Wire.available() >= 3)
 34     {
 35         buffer[0] = Wire.read(); //high byte
 36         buffer[1] = Wire.read(); //low byte
 37         buffer[2] = Wire.read(); //crc
 38     }
 39     outHumi = (buffer[0]<<8) | buffer[1];
 40     crcHumi = CRC8(buffer, 3);
 41
 42     //read temperature from previous RH measurement
 43     Wire.beginTransmission(ADDRESS_SI7021);
 44     Wire.write(READ_T_FROM_PRE_RH_MEASUREMENT);
 45     Wire.endTransmission();
 46
 47     Wire.requestFrom(ADDRESS_SI7021, 2);
 48     if(Wire.available() >= 2)
 49     {
 50         buffer[0] = Wire.read(); //high byte
 51         buffer[1] = Wire.read(); //low byte; no crc
 52     }
 53     outTemp = (buffer[0]<<8) | buffer[1];
 54
 55     valueHumi = 125.0*outHumi/65536 - 6;
 56     valueTemp = 175.72*outTemp/65536 - 46.85;
 57
 58     Serial.print(valueHumi);    Serial.print(" \%RH\t");
 59     Serial.print(valueTemp);    Serial.println(" `C");
 60
 61     if (crcHumi == 0)
 62     {
 63         Serial.println("CRC checked.");
 64     }
 65     else
 66     {
 67         Serial.println("CRC Error!");
 68     }
 69
 70     delay(4000);
 71 }
 72
 73 byte CRC8(byte *data, byte len)
 74 {
 75     byte crc[8];
 76     byte result = 0;
 77     byte i;
 78     byte doInvert;
 79     String bitString = MakeString(data, len);
 80
 81     for (i = 0; i < 8; i++)
 82     {
 83         crc[i] = 0;
 84     }
 85
 86     for (i = 0; i < bitString.length(); i ++)
 87     {
 88         doInvert = (byte(bitString[i] == ‘1‘)) ^ crc[7];
 89         crc[7] = crc[6];
 90         crc[6] = crc[5];
 91         crc[5] = crc[4] ^ doInvert;
 92         crc[4] = crc[3] ^ doInvert;
 93         crc[3] = crc[2];
 94         crc[2] = crc[1];
 95         crc[1] = crc[0];
 96         crc[0] = doInvert;
 97     }
 98
 99     for (i = 0; i < 8; i++)
100     {
101         bitWrite(result, i, crc[i]);
102     }
103
104     return result;
105 }
106
107 String MakeString(byte *data, byte len)
108 {
109     int i, j;
110     String tempString[len];
111     String bitString="";
112
113     for (i = 0; i < len; i++)
114     {
115         tempString[i] = String(data[i], BIN);
116         int zeros = 8 - tempString[i].length();
117         for (j = 0; j < zeros; j++)
118         {
119             tempString[i] = ‘0‘ + tempString[i];
120         }
121     }
122
123     for (i = 0; i < len; i++)
124     {
125         bitString = bitString + tempString[i];
126     }
127
128     return bitString;
129 }

若连接正常,Si7021将会每隔4秒触发一次测量,并通过串口打印结果:

参考资料

Silicon Labs - Si7021 Datasheet
Application Note: Bi-directional level shifter for i2c bus and other systemsApplication Note: Si70xx Humidity Sensor Designer‘s Guide
Online CRC Calculation

时间: 2024-11-08 19:13:32

Arduino I2C + 温湿度传感器Si7021的相关文章

Arduino I2C + 温湿度传感器HTS221

主要特性 HTS221是意法半导体(STMicroelectronics)生产的小体积.数字式温湿度传感器IC.该IC目前在官网仍处在“评估”状态.其主要特性: 工作电压:1.7~3.6V 数据输出频率(ODR)可设:1Hz ~ 12.5Hz 低功耗:2μ[email protected] ODR 温度精度:给出误差典型值+/-0.5°C, 15~40°C:但注明“Typical specifications are not guaranteed.”.无误差最大值信息. 湿度精度:给出误差典型值

Arduino调试温湿度传感器AM2321

AM2321是广州奥松电子生产的数字式温湿度传感器.虽是国产品牌,其精度也可以与国外的主流温湿度传感IC媲美. 尺寸:11.3x7.8x4mm(长x宽x高) 封装:0.05 pitch PTH 工作电压:2.6~5V 接口:I2C,最大速率100kbps,有特殊时序要求 分辨率:温度0.1°C,相对湿度0.1%RH 精度:室温时温度误差+/-0.3°C,相对湿度误差+/-3%RH 重复性:温度+/-0.2°C,相对湿度+/-0.1%RH 美中不足:与国外同精度产品相比,AM2321的重复性和漂移

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

AM2321是采用I2C总线或单总线通讯的国产温湿度传感器.在AM2321手册中,当采用I2C通讯时,手册指定了多处需要主机等待的时间间隔,包括: (1)唤醒传感器时,从机不回复ACK,但主机主要等待800us~3ms再发送STOP信号: (2)主机发送读/写指令后,需等待至少1.5ms再发送读取时序: (3)读返回数据时,主机发送I2C地址后,需等待至少30us以上才能发送下一个串行时钟. 由于Arduino标准库Wire中的函数不支持指定(1)和(3)中的等待间隔,因此在之前的日志中,采用关

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

如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Arduino,到此就算是到库成功了.下面看电路连接图: 注意DATA和SCK两个脚对于Arduino上的数字引脚,在写程序的时候要用到,如图所示:将 SHT15 的 Data 脚接到 pin11, SCK 接到 pin10 电路图片: 导入库的路径: 其实库里面提供了一个实例代码,你可以直接拿过来使用

Arduino 温湿度传感器DHT11模块实验

网上有很多DHT11的测试,试了N个程序,总是不得要领,各种报错,最后终于找到一套可用的库. 首先是DHT11.h文件 #ifndef __DHT11_H__ #define __DHT11_H__ #include <Arduino.h> //DHT11 IO设置 #define DHT11_DQ 2 #define DHT11_DQ_0 digitalWrite(DHT11_DQ,LOW) #define DHT11_DQ_1 digitalWrite(DHT11_DQ,HIGH) //函

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

技术:51单片机.Arduino.DHT11.温湿度传感器.传感器 概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产品的思维有很大的帮助 详细 代码下载:http://www.demodashi.com/demo/14729.html 一.DHT11温度传感器 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳

AM2320 温湿度传感器 C51程序 uart串口输出温湿度

实物图 引脚图 接线图 效果图 源代码 //****************************************************************// //AM系列温湿度传感器,读IIC使用示例  //单片机 :AT89S52 或 STC89C52RC  //功能  :串口发送温湿度数据  波特率 9600  //晶振  :12M (用户系统时钟如不是12M 请更改相关宏定义及注释的延时时间) //波特率:9600 //编译环境:  Keil 4 //*********

温湿度传感器DHT11

如果想使用 Arduino 开发板驱动 DHT11 来获取温湿度的时候建议使用第三方的库,这样可以加快程序的开发速度,而且不容易出错,下面的代码我已经安转了第三方的库了.详细的安装方法请参考极客先锋的博客:http://www.cnblogs.com/jikexianfeng/p/6290203.html 作者安装的为最低版本(1.0.0).这样为了更好的兼容. 1 /********************************* 2 代码功能:温湿度传感器DHT11 3 使用函数: 4 s

DH11数字温湿度传感器

DH11数字温湿度传感器是一种集温度.湿度一体的复合传感器,它能把温度和湿度物理量通过温.湿度敏感元件和相应电路转化成方便计算机.PLC.智能仪表等数据采集设备直接读取的数字量.DHT11由电阻式感湿器件和NTC系数感温器件构成,具有校准数字信号输出功能,采用单总线串行接口,输出数据一共5个字节,分别表示:湿度整数位.湿度小数位,温度整数位.温度小数位及校验和,其中检验和为湿度与温度之和的最低八位数据. arduino引脚 模块引脚 D2 S 5V VCC GND GND 1 double Fa