#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // Set I2C address and LCD size
int sensorArus = A0; // Set current sensor pin
int sensorTegangan = A1; // Set voltage sensor pin
int sensorPressure1 = A2; // Set pressure sensor pin
int sensorPressure2 = A3; // Set pressure sensor pin
int sensorPressure3 = A5; // Set pressure sensor pin
int sensorWaterFlow = A6; // Set water flow sensor pin
int sensorLoadcell = A7 ; // Set loadcell sensor pin
int pushButton = 2; // Set push button pin
int mode = 1; // Set initial mode (mode 1 = monitoring current and voltage)
void setup()
{
  lcd.init(); // Initialize LCD
  lcd.backlight(); // Turn on backlight
  pinMode(sensorArus, INPUT); // Set current sensor as input
  pinMode(sensorTegangan, INPUT); // Set voltage sensor as input
  pinMode(sensorPressure1, INPUT); // Set pressure sensor as input
  pinMode(sensorPressure2, INPUT); // Set pressure sensor as input
  pinMode(sensorPressure3, INPUT); // Set pressure sensor as input
  pinMode(sensorWaterFlow, INPUT); // Set water flow sensor as input
  pinMode(sensorLoadcell, INPUT); // Set loadcell sensor as input
  pinMode(pushButton, INPUT_PULLUP); // Set push button as input with pull-up resistor
}
void loop()
{
  if (digitalRead(pushButton) == LOW) // If push button is pressed
  {
    lcd.clear();
    mode = (mode == 1) ? 2 : ((mode == 2) ? 3 : 1); // Toggle mode (mode 1 -> mode 2, mode 2 -> mode 3, mode 3 -> mode 1)
    delay(100); // Wait for 100ms to avoid bouncing
  }
  if (mode == 1) // Mode monitoring current and voltage
  {
    float arus = analogRead(sensorArus); // Read current sensor
    float tegangan = analogRead(sensorTegangan); // Read voltage sensor
    float teganganVolt = tegangan * (5.0 / 1023.0); // Convert analog value to voltage
    float arusAmpere = teganganVolt / 0.185; // Convert voltage value to current in amperes
    lcd.setCursor(0, 0); // Move to line 1, column 1
    lcd.print("Arus: "); // Display label "Arus: "
    lcd.print(arusAmpere); // Display current value in amperes
    lcd.print("A"); // Display unit "A"
    lcd.setCursor(0, 1); // Move to line 2, column 1
    lcd.print("Tegangan: "); // Display label "Tegangan: "
    lcd.print(teganganVolt); // Display voltage value in volts
    lcd.print("V"); // Display unit "V"
  }
  else if (mode == 2) // Mode monitoring pressure and water flow
  {
    float pressure = analogRead(sensorPressure1); // Read pressure sensor
    float waterFlow = analogRead(sensorWaterFlow); // Read water flow sensor
    float pressurePsi = pressure * (5.0 / 1023.0) * 30; // Convert analog value to psi
    float waterFlowLpm = waterFlow * (5.0 / 1023.0) * 6; // Convert analog value to LPM
    lcd.setCursor(0, 0); // Move to line 1, column 1
    lcd.print("P.Air In:  "); // Display label "Pressure: "
    lcd.print(pressurePsi); // Display pressure value in psi
    lcd.print(" Psi");
    lcd.setCursor(0, 1); // Move to line 1, column 1
    lcd.print("P.Runner:  "); // Display label "Pressure: "
    lcd.print(pressurePsi); // Display pressure value in psi
    lcd.print(" Psi");
    lcd.setCursor(0, 2); // Move to line 1, column 1
    lcd.print("P.Air Out: "); // Display label "Pressure: "
    lcd.print(pressurePsi); // Display pressure value in psi
    lcd.print(" Psi");
    lcd.setCursor(0, 3); // Move to line 2, column 1
    lcd.print("Water Flow:"); // Display label "Water Flow: "
    lcd.print(waterFlowLpm); // Display water flow value in LPM
    lcd.print(" m/s"); // Display unit "LPM"
}
  else if (mode == 3) // Mode monitoring loadcell
  {
    float loadcell = analogRead(sensorLoadcell); // Read loadcell sensor
    float loadcellWeight = loadcell * (5.0 / 1023.0) * 50; // Convert analog value to weight in kg
    lcd.setCursor(0, 0); // Move to line 1, column 1
    lcd.print("Loadcell: "); // Display label "Loadcell: "
    lcd.print(loadcellWeight); // Display loadcell value in kg
    lcd.print(" Kg"); // Display unit "kg"
    
  }
}