最近更新于 2023-08-26 16:24

前言

之前用过 DHT11 温湿度传感器,测量范围和精度都比较有限,这次试了一下 SHT30,就好很多,就是价格更贵。SHT30 是 SHT3x 系列中的一种,属于低价版,SHT31 是标准版,SHT35 是高端版本,价格一个比一个贵,精度也更高,可以支持数字(IIC)和模拟信号输出,我买的是只接了数字输出的板子。另外这个系列的传感器内部有加热器,通过特定指令打开或关闭,比如在高湿度或者容易冷凝的环境中,开启加热来降低误差以及提高响应速度。
file
SHT30:
温度测量范围:-40~125℃
温度精度:\pm0.3℃
湿度测量范围:0\sim100\%RH
湿度精度:\pm3\%RH

温湿度参考
(数据来源于网络,个体存在差异。另外这个应该是无风的情况下,空气流动对体感会有影响):

  • 当环境温度在18-25℃,相对湿度在40%-70%时,人体感觉最舒适;
  • 温度在24-30℃,湿度小于60%时,人体感觉热,但不闷;
  • 温度高于30℃,湿度大于70%时,人体感觉闷热;
  • 温度高于36℃,湿度大于80%时,人体感觉闷热难忍,发汗机制受阻,极易中暑;
  • 亚洲人舒适温度:18-25℃;
  • 夏天最佳室温:22-25℃,冬天:18-20℃;
  • 婴儿沐浴最佳室温:25-28℃,水温:36-38℃。

Arduino

这里使用的是
Arduino UNO
Arduino IDE 2.1.1
ClosedCube_SHT31D_Arduino 1.5.1(库): https://github.com/closedcube/ClosedCube_SHT31D_Arduino

示例程序

/*
传感器 - Arduino 接线对照:
    VDD - 3.3V
    GND - GND
    SDA - A4
    SCL - A5
*/

#include <Wire.h>
#include <ClosedCube_SHT31D.h>

ClosedCube_SHT31D sht3xd;

void setup()
{
    Serial.begin(9600);
    Serial.println("ClosedCube SHT3XD Library - 单脉冲模式示例");

    sht3xd.begin(0x44);
    Serial.print("SHT3XD 系列 #");
    Serial.println(sht3xd.readSerialNumber());  
}

void loop()
{
  // 时钟拉伸模式
  // 传感器在接收到测量命令后,会将I2C总线上的SCL线拉低,直到测量完成并将数据存储在内部寄存器中。
  // 然后,传感器会释放SCL线,允许主机读取数据。这种模式的优点是可以确保数据的完整性,不会因为主机读取过早而导致数据错误。
  // 但是,这种模式也会占用I2C总线的时间,影响其他设备的通信。
    printResult("mode1", sht3xd.readTempAndHumidity(SHT3XD_REPEATABILITY_LOW, SHT3XD_MODE_CLOCK_STRETCH, 50));  
  delay(1000);
  // 轮询模式
  // 传感器在接收到测量命令后,不会拉低SCL线,而是立即返回一个应答信号。
  // 然后,传感器开始测量,并将数据存储在内部寄存器中。
  // 主机需要不断地向传感器发送读取命令,直到传感器返回一个应答信号为止。
  // 这种模式的优点是可以节省I2C总线的时间,不会影响其他设备的通信。
  // 但是,这种模式也有可能导致数据错误,如果主机读取过早或过晚,都会得到错误的数据。
    printResult("mode2", sht3xd.readTempAndHumidity(SHT3XD_REPEATABILITY_HIGH, SHT3XD_MODE_POLLING, 50));
    delay(1000);
}

void printResult(String text, SHT31D result)
{
    if (result.error == SHT3XD_NO_ERROR)
  {
        Serial.print(text);
        Serial.print(": 温度 ");
        Serial.print(result.t);
        Serial.print("℃, 相对湿度 ");
        Serial.print(result.rh);
        Serial.println("%");
    }
    else {
        Serial.print(text);
        Serial.print(": [错误] 代码 #");
        Serial.println(result.error);
    }
}

file

简易温湿度计

file

这个因为使用了 LCD(IIC) 显示屏,多了一个库 LiquidCrystal_I2C 1.1.2:https://github.com/johnrickman/LiquidCrystal_I2C

这个地方温湿度传感器和 LCD 都是使用的 A4、A5 引脚用作 IIC 通信,不过两者地址不同,接在一起也能用。原先想的是用公对公线从 Arduino 引出这两根线到面包板,再分别接传感器和 LCD,结果发现没有公对公线了,这里就直接把线剪断的,然后接在一起。

/*
传感器 - Arduino 接线对照:
    VDD - 3.3V
    GND - GND
    SDA - A4
    SCL - A5

LCD - Arduino 接线对照:
    VDD - 5V
    GND - GND
    SDA - A4
    SCL - A5
*/

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <ClosedCube_SHT31D.h>

ClosedCube_SHT31D sht3xd;
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
  sht3xd.begin(0x44);
  lcd.init();
  lcd.backlight();
  lcd.clear();
}

void loop()
{
  static SHT31D data;

  data = sht3xd.readTempAndHumidity(SHT3XD_REPEATABILITY_HIGH, SHT3XD_MODE_POLLING, 50);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("T=");
  lcd.print(data.t);
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("RH=");
  lcd.print(data.rh);
  lcd.print("%");

  delay(2000);
}

2023.8.26

在 pdd 上花几块钱弄了块 Arduino Nano 168P
file

接线也是一样的,只是我买的是 168P 版本的,这个 MCU 还要再选择一下。
file

专门当温湿度计使用还挺不错的
file

树莓派

这里使用的是:
树莓派 cm4(官方系统 arm64 2023.5.3)
Adafruit-sht31-for-PI(库和示例代码):https://github.com/sfeakes/Adafruit-sht31-for-PI

使用演示

# 安装依赖
sudo apt update
sudo apt install -y build-essential git

# 克隆 Adafruit-sht31-for-PI 项目
git clone https://github.com/sfeakes/Adafruit-sht31-for-PI.git --depth=1

# 编译
cd Adafruit-sht31-for-PI && make

# 运行
./sht31-d <参数>
# s 打印状态
# r 软复位
# c 清除状态
# e 启用加热器
# d 禁用加热器
# n 打印序列
# p 打印温度和湿度
# -h 帮助

file