//Float Switches
// int L3 = 7; //highest
int L2 = 9;
int L1 = 10;
int L0 = 12; // lowest
int percentage;

//Led Indicators
int ledG = 8;
int ledY = 7;
int ledR = 6;

//OTHER
int relay = 2;
int mode = 11; // spst switch
int startStop = 4;  //push-pull
int dryRun = 5; //float switch
//bool state;
bool pump, isDry;
//-------------------------------------------------

void setup()
{
  Serial.begin(9600);

  //float switch
  // pinMode(L3, INPUT_PULLUP);
  pinMode(L2, INPUT_PULLUP);
  pinMode(L1, INPUT_PULLUP);
  pinMode(L0, INPUT_PULLUP);

  pinMode(ledG, OUTPUT);
  pinMode(ledY, OUTPUT);
  pinMode(ledR, OUTPUT);
  pinMode(relay, OUTPUT);
  pinMode(mode, INPUT_PULLUP);
  pinMode(startStop, INPUT_PULLUP);
  pinMode(dryRun, INPUT_PULLUP);

  percentage = 101; //safety
}
void loop()
{
  //level check
  if(!digitalRead(L2) & !digitalRead(L1) & !digitalRead(L0)){
    percentage = 100;
  }
  else if(digitalRead(L2) & !digitalRead(L1) & !digitalRead(L0)){
    percentage = 50;
  }
  else if(digitalRead(L2) & digitalRead(L1) & !digitalRead(L0)){
    percentage = 25;
  }
  else if(digitalRead(L2) & digitalRead(L1) & digitalRead(L0)){
    percentage = 5;
  }
  else{
    percentage = 101; //safety
    pump = 0;
  }

  //Indicator
  if(!pump & percentage ==  100){
    digitalWrite(ledG, HIGH);
    digitalWrite(ledY, LOW);
    digitalWrite(ledR, LOW);
  }else if(!pump & percentage ==  50){
    digitalWrite(ledG, LOW);
    digitalWrite(ledY, HIGH);
    digitalWrite(ledR, LOW);
  }else if(!pump & percentage ==  25){
    digitalWrite(ledG, LOW);
    digitalWrite(ledY, LOW);
    digitalWrite(ledR, HIGH);
  }else if(!pump & percentage ==  5){
    digitalWrite(ledG, LOW);
    digitalWrite(ledY, LOW);
    digitalWrite(ledR, HIGH);
  }
  
  else if(pump & percentage ==  100){// blink effect when pump ON
    digitalWrite(ledG, HIGH);
    delay(500);
    digitalWrite(ledG, LOW);
    digitalWrite(ledY, HIGH);
    digitalWrite(ledR, HIGH);
  }else if(pump & percentage ==  50){ 
    digitalWrite(ledG, LOW);
    digitalWrite(ledY, HIGH);
    delay(500);
    digitalWrite(ledY, LOW);
    digitalWrite(ledR, HIGH);
  }else if(pump & percentage ==  25){ 
    digitalWrite(ledG, LOW);
    digitalWrite(ledY, LOW);
    digitalWrite(ledR, HIGH);
    delay(500);
    digitalWrite(ledR, LOW);
  }else if(pump & percentage ==  5){ 
    digitalWrite(ledG, LOW);
    digitalWrite(ledY, LOW);
    digitalWrite(ledR, HIGH);
    delay(500);
    digitalWrite(ledR, LOW);
  }
  

  //AUTO
  if (digitalRead(mode) & percentage == 5) {
    pump = 1;
  }
  if (percentage == 100) {
    pump = 0;
  }

  //MANUAL
  if (!digitalRead(mode) & !digitalRead(startStop)) {
    pump = !pump;
  }
  while (!digitalRead(startStop)) { // to make toggle perfect
    delay(50);
  }

  //(*)Dry Run protection
  if ((pump == 1) & digitalRead(dryRun)) {
    delay(5000);
    pump = 0;
    isDry = !isDry; // step 1 to run motor only once till next digitalRead(!dryRun) and avoid repeated ON/OFF;
  }else {
    isDry = 0;
  }

  //(*)control point (isDry case)
  if (isDry) {
    digitalWrite(relay, 1);
    delay(5000);
    digitalWrite(relay, 0);
    isDry = 1; // step 2 to run motor only once till next digitalRead(!dryRun) and avoid repeated ON/OFF;
  } else {
    isDry = 1; // step 2 to run motor only once till next digitalRead(!dryRun) and avoid repeated ON/OFF;
  }

  //control point
  digitalWrite(relay, pump);

  delay(500);
}

//NOTE:: (*) do Dry-run the code for "dryRun" and "isDry" cases.
NOCOMNCVCCGNDINLED1PWRRelay Module