#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <dht.h>
#define MOISTURE_SENSOR A0
#define RELAY 7
#define DHTPIN 8
#define DHTTYPE DHT11
#define RED_LED 9
#define GREEN_LED 10
#define BUZZER 11
#define YELLOW_LED 12
#define TRIG 12
#define ECHO 13
LiquidCrystal_I2C lcd(0x27, 16, 2);
dht DHT;
void setup() {
pinMode(MOISTURE_SENSOR, INPUT);
pinMode(RELAY, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
lcd.begin(16, 2);
lcd.backlight();
Serial.begin(9600);
lcd.setCursor(0, 0);
lcd.print("System Ready");
delay(2000);
lcd.clear();
}
float measureDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duration = pulseIn(ECHO, HIGH);
float distance = duration * 0.034 / 2; // Convert to cm
return distance;
}
void loop() {
int moisture = analogRead(MOISTURE_SENSOR);
Serial.print("Moisture Level: ");
Serial.println(moisture);
int chk = DHT.read11(DHTPIN);
float humidity = DHT.humidity;
float waterDistance = measureDistance();
lcd.setCursor(0, 0);
lcd.print("Moist: ");
lcd.print(moisture);
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(waterDistance);
lcd.print("cm");
delay(2000);
if (moisture > 600) { // Critical water level
digitalWrite(RELAY, LOW); // Stop Pump
digitalWrite(YELLOW_LED, LOW); // Yellow LED OFF
digitalWrite(RED_LED, HIGH); // Red LED ON
digitalWrite(GREEN_LED, LOW);
tone(BUZZER, 1000); // Buzzer ON
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Critical Water!");
lcd.setCursor(0, 1);
lcd.print("Pump Activated!");
}
else if (moisture > 500) { // Water detected, pump ON
digitalWrite(RELAY, HIGH);
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
tone(BUZZER, 1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Detected!");
lcd.setCursor(0, 1);
lcd.print("Pumping Water...");
}
else if (moisture == 0) { // No moisture, green LED ON
digitalWrite(RELAY, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
noTone(BUZZER);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("No Water");
lcd.setCursor(0, 1);
lcd.print("System Normal");
}
else if (moisture <= 400) { // Low moisture, red LED ON
digitalWrite(RELAY, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
noTone(BUZZER);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Low Moisture!");
lcd.setCursor(0, 1);
lcd.print("Alert Mode ON");
}
else { // Normal moisture condition (400 < moisture ≤ 500)
digitalWrite(RELAY, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
noTone(BUZZER);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Moisture OK");
lcd.setCursor(0, 1);
lcd.print("System Normal");
}
delay(2000);
}