制作一个简易的物联网天气监测仪是一个非常有趣的项目,可以让你深入了解ESP32、传感器数据采集以及云服务的使用。在这个项目中,我们将使用ESP32作为主控板,连接温湿度传感器(如DHT11/DHT22)和Wi-Fi网络,将数据上传到云端平台(如ThingSpeak或Adafruit IO),并通过网页查看实时天气数据。
以下是详细的步骤说明:
为了完成这个项目,你需要以下硬件:
将DHT11/DHT22传感器与ESP32连接如下: | DHT 引脚 | ESP32 引脚 | |----------|-------------| | VCC | 3.3V | | DATA | GPIO4 | | GND | GND |
注意:DHT11需要3.3V供电,切勿直接连接5V电源。
ESP32可以通过Arduino IDE进行编程。首先,确保你的Arduino IDE支持ESP32开发板。
文件 > 偏好设置
,在“附加开发板管理器网址”中添加以下地址:
https://dl.espressif.com/dl/package_esp32_index.json
工具 > 开发板 > 开发板管理器
中搜索并安装 ESP32
。在项目中,我们需要以下库:
安装方法:
工具 > 库管理
。以下是完整的代码示例,它会从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();
}
}
将数据上传到ThingSpeak后,你可以通过其网页界面查看实时数据图表。登录到你的ThingSpeak账户,创建一个新的通道,并将API密钥复制到代码中。每次上传数据时,ThingSpeak都会更新图表。
New Channel
创建一个新通道。Write API Key
并替换到代码中。以下是整个项目的流程图:
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