风筝
发表于: 2023-2-24 11:37:04 | 显示全部楼层

您是否想过要记录室内的温度、搭建雪茄盒控制系统或跟踪气象站项目的温度和湿度数据? SHT31温湿度传感器可能是您正确的选择!


SHT31传感器经过工厂校准,无需外部元件即可工作。因此,只需几个连接和一些Arduino代码,您就可以立即开始测量相对湿度和温度。


模块硬件概述

该模块集成一颗Sensirion公司的低成本、易于使用、高精度的数字温度和湿度传感器 – SHT31

SHT31-Module-Hardware-Overview-Chip.jpg


该模块体积小,几乎可以用于任何设备,例如恒温器、恒湿器、室内气象站和类似设备,用于监测或控制湿度和/或温度。


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模块在同一总线上使用或避免与总线上的另一个设备发生地址冲突。

SHT31-Module-I2C-Address-Selection-Pin.jpg


AD引脚决定模块的I2C地址。该引脚内置下拉电阻。 因此,当您不连接AD引脚时,默认I2C地址为0x44H,而当您将其连接到高压信号时,I2C地址变为0x45H。


警报模式

SHT31具有警报 (AL) 输出引脚,可在环境条件(湿度和/或温度)超过用户定义的极限值时触发。 这使得测量能够由中断驱动而不是使用轮询,从而允许主机微控制器在传感器收集数据的同时执行其他任务。

SHT31-Module-Alert-Output-Pin.jpg


当湿度和/或温度超过上限时,Alert引脚变为高电平并保持高电平,直到温度降至消除限值以下。 同样,当湿度和/或温度超过下限时,警报引脚变为高电平并保持高电平,直到温度升至消除限值以上。


下图显示了警报模式的不同极限值。

Different-Limits-for-the-SHT31-Alert-Mode.png


SHT31模块的引脚排列

现在让我们看一下引出排列。

SHT31-Module-Pinout.png


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)。

Wiring-Connecting-SHT31-Module-with-Arduino.png


安装所需的库

要启动并运行传感器,您需要安装Adafruit SHT31库。 它可以从Arduino库管理器获得。


要安装库,请导航至 Sketch > Include Library > Manage Libraries…等待库管理器下载库索引并更新已安装库的列表。

Manage-Libraries.png


输入SHT31筛选搜索结果并安装库。

Adafruit-SHT31-Library-Installation.png


Adafruit_SHT31库在内部使用Adafruit Bus IO库来抽象出I2C和SPI事务和寄存器。 因此,在库管理器中搜索 adafruit bus 并安装它。

Adafruit-BusIO-Library-Installation.png


Arduino代码 - 读取温度和湿度

下面是一个基本的Arduino草图。 继续并将其上传到您的Arduino。 您会看到房间的当前温度和湿度!

  1. #include <Arduino.h>
  2. #include <Wire.h>
  3. #include "Adafruit_SHT31.h"

  4. Adafruit_SHT31 sht31 = Adafruit_SHT31();

  5. void setup() {
  6.   Serial.begin(9600);

  7.   if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate I2C address
  8.     Serial.println("Couldn't find SHT31");
  9.     while (1) delay(1);
  10.   }
  11. }

  12. void loop() {
  13.   float t = sht31.readTemperature();
  14.   float h = sht31.readHumidity();

  15.   if (! isnan(t)) {  // check if 'is not a number'
  16.     Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
  17.   } else {
  18.     Serial.println("Failed to read temperature");
  19.   }
  20.   
  21.   if (! isnan(h)) {  // check if 'is not a number'
  22.     Serial.print("Hum. % = "); Serial.println(h);
  23.   } else {
  24.     Serial.println("Failed to read humidity");
  25.   }

  26.   delay(1000);
  27. }
复制代码

上传代码后,以9600bps打开串口监视器。 您应该会看到类似下面的输出。 尝试在传感器上呼吸查看湿度和温度值的变化!

SHT31-Sensor-Arduino-Output.png


代码说明

代码非常简单。 首先包含了Arduino.h、Wire.h和Adafruit_SHT31.h库,并在全局空间中创建了一个Adafruit_SHT31对象。

  1. #include <Arduino.h>
  2. #include <Wire.h>
  3. #include "Adafruit_SHT31.h"

  4. Adafruit_SHT31 sht31 = Adafruit_SHT31();
复制代码

setup()函数中,我们初始化串口通信并调用 begin() 函数。


begin(<address>) 函数初始化传感器,其中 <address> 是传感器的I2C地址。 默认为0x44H,您也可以将传感器调整为0x45H,然后将该值传入。如果找到传感器并正确响应,则此函数返回True,如果未找到,则返回False。

  1. void setup() {
  2.   Serial.begin(9600);

  3.   if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate I2C address
  4.     Serial.println("Couldn't find SHT31");
  5.     while (1) delay(1);
  6.   }
  7. }
复制代码

初始化后,您可以使用点运算符访问对象的 (sht31) 方法。

sht31.readTemperature() 返回以°C为单位的浮点温度读数。 您可以通过乘以1.8并加32来转换为华氏度。

sht31.readHumidity() 返回湿度读数,也是一个介于0和100之间的浮点值(读取湿度百分比)

  1. void loop() {
  2.   float t = sht31.readTemperature();
  3.   float h = sht31.readHumidity();

  4.   if (! isnan(t)) {  // check if 'is not a number'
  5.     Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
  6.   } else {
  7.     Serial.println("Failed to read temperature");
  8.   }
  9.   
  10.   if (! isnan(h)) {  // check if 'is not a number'
  11.     Serial.print("Hum. % = "); Serial.println(h);
  12.   } else {
  13.     Serial.println("Failed to read humidity");
  14.   }

  15.   delay(1000);
  16. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1479



手机版|

GMT+8, 2024-3-29 23:11 , Processed in 0.117521 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表