最近更新于 2024-05-05 12:32
前言
之前用过 DHT11 温湿度传感器,测量范围和精度都比较有限,这次试了一下 SHT30,就好很多,就是价格更贵。SHT30 是 SHT3x 系列中的一种,属于低价版,SHT31 是标准版,SHT35 是高端版本,价格一个比一个贵,精度也更高,可以支持数字(IIC)和模拟信号输出,我买的是只接了数字输出的板子。另外这个系列的传感器内部有加热器,通过特定指令打开或关闭,比如在高湿度或者容易冷凝的环境中,开启加热来降低误差以及提高响应速度。
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);
}
}
简易温湿度计
这个因为使用了 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
接线也是一样的,只是我买的是 168P 版本的,这个 MCU 还要再选择一下。
专门当温湿度计使用还挺不错的
树莓派
这里使用的是:
树莓派 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 帮助