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

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

项目背景

随着物联网(IoT)技术的快速发展,环境监测在智能家居、智慧农业、工业自动化等领域得到了广泛应用。ESP32作为一款功能强大且性价比高的Wi-Fi和蓝牙双模芯片,非常适合用于构建各种物联网应用。本项目将基于ESP32开发一个智能环境监测站,能够实时监测环境的温湿度数据,并通过OLED显示屏进行本地显示,同时将数据通过MQTT协议发送到云端,实现远程监控。

硬件清单

  1. ESP32开发板(如ESP32 DevKit V1)
  2. DHT22温湿度传感器
  3. 0.96寸OLED显示屏(基于SSD1306驱动)
  4. 面包板和杜邦线
  5. 10kΩ电阻(用于DHT22上拉)
  6. USB数据线(用于连接ESP32与电脑)

接线图说明

以下是ESP32与各模块的接线说明:

- VCC接ESP32的3.3V

- GND接ESP32的GND

- DATA接ESP32的GPIO 4

- 在DATA和VCC之间并联一个10kΩ电阻作为上拉电阻

- VCC接ESP32的3.3V

- GND接ESP32的GND

- SCL接ESP32的GPIO 22

- SDA接ESP32的GPIO 21

![ESP32智能环境监测站接线图](https://i.imgur.com/your_image_link.png)

*注:请根据实际硬件调整GPIO引脚,确保接线正确以避免损坏设备。*

完整代码

以下是基于Arduino框架的完整代码:


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

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

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

WiFiClient espClient;

// DHT22 配置
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// OLED 配置
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

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 Broker...");
    if (client.connect("ESP32Client")) {
      Serial.println("连接成功");
    } else {
      Serial.print("连接失败,状态码=");
      Serial.print(client.state());
      Serial.println(" 5秒后重试");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  setup_wifi();
  dht.begin();

  // 初始化 OLED
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 初始化失败!"));
    for(;;);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0,0);
  display.println("环境监测站启动");
  display.display();
  delay(2000);
}

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

  float h = dht.readHumidity();
  float t = dht.readTemperature();

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

  // 显示在 OLED 上
  display.clearDisplay();
  display.setCursor(0,0);
  display.println("温度和湿度");
  display.setCursor(0,20);
  display.print("温度: ");
  display.print(t);
  display.println(" C");
  display.setCursor(0,40);
  display.print("湿度: ");
  display.print(h);
  display.println(" %");
  display.display();

  // 发送到 MQTT

  Serial.print("温度: ");
  Serial.print(t);
  Serial.print(" C, 湿度: ");
  Serial.print(h);
  Serial.println(" %");

  delay(60000); // 每分钟更新一次
}

调试

  1. 连接硬件:按照接线图连接好ESP32与各模块,确保无误。
  2. 配置Wi-Fi和MQTT:在代码中填入正确的Wi-Fi名称、密码以及MQTT服务器地址和端口。
  3. 上传代码:使用Arduino IDE将代码上传到ESP32。
  4. 监视串口输出:打开串口监视器,设置波特率为115200,观察连接状态和数据输出。
  5. 查看OLED显示:OLED显示屏应显示当前的温度和湿度数据。
  6. MQTT数据验证:使用MQTT客户端工具(如MQTT.fx或MQTT Explorer)订阅相应的主题,验证数据是否正确发送。

扩展

  1. 数据存储与可视化

- 将接收到的数据存储到数据库(如InfluxDB)中,并使用Grafana进行可视化展示。

- 可以实现数据的长期趋势分析和实时监控。

  1. 增加更多传感器

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

- 通过I2C或SPI接口扩展传感器数量,提升监测能力。

  1. 远程控制与报警

- 实现远程控制功能,如通过MQTT发送指令控制风扇、空调等设备。

- 设置报警机制,当温湿度超过设定阈值时,通过短信、邮件或微信通知用户。

  1. 低功耗优化

- 利用ESP32的深度睡眠模式,延长设备续航时间,适用于电池供电的应用场景。

- 结合太阳能或其他可再生能源,实现真正的绿色环保监测站。

  1. 安全性增强

- 实现MQTT TLS/SSL加密,确保数据传输的安全性。

- 添加设备认证机制,防止未经授权的访问和控制。

通过以上扩展,可以将智能环境监测站打造成一个功能强大、安全可靠的系统,满足不同应用场景的需求。