温湿度传感器

罗大富 BigRich大约 3 分钟ESP32Arduino

本节课我们来学习温湿度传感器。

实验原理

无论是工业领域还是我们的日常生活,温度和湿度一直都是两个比较重要的指标,DHT11 和 DHT22 是 DHT 系列中使用最广泛的两种传感器。它们有着相同的引脚,用法一致,下图是两者的规格对比:

如果拆下传感器的外壳,其实里面只有一个 NTC 热敏电阻和一个湿度传感元件。

湿度传感部件有两个电极,中间有一个保湿基底(通常是盐或导电塑料聚合物)。随着湿度的升高,基板吸收水蒸气,导致离子的释放和两个电极之间电阻的降低。电阻的变化与湿度成正比,可以测量湿度来估计相对湿度。

DHT11 与 DHT22 还包括用于测量温度的 NTC(热敏电阻)。热敏电阻是一种电阻随温度变化的电阻器。从技术上讲,所有电阻器都是热敏电阻,因为它们的电阻随温度略有变化,但这种变化通常非常小,难以测量。热敏电阻的设计使其电阻随温度而急剧变化(每度 100Ω 或更大),而且电阻随着温度的升高而减小。

DHT11 和 DHT22 传感器的连接都相对简单。它们有四个引脚:

  • VCC:传感器供电引脚,建议使用 5V 电源。使用 5V 电源,传感器可以放置在 20 米外。在 3.3V 电源电压下,传感器可以放置在 1 米外;
  • Data:通过串行数据输出温度和湿度;
  • NCNot connected,无连接;
  • GND:接地;

硬件电路设计

物料清单(BOM 表):

材料名称数量
LCD1602 液晶屏 IIC1
DHT11 温湿度传感器1
杜邦线(跳线)若干
面包板1

将材料按照下图相连:

软件程序设计

本实验通过 DHT11 读取当前环境的温湿度,并将其打印在 LCD1602 屏幕与串口监视器中。我们这个实验会直接调用 DHT 与 LCD1602 I2C 的第三方库,因此,需要提前在 Arduino IDE 中安装 DHT sensor libraryLiquidCrystal I2C 第三方库

202504131451779

我们可以先把读取到的数据打印在串口监视器中,代码如下:

#include <DHT.h>
 
 
// 初始化 DHT 对象
DHT dht(13, DHT11);
 
void setup() {
  Serial.begin(9600); 
  dht.begin();
}
 
void loop() {
  // 读取湿度
  float humid = dht.readHumidity();
  // 读取温度
  float temp = dht.readTemperature();

  // 显示内容
  Serial.print("湿度: ");
  Serial.print(humid);
  Serial.print("% 温度: ");
  Serial.print(temp);
  Serial.println("°C ");
  delay(2000);
}

最后,我们就可以把从传感器中读取到的数据显示在 LCD1602 屏幕上,代码如下:

#include <LiquidCrystal_I2C.h>
#include <DHT.h>


// 声明 LCD1602 I2C 对象
LiquidCrystal_I2C lcd(0x27, 16, 2);

// 初始化 DHT 对象
DHT dht(13, DHT11);


void setup()
{
  // 初始化 LCD 对象
  lcd.init();
  // 打开背光
  lcd.backlight();

  // 设置串口通信波特率
  Serial.begin(9600); 
  
  // 初始化 dht 对象
  dht.begin();
}

void loop(){
  // 读取湿度
  float humid = dht.readHumidity();
  // 读取温度
  float temp = dht.readTemperature();

  // 显示内容
  Serial.print("湿度: ");
  Serial.print(humid);
  Serial.print("% 温度: ");
  Serial.print(temp);
  Serial.println("°C ");

  // 清屏
  lcd.clear();
  // 打印内容在 LCD1602 上
  lcd.print("temp: ");
  lcd.print(temp);
  // 输出度数符号
  lcd.write(0xdf);  // 也可以写成 lcd.print(char(223))
  lcd.print(char(223));
  lcd.print("C");
  // 换行
  lcd.setCursor(0, 1);
  lcd.print("humid: ");
  lcd.print(humid);
  lcd.print("%");

  delay(2000);
}

提示

大多数 LCD1602 的 HD44780 控制器 内置了 ° 符号,其字符编码为 十进制 223(十六进制 0xDF),可以直接输出。

上次编辑于:
贡献者: Luo,罗大富BigRich