💡 划重点

  • 主题:智能环境监测站
  • 芯片:ESP32
  • 主要功能:温湿度监测、OLED 显示、MQTT 通信
  • 成本:约 50 元人民币
  • 开发难度:中等,适合有一定嵌入式基础的开发者

项目背景

随着物联网技术的快速发展,环境监测在智能家居、工业控制等领域的需求日益增长。本项目旨在利用 ESP32 芯片,设计一款具备温湿度监测、OLED 显示和 MQTT 通信功能的智能环境监测站。ESP32 是一款功能强大的双核 Wi-Fi 和蓝牙微控制器,具有低功耗、高性能的特点,非常适合用于物联网项目。

硬件清单

  1. ESP32 开发板(如 ESP32 DevKit V1)
  2. DHT22 温湿度传感器
  3. 0.96 寸 OLED 显示屏(128x64,I2C 接口)
  4. 杜邦线若干
  5. 面包板
  6. USB 数据线

ESP32 开发板

*图 1:ESP32 DevKit V1 开发板*

DHT22 温湿度传感器

*图 2:DHT22 温湿度传感器*

接线图说明

  1. DHT22 传感器接线

- VCC 接 ESP32 3.3V

- GND 接 ESP32 GND

- DATA 接 ESP32 GPIO 4

  1. OLED 显示屏接线

- VCC 接 ESP32 3.3V

- GND 接 ESP32 GND

- SDA 接 ESP32 GPIO 21

- SCL 接 ESP32 GPIO 22

*图 3:ESP32 环境监测站接线图*

完整代码

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


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

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

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

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
const char* mqtt_server = "你的MQTT服务器地址";

WiFiClient espClient;

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.println("IP 地址: ");
}

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

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

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;
  }

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

  display.clearDisplay();
  display.setCursor(0,0);
  display.print("湿度: ");
  display.print(h);
  display.println(" %");
  display.print("温度: ");
  display.print(t);
  display.println(" *C");
  display.display();

  String msg = "{\"temperature\": " + String(t) + ", \"humidity\": " + String(h) + "}";
  client.publish("esp32/temperature", String(t).c_str());
  client.publish("esp32/humidity", String(h).c_str());
  delay(2000);
}

调试

  1. 连接 WiFi:上传代码后,打开串口监视器,确保 ESP32 成功连接到 WiFi。
  2. MQTT 连接:检查 MQTT 服务器连接状态,确保数据能够正确发送。
  3. 传感器数据读取:验证 DHT22 传感器读取的温湿度数据是否准确。
  4. OLED 显示:观察 OLED 显示屏,确认温湿度数据正确显示。
⚠️ 图表解析失败: bar 数据缺数值 ESP32 vs ESP8266 vs Raspberry Pi Pico 功耗/算力/价格对比
不同优化阶段的电流消耗column
70mA
90mA
80mA
5mA
初始阶段
WiFi 连接
数据传输
休眠模式

扩展

  1. 增加更多传感器:如空气质量传感器(MQ-135)、光照传感器(BMP280)等,实现更全面的环境监测。
  2. 数据存储与可视化:将数据存储到云平台(如 ThingSpeak、Firebase),并使用图表进行可视化展示。
  3. 低功耗优化:通过调整 ESP32 的工作模式,降低功耗,延长设备续航时间。
⚠️ 图表解析失败: pie 数据缺数值 项目预算/物料成本占比

*图 4:项目预算/物料成本占比*

视频教程

🎬[视频:BV 号格式不合法 BV1xxxxxxx]

*视频 1:ESP32 环境监测站完整教程*

🎬[视频:BV 号格式不合法 BV2xxxxxxx]

*视频 2:ESP32 MQTT 通信详解*

通过以上步骤,你就可以成功搭建一个功能完善的智能环境监测站。根据实际需求,还可以进行更多功能的扩展和优化。希望本教程对你有所帮助!

📚 真实参考