#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD: 0x27 (ubah ke 0x3F jika tidak muncul)
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define trigPin 9
#define echoPin 10
#define relayPin 8 // Relay aktif HIGH sekarang
#define ledOn 6 // LED Hijau = Pompa ON
#define ledOff 7 // LED Merah = Pompa OFF
// Parameter tangki
#define TANK_HEIGHT_CM 200
#define BASE_AREA_CM2 40000
#define FULL_VOLUME_L 8000
#define MIN_PERCENT 30
#define MAX_PERCENT 90
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(relayPin, OUTPUT);
pinMode(ledOn, OUTPUT);
pinMode(ledOff, OUTPUT);
// Mulai: Pompa OFF
digitalWrite(relayPin, LOW);
digitalWrite(ledOn, LOW);
digitalWrite(ledOff, HIGH);
lcd.init();
lcd.begin(16, 2);
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Water Tank Sys");
lcd.setCursor(0,1);
lcd.print("Starting...");
delay(2000);
Serial.begin(9600);
}
float readDistanceCM() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2;
}
void loop() {
float distance = readDistanceCM();
if(distance > TANK_HEIGHT_CM) distance = TANK_HEIGHT_CM;
float waterHeight = TANK_HEIGHT_CM - distance;
float percent = (waterHeight / TANK_HEIGHT_CM) * 100;
float volume_liters = (waterHeight * BASE_AREA_CM2) / 1000.0;
String statusPompa;
// ---- Kontrol pompa dengan relay ON = pompa ON ----
if(percent < MIN_PERCENT) {
digitalWrite(relayPin, HIGH); // Pompa ON
digitalWrite(ledOn, HIGH);
digitalWrite(ledOff, LOW);
statusPompa = "PUMP: ON ";
}
else if(percent > MAX_PERCENT) {
digitalWrite(relayPin, LOW); // Pompa OFF
digitalWrite(ledOn, LOW);
digitalWrite(ledOff, HIGH);
statusPompa = "PUMP: OFF";
}
// ---- Serial Debug ----
Serial.print("Level: ");
Serial.print(percent,1);
Serial.print("% | Volume: ");
Serial.print(volume_liters);
Serial.println(" L");
// ---- LCD Display ----
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Lvl:");
lcd.print(percent,1);
lcd.print("% ");
lcd.print((int)volume_liters);
lcd.print("L");
lcd.setCursor(0,1);
lcd.print(statusPompa);
delay(1000);
}