#include <WiFi.h>
#include "LiquidCrystal_I2C.h"

#define PIN_TRIG 2
#define PIN_ECHO 15
#define PIN_RELAY 4


// Build with Love Muhammad Fauzan
LiquidCrystal_I2C LCD(0x27, 20, 4);

void setup() {
  Serial.begin(9600);
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECHO, INPUT);
  pinMode(PIN_RELAY, OUTPUT);
  LCD.init();
  LCD.backlight();
  digitalWrite(PIN_RELAY, HIGH);
}

void loop() {
  /** 
    Acceptance Criteria :
    1. Panjang tandon dan jarak sensor HCSR04 ke dasar tandon adalah 50 cm
    2. Maksimal ketinggian tandon yang bisa diisi air 40 cm 
    3. Pompa akan hidup/bekerja hanya ketika ketinggian air di tandon 
        kecil atau sama dengan 10 cm saja, dan berhenti ketika ketinggian air di 40cm
  */
  
  digitalWrite(PIN_RELAY, LOW);
  LCD.setCursor(0, 1);LCD.print("Pompa  : ");
  LCD.setCursor(8, 1);LCD.print("NON_ACTIVE");
  // ketika ketinggian air sudah dibawah atau sama dengan 10 cm
  while(get_ketinggian_air()<=10){
    // nyalakan pompa sampai ketinggian air meksimal 40 cm
    digitalWrite(PIN_RELAY, HIGH);
    LCD.setCursor(0, 1);LCD.print("Pompa  : ");
    LCD.setCursor(8, 1);LCD.print("ACTIVE");  
    // jika ketinggian air sudah 40 cm  maka matikan pompa
    if(get_ketinggian_air()>=40){
      LCD.clear();
      break; // keluar dari while
    }
  }
}

// menghitung ketinggian air berdasarkan nilai sensor jarak 
int get_ketinggian_air(){
  // ketinggian air = tingi toren - dengan jarak yang dibaca HCSR04
  int ketinggian = 50-get_distance();
  ketinggian<=0 ? ketinggian= 0 : ketinggian; // ternary operator
  LCD.setCursor(0, 0);LCD.print("Air    : ");
  LCD.setCursor(8, 0);LCD.print(ketinggian);
  LCD.setCursor(15, 0);LCD.print("cm");
  return ketinggian;
}

// membaca nilai sesnsor jarak
int get_distance(){
  digitalWrite(PIN_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(PIN_TRIG, LOW);
  int duration = pulseIn(PIN_ECHO, HIGH);
  int distance = duration / 58;
  delay(1000);
  LCD.clear();
  return distance;
}
NOCOMNCVCCGNDINLED1PWRRelay Module