您是否想过要记录室内的温度、搭建雪茄盒控制系统或跟踪气象站项目的温度和湿度数据? SHT31温湿度传感器可能是您正确的选择!
SHT31传感器经过工厂校准,无需外部元件即可工作。因此,只需几个连接和一些Arduino代码,您就可以立即开始测量相对湿度和温度。
模块硬件概述 该模块集成一颗Sensirion公司的低成本、易于使用、高精度的数字温度和湿度传感器 – SHT31。
该模块体积小,几乎可以用于任何设备,例如恒温器、恒湿器、室内气象站和类似设备,用于监测或控制湿度和/或温度。
SHT31传感器能够读取0至100%RH整个范围内的湿度,在20%至80% RH范围内的典型精度为±2%(0.01% RH分辨率)。
SHT31的最大温度范围为-40 至 125°C。 它在25°C时的典型精度为±0.3°C(分辨率为 0.015°C)。
电源 传感器本身使用2.4V至5.5V,这使得该模块符合3V或5V标准。 因此,您可以放心地将它与您最喜欢的3.3V或5V微控制器一起使用。
SHT31在测量期间消耗小于0.8mA,在单次模式(非测量)期间消耗小于0.2µA。 这种低功耗允许在手机、可穿戴设备或智能手表等电池驱动设备中实施。
I2C接口 SHT31是一个I2C传感器,这意味着它使用大多数微控制器上可用的两条I2C数据/时钟线,并且可以与其他I2C传感器共享这些引脚,只要它们没有地址冲突。
它支持两个独立的I2C地址:0x44H和0x45H。这允许两个SHT31模块在同一总线上使用或避免与总线上的另一个设备发生地址冲突。
AD引脚决定模块的I2C地址。该引脚内置下拉电阻。 因此,当您不连接AD引脚时,默认I2C地址为0x44H,而当您将其连接到高压信号时,I2C地址变为0x45H。
警报模式 SHT31具有警报 (AL) 输出引脚,可在环境条件(湿度和/或温度)超过用户定义的极限值时触发。 这使得测量能够由中断驱动而不是使用轮询,从而允许主机微控制器在传感器收集数据的同时执行其他任务。
当湿度和/或温度超过上限时,Alert引脚变为高电平并保持高电平,直到温度降至消除限值以下。 同样,当湿度和/或温度超过下限时,警报引脚变为高电平并保持高电平,直到温度升至消除限值以上。
下图显示了警报模式的不同极限值。
SHT31模块的引脚排列 现在让我们看一下引出排列。
VCC 是电源引脚。 由于传感器使用2.4-5.5V,因此给它提供与微控制器逻辑电平相同的电源。 GND 是电源和逻辑的公共地。 SCL 是I2C时钟引脚,连接到你的单片机I2C时钟线。 SDA 是I2C数据引脚,连接到你的单片机I2C数据线。 AD 引脚决定了模块的I2C地址。 AL 引脚当环境条件(湿度和/或温度)超过用户定义的限制时触发。
将SHT31模块连接到Arduino开发板 连接SHT31传感器非常简单!只需连接四个引脚即可开始使用传感器。 一根用于VCC,一根用于GND,两根数据线用于I2C通信。
将SCL引脚连接到I2C时钟引脚,将SDA引脚连接到Arduino上的I2C数据引脚。在Arduino UNO R3开发板上,SDA(数据线)和 SCL(时钟线)位于靠近AREF引脚的排针上。 它们也被称为 A5 (SCL) 和 A4 (SDA)。
安装所需的库 要启动并运行传感器,您需要安装Adafruit SHT31库。 它可以从Arduino库管理器获得。
要安装库,请导航至 Sketch > Include Library > Manage Libraries…等待库管理器下载库索引并更新已安装库的列表。
输入SHT31筛选搜索结果并安装库。
Adafruit_SHT31库在内部使用Adafruit Bus IO库来抽象出I2C和SPI事务和寄存器。 因此,在库管理器中搜索 adafruit bus 并安装它。
Arduino代码 - 读取温度和湿度 下面是一个基本的Arduino草图。 继续并将其上传到您的Arduino。 您会看到房间的当前温度和湿度! - #include <Arduino.h>
- #include <Wire.h>
- #include "Adafruit_SHT31.h"
- Adafruit_SHT31 sht31 = Adafruit_SHT31();
- void setup() {
- Serial.begin(9600);
- if (! sht31.begin(0x44)) { // Set to 0x45 for alternate I2C address
- Serial.println("Couldn't find SHT31");
- while (1) delay(1);
- }
- }
- void loop() {
- float t = sht31.readTemperature();
- float h = sht31.readHumidity();
- if (! isnan(t)) { // check if 'is not a number'
- Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
- } else {
- Serial.println("Failed to read temperature");
- }
-
- if (! isnan(h)) { // check if 'is not a number'
- Serial.print("Hum. % = "); Serial.println(h);
- } else {
- Serial.println("Failed to read humidity");
- }
- delay(1000);
- }
复制代码
上传代码后,以9600bps打开串口监视器。 您应该会看到类似下面的输出。 尝试在传感器上呼吸查看湿度和温度值的变化!
代码说明 代码非常简单。 首先包含了Arduino.h、Wire.h和Adafruit_SHT31.h库,并在全局空间中创建了一个Adafruit_SHT31对象。 - #include <Arduino.h>
- #include <Wire.h>
- #include "Adafruit_SHT31.h"
- Adafruit_SHT31 sht31 = Adafruit_SHT31();
复制代码
在setup()函数中,我们初始化串口通信并调用 begin() 函数。
begin(<address>) 函数初始化传感器,其中 <address> 是传感器的I2C地址。 默认为0x44H,您也可以将传感器调整为0x45H,然后将该值传入。如果找到传感器并正确响应,则此函数返回True,如果未找到,则返回False。 - void setup() {
- Serial.begin(9600);
- if (! sht31.begin(0x44)) { // Set to 0x45 for alternate I2C address
- Serial.println("Couldn't find SHT31");
- while (1) delay(1);
- }
- }
复制代码
初始化后,您可以使用点运算符访问对象的 (sht31) 方法。 sht31.readTemperature() 返回以°C为单位的浮点温度读数。 您可以通过乘以1.8并加32来转换为华氏度。 sht31.readHumidity() 返回湿度读数,也是一个介于0和100之间的浮点值(读取湿度百分比) - void loop() {
- float t = sht31.readTemperature();
- float h = sht31.readHumidity();
- if (! isnan(t)) { // check if 'is not a number'
- Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
- } else {
- Serial.println("Failed to read temperature");
- }
-
- if (! isnan(h)) { // check if 'is not a number'
- Serial.print("Hum. % = "); Serial.println(h);
- } else {
- Serial.println("Failed to read humidity");
- }
- delay(1000);
- }
复制代码
|