#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
// Constants
#define DHTPIN 2
#define DHTTYPE DHT22
#define BUTTON_PIN 7
#define LED_PIN 8
#define SERVO_PIN 9
#define MOISTURE_PIN A0
// Objects
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo waterPumpServo;
int threshold = 500; // Moisture level threshold
bool manualMode = false; // Manual control mode flag
bool isWatering = false; // Watering state flag
void setup() {
// Initialize Serial for debugging
Serial.begin(9600);
// Initialize components
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
waterPumpServo.attach(SERVO_PIN);
lcd.begin(16, 2);
lcd.backlight();
dht.begin();
// Display initial message
lcd.setCursor(0, 0);
lcd.print("Smart Irrigation");
delay(2000);
}
void loop() {
// Check button press for manual mode
if (digitalRead(BUTTON_PIN) == LOW) {
manualMode = !manualMode; // Toggle manual mode
isWatering = !isWatering; // Toggle watering state
delay(300); // Debounce delay
}
lcd.clear();
if (manualMode) {
lcd.setCursor(0, 0);
lcd.print("Manual Mode");
if (isWatering) {
lcd.setCursor(0, 1);
lcd.print("Watering...");
digitalWrite(LED_PIN, HIGH); // Turn on LED
waterPumpServo.write(90); // Turn on pump (move servo)
} else {
lcd.setCursor(0, 1);
lcd.print("No Watering");
digitalWrite(LED_PIN, LOW); // Turn off LED
waterPumpServo.write(0); // Turn off pump (move servo to 0)
}
} else {
// Automatic Mode (based on moisture level)
int moistureLevel = analogRead(MOISTURE_PIN);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
lcd.setCursor(0, 0);
lcd.print("Moisture: ");
lcd.print(moistureLevel);
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C ");
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print("%");
if (moistureLevel < threshold) {
digitalWrite(LED_PIN, HIGH); // Turn on LED
waterPumpServo.write(90); // Turn on pump (move servo)
lcd.setCursor(0, 1);
lcd.print("Watering...");
} else {
digitalWrite(LED_PIN, LOW); // Turn off LED
waterPumpServo.write(0); // Turn off pump (move servo to 0)
lcd.setCursor(0, 1);
lcd.print("No Watering");
}
}
delay(1000); // Wait 1 second
}