#include <LiquidCrystal_I2C.h>
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
#define TRIG_PIN 2
#define ECHO_PIN 3
#define RELAY_PIN 13
#define AUTO_MANUAL_SWITCH_PIN 11
#define MANUAL_SWITCH_PIN 10
#define START_PUMP_RANGE 35
#define STOP_PUMP_RANGE 88
#define DELAY_TIME 2000
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(AUTO_MANUAL_SWITCH_PIN, INPUT_PULLUP);
pinMode(MANUAL_SWITCH_PIN, INPUT_PULLUP);
digitalWrite(RELAY_PIN, LOW);
lcd.begin(LCD_COLUMNS, LCD_ROWS);
lcd.print("GOD IS MY LIGHT");
delay(2000);
lcd.clear();
}
void loop() {
int distance = getDistance();
int waterLevel = map(distance, START_PUMP_RANGE, STOP_PUMP_RANGE, 0, 100);
if (digitalRead(AUTO_MANUAL_SWITCH_PIN) == HIGH) {
lcd.setCursor(0, 0);
lcd.print("Auto ");
if (distance < START_PUMP_RANGE) {
lcd.setCursor(0, 1);
lcd.print("Pump ON ");
digitalWrite(RELAY_PIN, HIGH);
delay(DELAY_TIME);
} else if (distance > STOP_PUMP_RANGE) {
lcd.setCursor(0, 1);
lcd.print("Pump OFF ");
digitalWrite(RELAY_PIN, LOW);
delay(DELAY_TIME);
}
} else {
lcd.setCursor(0, 0);
lcd.print("Manual ");
if (digitalRead(MANUAL_SWITCH_PIN) == HIGH) {
lcd.setCursor(0, 1);
lcd.print("Pump ON ");
digitalWrite(RELAY_PIN, HIGH);
} else {
lcd.setCursor(0, 1);
lcd.print("Pump OFF ");
digitalWrite(RELAY_PIN, LOW);
}
}
lcd.setCursor(8, 0);
lcd.print("Lvl: " + String(waterLevel) + "%");
}
int getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = (duration * 0.0343) / 2;
return distance;
}