#include <WiFi.h> // Thư viện WiFi dành cho ESP32
#include <HTTPClient.h> // Thư viện HTTPClient để thực hiện các yêu cầu HTTP
#include <DHT.h> // Thư viện cảm biến DHT để đo nhiệt độ và độ ẩm
// Cấu hình DHT
#define DHTPIN 15 // Chân GPIO được kết nối với DHT (GPIO 15)
#define DHTTYPE DHT22 // Loại cảm biến DHT (DHT22)
DHT dht(DHTPIN, DHTTYPE);
// Cấu hình kênh ThingSpeak
#define SECRET_CH_ID 2785148 // ID của kênh ThingSpeak
#define SECRET_WRITE_APIKEY "ASHNKQQL0E68YMM2" // Write API Key để gửi dữ liệu lên ThingSpeak
// Cấu hình WiFi
const char* ssid = "Wokwi-GUEST"; // Tên mạng WiFi
const char* password = ""; // Mật khẩu WiFi (để trống nếu không có mật khẩu)
// URL của server ThingSpeak
const char* server = "http://api.thingspeak.com";
const char* apiKey = "ASHNKQQL0E68YMM2";
// Cấu hình LED
#define LED_RED 4
#define LED_GREEN 2
// Cấu hình cảm biến siêu âm
#define TRIG_PIN 32
#define ECHO_PIN 33
void setup() {
Serial.begin(115200); // Khởi động Serial Monitor
dht.begin(); // Khởi động cảm biến DHT
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Kết nối WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\nWi-Fi connected."); // Kết nối WiFi thành công
}
void loop() {
// Kiểm tra kết nối WiFi
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Wi-Fi disconnected. Attempting to reconnect...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\nWi-Fi reconnected.");
}
// Đọc dữ liệu từ cảm biến DHT
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Kiểm tra dữ liệu hợp lệ
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
delay(2000); // Đợi 2 giây trước khi thử lại
return;
}
// Đọc dữ liệu từ cảm biến siêu âm
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = (duration * 0.0343) / 2;
// In thông tin dữ liệu lên Serial Monitor
Serial.print("Nhiệt độ: ");
Serial.print(temperature);
Serial.print("°C | Độ ẩm: ");
Serial.print(humidity);
Serial.print("% | Khoảng cách: ");
Serial.print(distance);
Serial.println(" cm");
// Hiển thị cảnh báo nếu nhiệt độ vượt ngưỡng
if (temperature > 60) {
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
Serial.println("CẢNH BÁO: Nhiệt độ cao vượt ngưỡng!");
} else if (temperature <= 60 && humidity < 50) {
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_RED, LOW);
Serial.println("Điều kiện bình thường.");
} else {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
Serial.println("Không phù hợp điều kiện. Tắt tất cả đèn LED.");
}
// Tạo URL gửi dữ liệu
String url = String(server) + "/update?api_key=" + apiKey +
"&field1=" + String(temperature) +
"&field2=" + String(humidity) +
"&field3=" + String(distance);
// Gửi yêu cầu HTTP
HTTPClient http;
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.println("Dữ liệu đã gửi thành công!");
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Lỗi khi gửi dữ liệu. HTTP Response code: ");
Serial.println(httpResponseCode);
}
// Giải phóng tài nguyên
http.end();
// Đợi 15 giây trước khi gửi lại
delay(15000);
}