#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h>
#define MOISTURE_SENSOR_PIN 36 // Pin connected to moisture sensor
#define BUZZER_PIN 18 // Pin connected to buzzer
#define LED_PIN 2 // Pin connected to LED
#define BUTTON_PIN 19 // Pin connected to button
#define TRIGGER_PIN 26 // Ultrasonic sensor trigger pin
#define ECHO_PIN 25 // Ultrasonic sensor echo pin
#define POTENTIOMETER_PIN 39 // Pin connected to potentiometer
#define MAX_DISTANCE 200 // Max distance for ultrasonic sensor
#define MOTOR_IN1 12 // Motor driver IN1
#define MOTOR_IN2 14 // Motor driver IN2
#define MOTOR_EN 27 // Motor driver ENA
LiquidCrystal_I2C lcd(0x27, 16, 2);
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
bool ledState = false;
const int moistureThresholdHalf = 3850;
const int moistureThresholdFull = 4000;
const int criticalWaterLevel = 30;
unsigned long previousMillis = 0;
const long interval = 1000;
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(MOTOR_IN1, OUTPUT);
pinMode(MOTOR_IN2, OUTPUT);
pinMode(MOTOR_EN, OUTPUT);
lcd.print("Irrigation Sys");
delay(2000);
lcd.clear();
Serial.println("Setup complete");
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
updateSensorsAndDisplay();
previousMillis = currentMillis;
}
// Read potentiometer value and control LED brightness
int potValue = analogRead(POTENTIOMETER_PIN);
int ledBrightness = map(potValue, 0, 4095, 0, 255); // Adjust range for ESP32 ADC
analogWrite(LED_PIN, ledBrightness);
}
void updateSensorsAndDisplay() {
int moistureLevel = analogRead(MOISTURE_SENSOR_PIN);
Serial.print("Moisture Level: ");
Serial.println(moistureLevel);
unsigned int distance = sonar.ping_cm();
Serial.print("Distance: ");
Serial.println(distance);
updateLCD(moistureLevel, distance);
if (moistureLevel > moistureThresholdFull) {
digitalWrite(MOTOR_IN1, HIGH);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(MOTOR_EN, 255);
Serial.println("Water pump ON (Full Speed)");
} else if (moistureLevel > moistureThresholdHalf) {
digitalWrite(MOTOR_IN1, HIGH);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(MOTOR_EN, 128);
Serial.println("Water pump ON (Half Speed)");
} else {
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(MOTOR_EN, 0);
Serial.println("Water pump OFF");
}
if (distance > 0 && distance >= criticalWaterLevel) {
Serial.println("Critical water level detected");
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(BUZZER_PIN, LOW);
}
}
void updateLCD(int moistureLevel, unsigned int distance) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Moisture: ");
lcd.print(moistureLevel);
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(distance);
lcd.print(" cm");
}