// Define pins for sensors and LEDs
const int UG_TANK_SENSOR_PIN = 2;
const int UPPER_TANK_SENSOR_PIN1 = 3;
const int UPPER_TANK_SENSOR_PIN2 = 4;
const int UPPER_TANK_SENSOR_PIN3 = 5;
const int UPPER_TANK_SENSOR_PIN4 = 6;
const int UPPER_TANK_SENSOR_PIN5 = 7;
const int LED_PIN1 = 8;
const int LED_PIN2 = 9;
const int LED_PIN3 = 10;
const int LED_PIN4 = 11;
const int LED_PIN5 = 12;
const int RELAY_PIN = 13;
// State variable to track motor operation
bool motorRunning = false;
// LED class definition
class LED {
public:
LED(int pin) : pin(pin) {
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW); // Ensure the LED is off initially
}
void turnOn() {
digitalWrite(pin, HIGH);
}
void turnOff() {
digitalWrite(pin, LOW);
}
private:
int pin;
};
// Tank class definition
class Tank {
public:
Tank(int sensorPin1, int sensorPin2, int sensorPin3, int sensorPin4, int sensorPin5,
LED& led1, LED& led2, LED& led3, LED& led4, LED& led5)
: sensorPin1(sensorPin1), sensorPin2(sensorPin2), sensorPin3(sensorPin3),
sensorPin4(sensorPin4), sensorPin5(sensorPin5),
led1(led1), led2(led2), led3(led3), led4(led4), led5(led5) {
pinMode(sensorPin1, INPUT_PULLUP);
pinMode(sensorPin2, INPUT_PULLUP);
pinMode(sensorPin3, INPUT_PULLUP);
pinMode(sensorPin4, INPUT_PULLUP);
pinMode(sensorPin5, INPUT_PULLUP);
}
void readStates() {
sensorState1 = !digitalRead(sensorPin1); // Inverted logic
sensorState2 = !digitalRead(sensorPin2);
sensorState3 = !digitalRead(sensorPin3);
sensorState4 = !digitalRead(sensorPin4);
sensorState5 = !digitalRead(sensorPin5);
if (sensorState1) led1.turnOn(); else led1.turnOff();
if (sensorState2) led2.turnOn(); else led2.turnOff();
if (sensorState3) led3.turnOn(); else led3.turnOff();
if (sensorState4) led4.turnOn(); else led4.turnOff();
if (sensorState5) led5.turnOn(); else led5.turnOff();
}
int getLevel() const {
if (sensorState5) return 5;
if (sensorState4) return 4;
if (sensorState3) return 3;
if (sensorState2) return 2;
if (sensorState1) return 1;
return 0; // Return 0 if no sensors are triggered
}
bool needRefill() const {
return getLevel() < 3;
}
bool isFull() const {
return getLevel() == 5;
}
private:
int sensorPin1, sensorPin2, sensorPin3, sensorPin4, sensorPin5;
bool sensorState1, sensorState2, sensorState3, sensorState4, sensorState5;
LED& led1, led2, led3, led4, led5;
};
// Motor class definition
class Motor {
public:
Motor(int relayPin) : relayPin(relayPin) {
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW); // Ensure the pump is off initially
}
void turnOn() {
digitalWrite(relayPin, HIGH);
// Serial.println("Motor turned on");
}
void turnOff() {
digitalWrite(relayPin, LOW);
// Serial.println("Motor turned off");
}
private:
int relayPin;
};
// Define LEDs
LED led1(LED_PIN1);
LED led2(LED_PIN2);
LED led3(LED_PIN3);
LED led4(LED_PIN4);
LED led5(LED_PIN5);
// Define upper tank and motor
Tank upperTank(UPPER_TANK_SENSOR_PIN1, UPPER_TANK_SENSOR_PIN2, UPPER_TANK_SENSOR_PIN3,
UPPER_TANK_SENSOR_PIN4, UPPER_TANK_SENSOR_PIN5,
led1, led2, led3, led4, led5);
Motor waterPump(RELAY_PIN);
void setup() {
pinMode(UG_TANK_SENSOR_PIN, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
// Read the state of the underground tank sensor
bool ugTankState = !digitalRead(UG_TANK_SENSOR_PIN); // Inverted logic
// Read the states of the upper tank sensors
upperTank.readStates();
// Control the water pump based on sensor states
if (ugTankState) {
if (upperTank.needRefill() && !motorRunning) {
motorRunning = true;
waterPump.turnOn();
}
if (upperTank.isFull() && motorRunning) {
motorRunning = false;
waterPump.turnOff();
}
} else {
waterPump.turnOff(); // Turn off the pump if the underground tank is empty
motorRunning = false;
}
// Add a short delay to avoid bouncing issues
delay(500);
}