#include <ESP32Servo.h>
#include <DHT.h>
#define RAIN_DIGITAL 16 // Chân digital cho cảm biến mưa
#define BUTTON_PIN 26 // Chân cho nút nhấn là GPIO 26
const int ServoPin = 18; // Chân điều khiển servo
#define DHTPIN 15 // Chân dữ liệu cho cảm biến DHT22
#define DHTTYPE DHT22 // Loại cảm biến DHT
Servo servo;
DHT dht(DHTPIN, DHTTYPE); // Tạo đối tượng DHT
bool isRaining = false; // Trạng thái cảm biến mưa
bool isButtonPressed = false; // Trạng thái nút nhấn
bool servoState = false; // Trạng thái của servo (true: mở, false: đóng)
bool wasRaining = false; // Theo dõi trạng thái trước đó của mưa
float humidity = 0; // Độ ẩm hiện tại
float temperature = 0; // Nhiệt độ hiện tại
float humidityThreshold = 40; // Ngưỡng độ ẩm thấp để kích hoạt servo
void setup() {
// Khởi tạo chân cho cảm biến mưa và nút nhấn
pinMode(RAIN_DIGITAL, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Nút nhấn kết nối kiểu PULLUP với chân GPIO 26 và GND
servo.attach(ServoPin); // Gắn servo vào chân điều khiển
// Khởi tạo servo ở vị trí đóng
servo.write(0); // Đóng (góc 0 độ)
Serial.begin(9600);
// Bắt đầu cảm biến DHT
dht.begin();
}
void loop() {
// Đọc trạng thái cảm biến mưa
isRaining = digitalRead(RAIN_DIGITAL) == HIGH;
// Đọc độ ẩm và nhiệt độ từ cảm biến DHT22
humidity = dht.readHumidity();
temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Đọc trạng thái nút nhấn
isButtonPressed = digitalRead(BUTTON_PIN) == LOW; // Nút nhấn nhả mức HIGH, nhấn mức LOW
// Kiểm tra nếu trời mưa thì luôn đóng servo
if (isRaining) {
Serial.println("It's raining! Servo closing...");
servo.write(0); // Đóng servo (góc 0 độ)
servoState = false; // Cập nhật trạng thái servo đã đóng
wasRaining = true; // Cập nhật rằng trời đang mưa
}
// Nếu không mưa và nút nhấn được nhấn, chuyển đổi trạng thái servo
if (!isRaining && isButtonPressed) {
Serial.println("Button pressed!");
// Đổi trạng thái của servo
if (servoState) {
Serial.println("Servo closing...");
servo.write(0); // Đóng servo
servoState = false; // Cập nhật trạng thái servo đã đóng
} else {
Serial.println("Servo opening...");
servo.write(180); // Mở servo
servoState = true; // Cập nhật trạng thái servo đã mở
}
// Đợi một thời gian để tránh nhiễu khi nhấn nút
delay(500);
}
// Kiểm tra khi hết mưa thì mở servo
if (!isRaining && wasRaining) {
Serial.println("Rain stopped! Servo opening...");
servo.write(180); // Mở servo (góc 180 độ)
servoState = true; // Cập nhật trạng thái servo đã mở
wasRaining = false; // Cập nhật rằng trời đã hết mưa
}
// Kiểm tra nếu độ ẩm thấp hơn ngưỡng cho phép
if (humidity < humidityThreshold && !isRaining) {
Serial.println("Humidity is low! Servo opening...");
servo.write(180); // Mở servo (góc 180 độ)
servoState = true; // Cập nhật trạng thái servo đã mở
} else if (humidity >= humidityThreshold && !isRaining) {
Serial.println("Humidity is fine. Servo closing...");
servo.write(0); // Đóng servo (góc 0 độ)
servoState = false; // Cập nhật trạng thái servo đã đóng
}
delay(100); // Kiểm tra mỗi 100ms
}