使用ESP32制作简易物联网天气监测仪

2025-06发布4次浏览

制作一个简易的物联网天气监测仪是一个非常有趣的项目,可以让你深入了解ESP32、传感器数据采集以及云服务的使用。在这个项目中,我们将使用ESP32作为主控板,连接温湿度传感器(如DHT11/DHT22)和Wi-Fi网络,将数据上传到云端平台(如ThingSpeak或Adafruit IO),并通过网页查看实时天气数据。

以下是详细的步骤说明:


1. 硬件准备

为了完成这个项目,你需要以下硬件:

  • ESP32开发板
  • DHT11或DHT22温湿度传感器
  • 杜邦线若干
  • 面包板(可选)
  • USB数据线(用于供电和编程)

连接电路

将DHT11/DHT22传感器与ESP32连接如下: | DHT 引脚 | ESP32 引脚 | |----------|-------------| | VCC | 3.3V | | DATA | GPIO4 | | GND | GND |

注意:DHT11需要3.3V供电,切勿直接连接5V电源。


2. 软件环境搭建

安装Arduino IDE

ESP32可以通过Arduino IDE进行编程。首先,确保你的Arduino IDE支持ESP32开发板。

  1. 打开Arduino IDE,进入 文件 > 偏好设置,在“附加开发板管理器网址”中添加以下地址:
    https://dl.espressif.com/dl/package_esp32_index.json
    
  2. 工具 > 开发板 > 开发板管理器 中搜索并安装 ESP32

安装所需库

在项目中,我们需要以下库:

  • DHT传感器库:用于读取温湿度数据。
  • WiFi库:用于连接Wi-Fi网络。
  • HTTPClient库:用于发送HTTP请求到云端。

安装方法:

  1. 打开Arduino IDE,进入 工具 > 库管理
  2. 搜索并安装以下库:
    • Adafruit Unified Sensor Library
    • DHT sensor library by Adafruit
    • WiFi

3. 编写代码

以下是完整的代码示例,它会从DHT11/DHT22传感器读取温湿度数据,并通过Wi-Fi将数据上传到ThingSpeak。

#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>

// 定义DHT引脚和类型
#define DHTPIN 4     // DHT传感器连接到GPIO4
#define DHTTYPE DHT11 // 使用DHT11传感器

DHT dht(DHTPIN, DHTTYPE);

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

// ThingSpeak配置
const char* server = "api.thingspeak.com"; // ThingSpeak服务器
String writeAPIKey = "你的Write API Key"; // 替换为你的API密钥
unsigned long lastConnectionTime = 0;      // 上次连接时间
const unsigned long postingInterval = 20 * 1000; // 每20秒上传一次数据

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

  // 连接到Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
}

void loop() {
  // 确保每20秒上传一次数据
  if ((millis() - lastConnectionTime) > postingInterval) {
    float humidity = dht.readHumidity(); // 读取湿度
    float temperature = dht.readTemperature(); // 读取温度

    if (isnan(humidity) || isnan(temperature)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }

    // 打印数据到串口监视器
    Serial.print("Humidity: ");
    Serial.print(humidity);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(temperature);
    Serial.println(" *C");

    // 将数据上传到ThingSpeak
    HTTPClient http;
    String url = "https://api.thingspeak.com/update?api_key=" + writeAPIKey + "&field1=" + String(temperature) + "&field2=" + String(humidity);

    http.begin(url);
    int httpResponseCode = http.GET();

    if (httpResponseCode > 0) {
      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);
    } else {
      Serial.print("Error on sending GET: ");
      Serial.println(httpResponseCode);
    }

    http.end();
    lastConnectionTime = millis();
  }
}

4. 数据可视化

将数据上传到ThingSpeak后,你可以通过其网页界面查看实时数据图表。登录到你的ThingSpeak账户,创建一个新的通道,并将API密钥复制到代码中。每次上传数据时,ThingSpeak都会更新图表。

创建ThingSpeak通道

  1. 登录 ThingSpeak
  2. 点击 New Channel 创建一个新通道。
  3. 设置字段名称(例如Field1为温度,Field2为湿度)。
  4. 记下生成的 Write API Key 并替换到代码中。

5. 流程图

以下是整个项目的流程图:

flowchart TD
    A[启动] --> B[初始化DHT传感器]
    B --> C[连接Wi-Fi]
    C --> D[读取温湿度数据]
    D --> E{数据是否有效?}
    E --是--> F[上传数据到ThingSpeak]
    E --否--> G[打印错误信息]
    F --> H[等待20秒]
    G --> H
    H --> D

6. 扩展功能

  • 增加更多传感器:可以添加气压传感器(如BMP280)以测量大气压力。
  • 本地显示:通过OLED屏幕或LCD模块显示实时数据。
  • 报警功能:当温度或湿度超出设定范围时,触发蜂鸣器或LED灯报警。