ESP32 读取 DHT11 温湿度并串口输出:GPIO14 接线、库使用与常见问题排查(Arduino)

DHT11/DHT22 是嵌入式项目中最常见的温湿度传感器之一,价格低、接线简单,适合做环境监测、智能家居、设备箱体温湿度保护等场景。本文基于一段可直接运行的 Arduino 示例代码,完整讲解如何在 ESP32 上通过 GPIO14 读取 DHT11 的温湿度数据,并在串口监视器中周期性输出。


1. 实现功能概述

本程序实现了以下功能:

  • 使用 DHT 库驱动 DHT11 传感器
  • 数据线接在 ESP32 的 GPIO14
  • 初始化串口(9600 波特率)
  • 2 秒读取一次传感器数据(符合 DHT11 的最低采样周期要求)
  • 读取:
    • 湿度(%RH)
    • 温度(℃)
  • 若读取失败(返回 NaN),在串口输出错误提示并跳过本次打印

2. 硬件准备与接线说明

2.1 所需硬件

  • ESP32 开发板
  • DHT11 传感器模块(或裸传感器)
  • 杜邦线若干

2.2 DHT11 引脚与接线

常见 DHT11 模块一般有 3~4 个引脚:

  • VCC → ESP32 3.3V(多数模块支持 3.3V;若模块标注 5V 也可,但 ESP32 IO 仍是 3.3V 逻辑)
  • GND → ESP32 GND
  • DATA → ESP32 GPIO14

如果你用的是“裸 DHT11”(非模块),通常需要在 DATA 与 VCC 之间加一个上拉电阻(4.7kΩ~10kΩ)。
大多数成品模块已经自带上拉电阻,可直接接线。


3. 依赖库安装(Arduino IDE)

本程序依赖 DHT.h,通常通过安装 Adafruit 的 DHT 库获得。

在 Arduino IDE 中:

  • 工具 → 管理库(Library Manager)
  • 搜索并安装:
    • DHT sensor library(Adafruit)
    • 通常还会提示安装 Adafruit Unified Sensor,建议一并安装(兼容性更好)

4. 完整 Arduino 程序代码

下面是你提供的原始代码,可直接复制运行:

#include <DHT.h>

// 配置传感器
#define DHTPIN 14          // 数据引脚接GPIO14
#define DHTTYPE DHT11      // 传感器型号,DHT22 则改为 DHT22

DHT dht(DHTPIN, DHTTYPE);  // 初始化DHT对象

void setup() {
  Serial.begin(9600);      // 串口初始化
  dht.begin();             // 传感器初始化
}

void loop() {
  // 等待传感器稳定(DHT11每次读取间隔至少1秒,DHT22至少2秒)
  delay(2000);

  // 读取温湿度数据
  float h = dht.readHumidity();    // 湿度值(%RH)
  float t = dht.readTemperature(); // 温度值(℃),默认摄氏度,华氏度用 readTemperature(true)

  // 检查读取是否失败
  if (isnan(h) || isnan(t)) {
    Serial.println("读取传感器数据失败!");
    return;
  }

  // 串口打印数据
  Serial.print("湿度: ");
  Serial.print(h);
  Serial.print(" %RH\t");
  Serial.print("温度: ");
  Serial.print(t);
  Serial.println(" ℃");
}

5. 代码逻辑详解(关键点)

5.1 选择传感器类型与数据引脚

#define DHTPIN 14
#define DHTTYPE DHT11
  • DHTPIN 决定数据线接到哪个 GPIO
  • DHTTYPE 决定驱动协议细节
    如果你换成 DHT22,需要改成:
#define DHTTYPE DHT22

5.2 初始化 DHT 对象

DHT dht(DHTPIN, DHTTYPE);

这行代码创建了 DHT 驱动对象,后续所有读写都通过 dht 完成。

5.3 setup():串口与传感器初始化

Serial.begin(9600);
dht.begin();
  • Serial.begin(9600) 用于串口打印调试信息
  • dht.begin() 会初始化传感器驱动(必须调用)

5.4 loop():控制采样间隔并读取数据

delay(2000);

DHT 传感器对采样周期有要求:

  • DHT11:推荐至少 1 秒一次
  • DHT22:推荐至少 2 秒一次

你的代码使用 2 秒,兼容性更稳。

读取部分:

float h = dht.readHumidity();
float t = dht.readTemperature();
  • readHumidity() 返回湿度百分比(%RH)
  • readTemperature() 默认返回摄氏度
    如果要华氏度:
float tf = dht.readTemperature(true);

5.5 读取失败判断:NaN 检测

DHT 协议时序要求较严格,读失败在实际项目中很常见。库通常会返回 NaN,因此你做了:

if (isnan(h) || isnan(t)) {
  Serial.println("读取传感器数据失败!");
  return;
}

这可以避免输出无效数据,同时便于排查接线或供电问题。


6. 串口查看方式与输出示例

上传程序后,打开 Arduino IDE 的串口监视器:

  • 波特率选择 9600
  • 你会看到每 2 秒输出一行,例如(示意):
湿度: 45.00 %RH    温度: 26.00 ℃

7. 常见问题排查(读取失败最常见的原因)

如果你频繁看到“读取传感器数据失败!”,通常按以下顺序排查:

  1. 供电与地线是否可靠

    • DHT11 对供电稳定性比较敏感
  2. DATA 引脚是否接对 GPIO14

  3. 是否缺少上拉电阻

    • 裸传感器尤其常见;模块一般自带
  4. 采样间隔是否过短

    • DHT11 不要小于 1 秒
    • DHT22 不要小于 2 秒
  5. 线太长/干扰太强

    • 线过长时建议缩短,或增加滤波与更好的供电去耦
  6. GPIO 选择不当

    • ESP32 某些引脚有启动/下载相关功能,尽量使用常规 GPIO(14 通常可用)

8. 实战扩展建议(下一步怎么做)

当你能稳定读取 DHT11 后,可以很自然地扩展为:

  • 在 OLED 上显示温湿度(结合 SSD1306)
  • 超过阈值触发风扇/蜂鸣器/继电器
  • 上报 MQTT/HTTP 到服务器
  • 存入 SD 卡或发送到蓝牙/串口上位机

例如加入“温度过高报警”逻辑(示意):

if (t > 35.0) {
  Serial.println("温度过高,触发报警!");
}

9. 总结

这份 ESP32 + DHT11 Arduino 程序完成了一个标准的温湿度采集闭环:

  • 初始化串口与传感器
  • 按规定周期读取温湿度
  • 判断 NaN 处理读取失败
  • 串口输出数据,便于调试与验证
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐