#include <Wire.h>
#include "DHT.h"
// Khai báo DHT22
#define DHTPIN 2 // Chân kết nối DHT22
#define DHTTYPE DHT22 // Loại cảm biến DHT22
DHT dht(DHTPIN, DHTTYPE);
// Khai báo các chân LED và cảm biến
int relayPin = 7; // Chân điều khiển relay (D7)
int ledBom1 = 8;
int ledBom2 = 9;
int ledBom3 = 10;
int ledQuat = 11;
int camBienDatPin = A0;
float nguongNhietDo = 20.0; // Ngưỡng nhiệt độ dưới 20°C
float nguongDoAmKhongKhi = 90.0; // Ngưỡng độ ẩm không khí 90%
// Biến đếm thời gian
unsigned long thoiGianBatDauTuoil = 0; // Thời gian bắt đầu tưới
bool dangTuoi = false; // Biến kiểm tra tình trạng tưới
void setup() {
// Khởi tạo Serial Monitor
Serial.begin(9600);
// Khởi tạo cảm biến DHT22
dht.begin();
// Cài đặt các chân LED và relay
pinMode(relayPin, OUTPUT); // Chân điều khiển relay
pinMode(ledBom1, OUTPUT);
pinMode(ledBom2, OUTPUT);
pinMode(ledBom3, OUTPUT);
pinMode(ledQuat, OUTPUT);
// Tắt tất cả các thiết bị ban đầu
tatTatCaThietBi();
}
void loop() {
// Đọc giá trị cảm biến
int doAmDat = analogRead(camBienDatPin);
float nhietDo = dht.readTemperature();
float doAmKhongKhi = dht.readHumidity();
// In giá trị lên Serial Monitor (Dành cho việc kiểm tra)
// Chuyển đổi giá trị ngưỡng độ ẩm đất từ 0-870 thành 0-100 (tỷ lệ phần trăm)
int nguongdoAmDatPhanTram = map(doAmDat, 0, 870, 0, 100);
Serial.print("Độ ẩm đất (%): ");
Serial.print(nguongdoAmDatPhanTram);
Serial.print(" | Nhiệt độ (C): ");
Serial.print(nhietDo);
Serial.print(" | Độ ẩm không khí (%): ");
Serial.println(doAmKhongKhi);
// Gọi các hàm điều khiển
dieuKienBomNuoc(nguongdoAmDatPhanTram);
dieuKienQuat(nhietDo, doAmKhongKhi);
kiemTraTaoBom();
delay(1000); // Đợi 1 giây trước khi lặp lại
}
// Hàm điều khiển bơm nước
void dieuKienBomNuoc(int nguongdoAmDatPhanTram) {
if (nguongdoAmDatPhanTram < 30) {
// Độ ẩm đất dưới 50%: Mở 3 bơm
digitalWrite(ledBom1, HIGH);
digitalWrite(ledBom2, HIGH);
digitalWrite(ledBom3, HIGH);
Serial.println("3 máy Bơm đã bật(Đang tưới cây)");
if (!dangTuoi) {
thoiGianBatDauTuoil = millis(); // Lưu thời gian bắt đầu tưới
dangTuoi = true; // Đánh dấu đang tưới
}
}
else if (nguongdoAmDatPhanTram >= 30 && nguongdoAmDatPhanTram < 50) {
// Độ ẩm đất từ 50% đến 70%: Mở 2 bơm
digitalWrite(ledBom1, HIGH);
digitalWrite(ledBom2, HIGH);
digitalWrite(ledBom3, LOW); // Bơm 3 tắt
Serial.println("2 máy Bơm đã bật(Đang tưới cây)");
if (!dangTuoi) {
thoiGianBatDauTuoil = millis(); // Lưu thời gian bắt đầu tưới
dangTuoi = true; // Đánh dấu đang tưới
}
}
else if (nguongdoAmDatPhanTram >= 50 && nguongdoAmDatPhanTram <= 85) {
// Độ ẩm đất từ 70% đến 85%: Mở 1 bơm
digitalWrite(ledBom1, HIGH);
digitalWrite(ledBom2, LOW); // Bơm 2 tắt
digitalWrite(ledBom3, LOW); // Bơm 3 tắt
Serial.println("1 máy Bơm đã bật(Đang tưới cây)");
if (!dangTuoi) {
thoiGianBatDauTuoil = millis(); // Lưu thời gian bắt đầu tưới
dangTuoi = true; // Đánh dấu đang tưới
}
}
else {
// Độ ẩm đất trên 85%: Tắt tất cả bơm
digitalWrite(ledBom1, LOW);
digitalWrite(ledBom2, LOW);
digitalWrite(ledBom3, LOW);
Serial.println("Độ ẩm đất đủ, không cần bơm");
}
}
// Hàm điều khiển quạt khí
void dieuKienQuat(float nhietDo, float doAmKhongKhi) {
if (doAmKhongKhi > nguongDoAmKhongKhi || nhietDo < nguongNhietDo) {
digitalWrite(ledQuat, HIGH); // Bật quạt khí khi độ ẩm không khí trên 90%
Serial.println("Quạt đã bật");
} else {
digitalWrite(ledQuat, LOW); // Tắt quạt khí khi độ ẩm không khí dưới 90%
Serial.println("Quạt đã tắt");
}
}
// Hàm kiểm tra và tắt bơm sau 1 phút
void kiemTraTaoBom() {
if (dangTuoi && (millis() - thoiGianBatDauTuoil >= 60000)) {
// Sau 1 phút, tắt bơm
tatTatCaThietBi();
dangTuoi = false; // Đặt lại trạng thái tưới
Serial.println("Đã tưới xong trong 1 phút, tắt bơm");
}
}
// Hàm tắt tất cả các thiết bị
void tatTatCaThietBi() {
digitalWrite(ledBom1, LOW);
digitalWrite(ledBom2, LOW);
digitalWrite(ledBom3, LOW);
digitalWrite(ledQuat, LOW);
digitalWrite(relayPin, LOW); // Tắt relay khi không cần điều khiển
}