#include <EEPROM.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
const int numAreas = 3; // Define the number of areas
long durations[numAreas];
int set_vals[numAreas], percentages[numAreas], priorities[numAreas] = {1, 2, 3};
bool state;
bool pumps[numAreas];
int priorityThreshold = 30; // Adjust this threshold according to priority levels
int switchPin = 10; // Pin connected to the slide switch
int potPin = A0; // Pin connected to the slide potentiometer
int pumpPin = 12; // Pin connected to the pump relay
void setup() {
lcd.begin(16, 2);
lcd.print("WATER LEVEL:");
lcd.setCursor(0, 1);
lcd.print("PUMP:OFF MANUAL");
for (int i = 0; i < numAreas; i++) {
set_vals[i] = EEPROM.read(i);
if (set_vals[i] > 150) set_vals[i] = 150;
}
pinMode(8, OUTPUT);
pinMode(9, INPUT);
pinMode(switchPin, INPUT_PULLUP); // Set the slide switch pin as input with internal pull-up resistor
pinMode(pumpPin, OUTPUT); // Set the pump pin as output
}
void loop() {
long inches; // Declare inches variable within loop
for (int i = 0; i < numAreas; i++) {
digitalWrite(3, LOW);
delayMicroseconds(2);
digitalWrite(8, HIGH);
delayMicroseconds(10);
digitalWrite(8, LOW);
durations[i] = pulseIn(9, HIGH);
inches = microsecondsToInches(durations[i]); // Move declaration here
percentages[i] = (set_vals[i] - inches) * 100 / set_vals[i];
// Adjust pump based on water level and priority
if (percentages[i] < priorityThreshold && digitalRead(switchPin)) {
pumps[i] = true;
} else if (percentages[i] > 99) {
pumps[i] = false;
}
digitalWrite(pumpPin, !pumps[i]);
lcd.setCursor(5 + i * 6, 1);
if (pumps[i]) lcd.print("ON ");
else lcd.print("OFF");
}
lcd.setCursor(0, 0);
lcd.print(" "); // Clear previous percentage values
for (int i = 0; i < numAreas; i++) {
lcd.setCursor(i * 6, 0);
lcd.print(percentages[i]);
lcd.print("% ");
}
lcd.setCursor(9, 1);
if (!digitalRead(switchPin)) lcd.print("MANUAL");
else lcd.print("AUTO ");
// Handle button presses
if (!digitalRead(potPin) && !state && digitalRead(switchPin)) {
state = true;
for (int i = 0; i < numAreas; i++) {
set_vals[i] = inches;
EEPROM.write(i, set_vals[i]);
}
} else if (!digitalRead(potPin) && !state && !digitalRead(switchPin)) {
state = true;
for (int i = 0; i < numAreas; i++) {
pumps[i] = !pumps[i];
}
} else if (digitalRead(potPin)) {
state = false;
}
delay(500);
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}