#include <WiFi.h> // Thư viện hỗ trợ kết nối WiFi
#include "DHTesp.h" // Thư viện hỗ trợ đọc cảm biến DHT
#include "ThingSpeak.h" // Thư viện hỗ trợ giao tiếp với dịch vụ ThingSpeak
// Khai báo các chân và thông tin mạng
const int DHT_PIN = 15; // Chân kết nối cảm biến DHT
const int TRIG_PIN = 21; // Chân Trig của HC-SR04
const int ECHO_PIN = 19; // Chân Echo của HC-SR04
const int LED_PIN = 2; // Chân điều khiển LED vàng
const int LED_RED_PIN = 32; // Chân điều khiển LED đỏ
const int LED_GREEN_PIN = 25; // Chân điều khiển LED xanh
const char* WIFI_NAME = "Wokwi-GUEST"; // Tên mạng WiFi
const char* WIFI_PASSWORD = ""; // Mật khẩu WiFi
const int myChannelNumber = 2769390; // ID kên ThingSpeak
const char* myApiKey = "ATLGBUDWE05E5VS9"; // API key của kên ThingSpeak
const char* server = "api.thingspeak.com"; // Máy chủ ThingSpeak
// Khai báo các đối tượng cảm biến và kết nối
DHTesp dhtSensor; // Đối tượng để đọc cảm biến DHT
WiFiClient client; // Đối tượng hỗ trợ kết nối mạng
void setup() {
Serial.begin(115200); // Khởi tạo Serial với tốc độ 115200 bps
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // Thiết lập loại cảm biến DHT (DHT22)
pinMode(LED_PIN, OUTPUT); // Đặt chân LED vàng làm ngõ ra
pinMode(LED_RED_PIN, OUTPUT); // Đặt chân LED đỏ làm ngõ ra
pinMode(LED_GREEN_PIN, OUTPUT); // Đặt chân LED xanh làm ngõ ra
pinMode(TRIG_PIN, OUTPUT); // Đặt chân Trig làm ngõ ra
pinMode(ECHO_PIN, INPUT); // Đặt chân Echo làm ngõ vào
// Kết nối WiFi
WiFi.begin(WIFI_NAME, WIFI_PASSWORD); // Bắt đầu kết nối tới mạng WiFi
while (WiFi.status() != WL_CONNECTED) { // Đợi cho đến khi kết nối thành công
delay(1000); // Chờ 1 giây
Serial.println("Wifi not connected"); // In thông báo chưa kết nối
}
Serial.println("Wifi connected!"); // Thông báo đã kết nối thành công
Serial.println("Local IP: " + String(WiFi.localIP())); // Hiển thị địa chỉ IP
WiFi.mode(WIFI_STA); // Chuyển ESP32 sang chế độ Station
ThingSpeak.begin(client); // Khởi tạo kết nối ThingSpeak
}
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Đọc thời gian Echo
long duration = pulseIn(ECHO_PIN, HIGH);
// Tính toán khoảng cách (cm)
float distance = duration * 0.034 / 2;
return distance;
}
void loop() {
// Đọc dữ liệu từ cảm biến
TempAndHumidity data = dhtSensor.getTempAndHumidity(); // Lấy nhiệt độ và độ ẩm
float distance = getDistance(); // Đọc khoảng cách
// Gửi dữ liệu nhiệt độ, độ ẩm, và khoảng cách lên ThingSpeak
ThingSpeak.setField(1, data.temperature); // Cập nhật trường 1: Nhiệt độ
ThingSpeak.setField(2, data.humidity); // Cập nhật trường 2: Độ ẩm
ThingSpeak.setField(3, distance); // Cập nhật trường 3: Khoảng cách
// Điều khiển LED vàng theo ngưỡng nhiệt độ, độ ẩm hoặc khoảng cách
if (data.temperature > 35 || data.temperature < 12 ||
data.humidity > 70 || data.humidity < 40 ||
distance < 10 || distance > 100) { // Kiểm tra ngưỡng khoảng cách
digitalWrite(LED_PIN, HIGH); // Bật LED vàng nếu vượt ngưỡng
} else {
digitalWrite(LED_PIN, LOW); // Tắt LED vàng nếu trong ngưỡng
}
// Điều khiển LED đỏ khi nhiệt độ vượt ngưỡng 60°C
if (data.temperature > 60) {
digitalWrite(LED_RED_PIN, HIGH); // Bật LED đỏ liên tục
} else {
digitalWrite(LED_RED_PIN, LOW); // Tắt LED đỏ
}
// Điều khiển LED xanh khi nhiệt độ trong khoảng (10°C, 50°C) và độ ẩm < 70%
if (data.temperature > 10 && data.temperature < 50 && data.humidity < 70) {
digitalWrite(LED_GREEN_PIN, HIGH); // Bật LED xanh
} else {
digitalWrite(LED_GREEN_PIN, LOW); // Tắt LED xanh
}
// Điều kiện LED dựa trên khoảng cách
if (distance < 10) {
digitalWrite(LED_RED_PIN, HIGH);
delay(250);
//digitalWrite(LED_RED_PIN, LOW);
//delay(250);
}
// Gửi dữ liệu lên ThingSpeak
int x = ThingSpeak.writeFields(myChannelNumber, myApiKey); // Gửi dữ liệu
// Hiển thị dữ liệu đọc được
Serial.println("Temp: " + String(data.temperature, 2) + " °C"); // Nhiệt độ
Serial.println("Humidity: " + String(data.humidity, 1) + "%"); // Độ ẩm
Serial.println("Distance: " + String(distance, 1) + " cm"); // Khoảng cách
// Kiểm tra trạng thái gửi dữ liệu lên ThingSpeak
if (x == 200) {
Serial.println("Data sent to ThingSpeak successfully!"); // Thành công
} else {
Serial.println("Error sending data to ThingSpeak. HTTP code: " + String(x)); // Lỗi
}
// Chờ trước khi thực hiện lại vòng lặp
delay(15000); // Delay 15 giây (đúng với giới hạn API của ThingSpeak)
}