#include <DHT.h> // Thư viện DHT để đo nhiệt độ và độ ẩm
#include <TimeLib.h> // Thư viện quản lý thời gian
// Khai báo các chân
const int relays[2] = {8, 3}; // Các chân relay điều khiển van tưới
const int pumpRelay = 2; // Chân relay điều khiển máy bơm
const int lightSensor = A2; // Chân cảm biến ánh sáng
const int dhtPin = 9; // Chân DHT22
// Cài đặt DHT22
#define DHTTYPE DHT22
DHT dht(dhtPin, DHTTYPE);
// Ngưỡng ánh sáng, nhiệt độ, và độ ẩm; tùy chỉnh giá trị theo nhu cầu
const int lightThreshold = 200; // Giá trị ánh sáng dưới ngưỡng này được coi là tối
const float humidityThreshold = 20; // Độ ẩm không khí dưới 20% thì bật tưới
const float minTemp = 18.0; // Nhiệt độ tối thiểu
const float maxTemp = 30.0; // Nhiệt độ tối đa
void setup() {
// Khởi tạo các chân relay là OUTPUT và tắt hết van + máy bơm ban đầu
for (int i = 0; i < 2; i++) {
pinMode(relays[i], OUTPUT);
digitalWrite(relays[i], LOW);
}
pinMode(pumpRelay, OUTPUT);
digitalWrite(pumpRelay, LOW);
Serial.begin(9600);
// Khởi tạo DHT22
dht.begin();
// Cài đặt thời gian ban đầu (thực tế cần có module RTC để duy trì thời gian chính xác)
setTime(18, 0, 0, 11, 9, 2024); // Giả lập thời gian là 18:00 ngày 11/09/2024
}
void loop() {
int lightValue = analogRead(lightSensor); // Đọc giá trị ánh sáng
int currentHour = hour(); // Lấy giờ hiện tại
// Đọc nhiệt độ và độ ẩm từ DHT22
float temperature = dht.readTemperature(); // Đọc nhiệt độ (°C)
float humidity = dht.readHumidity(); // Đọc độ ẩm không khí (%)
// Kiểm tra nếu giá trị nhiệt độ hoặc độ ẩm là NaN
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Error reading DHT22 sensor! Check the connections.");
delay(2000); // Đợi 2 giây trước khi thử lại
return;
}
Serial.print("Light Sensor Value: ");
Serial.println(lightValue);
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Current Time: ");
Serial.print(currentHour);
Serial.println(":00");
// Kiểm tra điều kiện ánh sáng yếu hoặc thời gian từ 18h đến 24h
// và nhiệt độ trong khoảng 18-30°C, độ ẩm dưới 20%
if ((lightValue < lightThreshold & (currentHour >= 18 && currentHour <= 24)) &&
(temperature >= minTemp && temperature <= maxTemp) &&
(humidity < humidityThreshold)) {
bool pumpOn = false; // Biến kiểm tra xem máy bơm có bật không
// Bật cả hai van nếu điều kiện nhiệt độ và độ ẩm phù hợp
for (int i = 0; i < 2; i++) {
digitalWrite(relays[i], HIGH);
pumpOn = true; // Máy bơm cần bật nếu có ít nhất 1 van mở
}
// Điều khiển máy bơm dựa vào biến pumpOn
if (pumpOn) {
digitalWrite(pumpRelay, HIGH); // Bật máy bơm
tone(A2,262,100);
delay(200);
} else {
digitalWrite(pumpRelay, LOW); // Tắt máy bơm
}
} else {
// Tắt toàn bộ relay nếu ngoài giờ hoạt động, ánh sáng mạnh hoặc điều kiện nhiệt độ, độ ẩm không phù hợp
for (int i = 0; i < 2; i++) {
digitalWrite(relays[i], LOW);
}
digitalWrite(pumpRelay, LOW);
}
delay(2000); // Đợi 2 giây trước lần kiểm tra tiếp theo
}