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”文档。
测试代码
/*
Measurement of relative humidity and temperature using Si7021
*/ #include <Wire.h> #define ADDRESS_SI7021 0x40
#define MEASURE_RH_HOLD 0xE5
#define READ_T_FROM_PRE_RH_MEASUREMENT 0xE0 byte buffer[] = {, , };
byte crcHumi; word outHumi = ;
word outTemp = ;
float valueHumi = ;
float valueTemp = ; void setup()
{
Wire.begin();
Serial.begin();
} void loop()
{
//perform a RH measurement and read back the RH value
Wire.beginTransmission(ADDRESS_SI7021);
Wire.write(MEASURE_RH_HOLD);
Wire.endTransmission(); Wire.requestFrom(ADDRESS_SI7021, );
if(Wire.available() >= )
{
buffer[] = Wire.read(); //high byte
buffer[] = Wire.read(); //low byte
buffer[] = Wire.read(); //crc
}
outHumi = (buffer[]<<) | buffer[];
crcHumi = CRC8(buffer, ); //read temperature from previous RH measurement
Wire.beginTransmission(ADDRESS_SI7021);
Wire.write(READ_T_FROM_PRE_RH_MEASUREMENT);
Wire.endTransmission(); Wire.requestFrom(ADDRESS_SI7021, );
if(Wire.available() >= )
{
buffer[] = Wire.read(); //high byte
buffer[] = Wire.read(); //low byte; no crc
}
outTemp = (buffer[]<<) | buffer[]; valueHumi = 125.0*outHumi/ - ;
valueTemp = 175.72*outTemp/ - 46.85; Serial.print(valueHumi); Serial.print(" \%RH\t");
Serial.print(valueTemp); Serial.println(" `C"); if (crcHumi == && outHumi != && outTemp != )
{
Serial.println("CRC checked.");
}
else
{
Serial.println("Error!");
} delay();
} byte CRC8(byte *data, byte len)
{
byte crc[];
byte result = ;
byte i;
byte doInvert;
String bitString = MakeString(data, len); for (i = ; i < ; i++)
{
crc[i] = ;
} for (i = ; i < bitString.length(); i ++)
{
doInvert = (byte(bitString[i] == '')) ^ crc[];
crc[] = crc[];
crc[] = crc[];
crc[] = crc[] ^ doInvert;
crc[] = crc[] ^ doInvert;
crc[] = crc[];
crc[] = crc[];
crc[] = crc[];
crc[] = doInvert;
} for (i = ; i < ; i++)
{
bitWrite(result, i, crc[i]);
} return result;
} String MakeString(byte *data, byte len)
{
int i, j;
String tempString[len];
String bitString=""; for (i = ; i < len; i++)
{
tempString[i] = String(data[i], BIN);
int zeros = - tempString[i].length();
for (j = ; j < zeros; j++)
{
tempString[i] = '' + tempString[i];
}
} for (i = ; i < len; i++)
{
bitString = bitString + tempString[i];
} return bitString;
}
若连接正常,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
Arduino I2C + 温湿度传感器Si7021的更多相关文章
- Arduino I2C + 温湿度传感器HTS221
主要特性 HTS221是意法半导体(STMicroelectronics)生产的小体积.数字式温湿度传感器IC.该IC目前在官网仍处在“评估”状态.其主要特性: 工作电压:1.7~3.6V 数据输出频 ...
- Arduino I2C + 温湿度传感器AM2321
(2015.5.17:本日志的内容有所更新,参见<使用Arduino Wire Library读取温湿度传感器AM2321>.) AM2321是广州奥松电子生产的数字式温湿度传感器.虽是国 ...
- 使用Arduino Wire Library读取温湿度传感器AM2321
AM2321是采用I2C总线或单总线通讯的国产温湿度传感器.在AM2321手册中,当采用I2C通讯时,手册指定了多处需要主机等待的时间间隔,包括: (1)唤醒传感器时,从机不回复ACK,但主机主要等待 ...
- Arduino和C51开发DHT11温湿度传感器
技术:51单片机.Arduino.DHT11.温湿度传感器.传感器 概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...
- Arduino连接SHT10温湿度传感器--返回值不正常解决办法
如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Ar ...
- 基于I2C的AHT20温湿度传感器的数据采集
关于:IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.它是由数据线SDA和时钟SCL构成的串行总线,可 ...
- DH11数字温湿度传感器
DH11数字温湿度传感器是一种集温度.湿度一体的复合传感器,它能把温度和湿度物理量通过温.湿度敏感元件和相应电路转化成方便计算机.PLC.智能仪表等数据采集设备直接读取的数字量.DHT11由电阻式感湿 ...
- STM32应用实例五:与SHT1X温湿度传感器通讯
在这次项目开发中应用到了SHT1X温湿度传感器,该系列有SHT10.SHT11和SHT15,属于Sersirion温湿度传感器家族中的贴片封装系列.包括一个电容性聚合体测湿敏感元件.一个用能隙材料制成 ...
- 进阶之路(中级篇) - 016 温湿度传感器DHT11
如果想使用 Arduino 开发板驱动 DHT11 来获取温湿度的时候建议使用第三方的库,这样可以加快程序的开发速度,而且不容易出错,下面的代码我已经安转了第三方的库了.详细的安装方法请参考极客先锋的 ...
随机推荐
- ubuntu 开机 输入密码 无法进入
1.给笔记本装了ubuntu14.04.4, 发现开机到输入密码的环节之后,验证正确,然而无法进入桌面,一直在密码页循环. 2.网上找了好多方法,进入命令行(ctrl+alr+F1)登录,能登录进去: ...
- Spring源码研究--下载-编译-导入eclipse-验证
一,环境配置 操作系统:Unbutu14.04LTS JDK: 1.8.0_40 git: 1.9.1 gradle: 2.2.1 二,源码下载-编译-导入eclipse-验证 1,下载 使用git直 ...
- C#:Json数据反序列化为Dictionary并根据关键字获取指定的值
转自曾是土木人原文 C#:Json数据反序列化为Dictionary并根据关键字获取指定的值 Json数据: { "dataSet": { "header": ...
- c#中如何获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存
我们在利用C#开发桌面程序(Winform)程序的时候, 经常需要获取一些跟系统相关的信息, 以下这些代码获取能有些用处. c#中如何获取本机用户名.MAC地址.IP地址.硬盘ID.CPU序列号.系统 ...
- 基于 DirectX11 的 MMDViewer 01-简介
这个项目主要是为了 DirectX11 而来,前面做了一个关于 OpenGL 的项目,这次打算使用 DirectX11 来做一个 MMD 的模型浏览器.以前,我使用过 DirectX11 来做过一些项 ...
- LightGBM
1.简介 lightGBM包含两个关键点:light即轻量级,GBM 梯度提升机 LightGBM 是一个梯度 boosting 框架,使用基于学习算法的决策树.它可以说是分布式的,高效的,有以下优势 ...
- MySQL数据库篇之多表查询
主要内容: 一.多表连接查询 二.复合条件连接查询 三.子查询 1️⃣ 多表连接查询 一.准备表 #建表 create table department( id int, name varchar( ...
- Sunday
字符串匹配中最简单的算法: 基本思路:wandderwonder wonder 建立256个长的next数组,记录每个字符最后一次出现的位置. 设mark1 = 0: 和 mark2 = 0:flag ...
- Linux实战教学笔记26:http协议原理
目录 第二十六节 http协议原理 第1章 Web服务基础 1.1 http服务重要基础 1.2 HTTP协议 1.3 HTTP资源 1.4 网站流量度量术语 1.5 www服务软件介绍 1.6 本章 ...
- 混合开发之iOS快速集成DSBridge
DSBridge-IOS github:https://github.com/wendux/DSBridge-IOS 使用 Native 实现API 代理类 //JsApiTest.m @implem ...