#include <LiquidCrystal.h>

LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); 
const int sensorLow = 2;  // Pin untuk sensor LOW
const int sensorHigh = 6; // Pin untuk sensor HIGH
const int stop = 7;// Pin untuk indikator emergency
const int pump = 4;       // Pin untuk indikator pompa
const int error = 5;      // Pin untuk indikator error
const int emergency = 3;  // Pin untuk emergency

volatile bool emergencyStop = false;
bool eerroorr = false; 

void setup() {
  pinMode(sensorLow, INPUT);
  pinMode(sensorHigh, INPUT);
  pinMode(emergency, INPUT_PULLUP); 
  pinMode(pump, OUTPUT);
  pinMode(error, OUTPUT);
  pinMode(stop, OUTPUT);
  
  lcd.begin(16, 2); 
  lcd.clear();
  
  attachInterrupt(digitalPinToInterrupt(emergency), EmergencyInterrupt, FALLING);
}

void loop() {
  int memory = 0; 

  int sensorL = digitalRead(sensorLow);
  int sensorH = digitalRead(sensorHigh);

  if (sensorL == LOW && sensorH == LOW) {
    digitalWrite(pump, HIGH);  // Hidupkan pompa
    digitalWrite(error, LOW); // Matikan indikator error
    lcd.clear();
    lcd.print("Pengisian");
    memory = 1; // Set status pengisian
  }
  else if(sensorH == HIGH && sensorL == HIGH) {
    digitalWrite(pump, LOW);   // Matikan pompa
    digitalWrite(error, LOW);  // Matikan indikator error
    lcd.clear();
    lcd.print("Pengosongan");
    memory = 2; // Set status pengosongan
  }
  else if(sensorH == HIGH && sensorL == LOW) {
    digitalWrite(pump, LOW);   // Matikan pompa
    digitalWrite(error, HIGH);  // Hidupkan indikator error
    lcd.clear();
    lcd.print("EROR");
    memory = 3; 
    eerroorr = true; 
  }

  if (eerroorr) {
    if (emergencyStop) {
      digitalWrite(pump, LOW);   
      digitalWrite(error, LOW);
      digitalWrite(stop, HIGH);
      lcd.clear();
      lcd.print("Emergency Stop!");
      while (emergencyStop) {} 
      lcd.clear(); 
      memory = 4; 
    }
  }

  while (digitalRead(sensorL) == HIGH && digitalRead(sensorH) == LOW && memory == 1) {
    digitalWrite(pump, HIGH);
    lcd.clear();
    lcd.print("Pengisian");
  }

  while (digitalRead(sensorH) == HIGH && digitalRead(sensorL) == HIGH && memory == 2) {
    digitalWrite(pump, LOW);
    lcd.clear();
    lcd.print("Pengosongan");
  }
}

void EmergencyInterrupt() {
  emergencyStop = digitalRead(emergency) == LOW && eerroorr; 
}