#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define trigPin 9
#define echoPin 10
#define relayPin 8
#define ledOn 6
#define ledOff 7
// Parameter tangki
#define TANK_HEIGHT_CM 200 // tinggi 2 meter = 200cm
#define BASE_AREA_CM2 40000 // 200cm x 200cm = 40000 cm²
#define FULL_VOLUME_L 8000 // volume total 8.000 liter
#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);
digitalWrite(relayPin, HIGH);
digitalWrite(ledOn, LOW);
digitalWrite(ledOff, HIGH);
lcd.begin();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Water Tank Sys");
lcd.setCursor(0, 1);
lcd.print("Init...");
delay(2000);
Serial.begin(9600);
}
float readDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
void loop() {
float distance = readDistance();
if(distance > TANK_HEIGHT_CM) distance = TANK_HEIGHT_CM;
float waterHeight = TANK_HEIGHT_CM - distance;
float percent = (waterHeight / TANK_HEIGHT_CM) * 100;
// Hitung volume liter
float volume_cm3 = waterHeight * BASE_AREA_CM2;
float volume_liter = volume_cm3 / 1000;
// Kontrol pompa
String statusPompa;
if(percent < MIN_PERCENT) {
digitalWrite(relayPin, LOW);
digitalWrite(ledOn, HIGH);
digitalWrite(ledOff, LOW);
statusPompa = "PUMP: ON ";
} else if(percent > MAX_PERCENT) {
digitalWrite(relayPin, HIGH);
digitalWrite(ledOn, LOW);
digitalWrite(ledOff, HIGH);
statusPompa = "PUMP: OFF";
}
// Serial Monitor
Serial.print("Level: ");
Serial.print(percent);
Serial.print("% | Volume: ");
Serial.print(volume_liter);
Serial.println(" L");
// LCD Display
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Lvl:");
lcd.print(percent,1);
lcd.print("% ");
lcd.print((int)volume_liter);
lcd.print("L");
lcd.setCursor(0,1);
lcd.print(statusPompa);
delay(1000);
}