ESP32 实战 · 2026-06-12 配图
AI Know 自有配图 · 嵌入式 · IoT · 硬件编程

ESP32 实战教程:智能环境监测站(温湿度+OLED+MQTT)

项目背景

随着物联网(IoT)技术的快速发展,智能环境监测站已经成为智能家居、智慧农业、智慧城市等领域的核心应用之一。通过实时监测环境参数(如温度、湿度),并将这些数据通过无线网络传输到云端,可以实现对环境的智能监控和管理。本项目将基于 ESP32 开发板,集成温湿度传感器、OLED 显示屏,并通过 MQTT 协议将数据上传到云平台,实现一个功能完善的智能环境监测站。

硬件清单

  1. ESP32 开发板(如 ESP32 DevKit V1)
  2. 温湿度传感器(DHT22)
  3. OLED 显示屏(0.96 寸,128x64,I2C 接口)
  4. 跳线若干
  5. 面包板
  6. USB 数据线
  7. MQTT 服务器(如 Mosquitto 或公共 MQTT 服务器)

接线图说明

接线图


实物图描述

  1. ESP32 与 DHT22 连接

- 将 DHT22 的 VCC 引脚连接到 ESP32 的 3.3V 引脚。

- 将 DHT22 的 GND 引脚连接到 ESP32 的 GND 引脚。

- 将 DHT22 的 DATA 引脚连接到 ESP32 的 GPIO 4 引脚。

- 在 DHT22 的 DATA 引脚和 VCC 引脚之间连接一个 10kΩ 的上拉电阻。

  1. ESP32 与 OLED 连接

- 将 OLED 的 VCC 引脚连接到 ESP32 的 3.3V 引脚。

- 将 OLED 的 GND 引脚连接到 ESP32 的 GND 引脚。

- 将 OLED 的 SDA 引脚连接到 ESP32 的 GPIO 21 引脚。

- 将 OLED 的 SCL 引脚连接到 ESP32 的 GPIO 22 引脚。

完整代码

以下是使用 Arduino IDE 编写的完整代码:


#include <WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define DHTPIN 4
#define DHTTYPE DHT22
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
WiFiClient espClient;

// WiFi 配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// MQTT 配置
const char* mqtt_server = "你的MQTT服务器地址";
const char* mqtt_topic = "environment/temperature";
const char* mqtt_topic_humidity = "environment/humidity";

void setup() {
  Serial.begin(115200);
  dht.begin();
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 初始化失败"));
    for(;;);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.display();

  setup_wifi();
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("读取 DHT22 失败!");
    return;
  }

  // 显示在 OLED 上
  display.clearDisplay();
  display.setCursor(0,0);
  display.print("温度: ");
  display.print(temperature);
  display.println(" C");
  display.print("湿度: ");
  display.print(humidity);
  display.println(" %");
  display.display();

  // 发布到 MQTT
  Serial.print("温度: ");
  Serial.print(temperature);
  Serial.print(" C, 湿度: ");
  Serial.print(humidity);
  Serial.println(" %");

  delay(2000);
}

void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("连接到 ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi 连接成功");
  Serial.print("IP 地址: ");
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("尝试连接到 MQTT 服务器...");
    if (client.connect("ESP32Client")) {
      Serial.println("连接成功");
    } else {
      Serial.print("连接失败,状态码=");
      Serial.print(client.state());
      Serial.println(",重试中...");
      delay(5000);
    }
  }
}

调试

  1. 硬件连接检查

- 确认所有连接正确,特别是电源和地线。

- 使用万用表检查电压,确保 ESP32 和传感器工作在 3.3V。

  1. 软件配置

- 在 Arduino IDE 中安装所需的库:

- PubSubClient

- Adafruit SSD1306

- DHT sensor library

- 配置 WiFi 和 MQTT 服务器地址:

- 替换代码中的 ssidpassword 为你的 WiFi 名称和密码。

- 替换 mqtt_server 为你的 MQTT 服务器地址。

  1. 上传代码

- 连接 ESP32 到电脑。

- 选择正确的板型和端口。

- 点击上传,等待编译和上传完成。

  1. 监控串口输出

- 打开串口监视器,设置波特率为 115200。

- 观察连接状态和数据发布情况。

扩展

1. 数据可视化

将 MQTT 主题的数据接入到数据可视化平台,如 Grafana 或 ThingSpeak。通过图表展示温度和湿度的变化趋势,实现更直观的监控。

2. 远程控制

在监测站中加入继电器模块,通过 MQTT 远程控制其他设备。例如,根据温度自动调节风扇或加热器。

3. 低功耗模式

为了延长电池寿命,可以在代码中加入低功耗模式。例如,使用 ESP32 的深度睡眠功能,定期唤醒采集数据并上传,然后再次进入睡眠状态。

4. 多传感器集成

除了温湿度传感器,还可以集成其他类型的传感器,如空气质量传感器(MQ-135)、光照传感器(BH1750)等,实现更全面的环境监测。

5. 云平台集成

将数据上传到云平台,如 AWS IoT、Azure IoT 或阿里云物联网平台。利用云平台的强大功能,实现数据存储、分析和报警等功能。

通过以上扩展,可以将智能环境监测站的功能进一步提升,满足不同应用场景的需求。