#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define TRIG_PIN 9
#define ECHO_PIN 10
#define RELAY_PIN 8 // Relay Aktif LOW
#define BUZZER_PIN 12
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int tankHeightCM = 400; // Tinggi maksimum tangki dalam cm
long duration;
int distance;
int previousLevel = 0;
bool motorOn = false;
unsigned long motorStartTime = 0;
bool waterNotRisingAlert = false;
unsigned long lastAlertTime = 0;
unsigned long alertCooldown = 5000; // Cooldown 5 detik untuk peringatan
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // Matikan relay pada awalnya (Aktif LOW)
digitalWrite(BUZZER_PIN, LOW);
lcd.init();
lcd.backlight();
Serial.begin(9600);
}
void loop() {
// Mengukur level air menggunakan sensor ultrasonik
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2; // cm
// Pastikan jarak valid (misalnya sensor tidak membaca nilai yang tidak realistis)
if (distance <= 2 || distance >= 400) { // Sesuaikan rentang sesuai spesifikasi sensor
distance = 400; // Set default jarak jika tidak valid
}
int waterLevel = tankHeightCM - distance;
if (waterLevel < 0) waterLevel = 0;
if (waterLevel > tankHeightCM) waterLevel = tankHeightCM;
Serial.print("Level Air: ");
Serial.print(waterLevel);
Serial.println(" cm");
// Tentukan apakah motor harus dinyalakan berdasarkan level air
bool motorShouldBeOn = waterLevel < (tankHeightCM / 2);
// Logika kontrol motor
if (motorShouldBeOn) {
digitalWrite(RELAY_PIN, HIGH); // Nyalakan motor (Aktif LOW)
if (!motorOn) {
motorStartTime = millis();
previousLevel = waterLevel;
motorOn = true;
}
// Cek jika level air tidak naik setelah 30 detik
if ((millis() - motorStartTime >= 30000) && (waterLevel <= previousLevel + 2)) {
waterNotRisingAlert = true;
} else {
waterNotRisingAlert = false;
}
} else {
digitalWrite(RELAY_PIN, LOW); // Matikan motor
motorOn = false;
waterNotRisingAlert = false;
}
// Menampilkan informasi di LCD
lcd.setCursor(0, 0);
lcd.print("Air: ");
lcd.print(waterLevel);
lcd.print("cm "); // Menambahkan spasi ekstra untuk menghapus teks lama
lcd.setCursor(0, 1);
if (waterNotRisingAlert) {
lcd.print("PROBLEM "); // Tampilkan pesan masalah di LCD
if (millis() - lastAlertTime >= alertCooldown) {
Serial.println("TIDAK ADA AIR UNTUK DIPOMPA {ATAU} KEBocoran AIR");
tone(BUZZER_PIN, 1000); // Mulai bunyi buzzer
lastAlertTime = millis(); // Perbarui waktu terakhir alert untuk mencegah alert terus menerus
}
} else {
noTone(BUZZER_PIN); // Matikan buzzer
lcd.print(motorShouldBeOn ? "Motor: ON " : "Motor: OFF ");
}
delay(1000); // Jeda 1 detik untuk kestabilan dan pembacaan LCD yang jelas
}