#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definisi pin
#define TRIG_PIN 12
#define ECHO_PIN 25
#define LDR_PIN 15
#define BUZZER_PIN 2
#define LED_LAMPU 13
#define LED_POMPA 14
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C 0x27, LCD 16x2
// Variabel
long duration;
float distance;
int ldrValue;
float lux;
void setup() {
Serial.begin(115200);
// Inisialisasi pin
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_LAMPU, OUTPUT);
pinMode(LED_POMPA, OUTPUT);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.clear();
// Matikan semua output awal
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_LAMPU, LOW);
digitalWrite(LED_POMPA, LOW);
lcd.setCursor(0, 0);
lcd.print("Sistem Siap");
delay(2000);
}
void loop() {
// Baca sensor ultrasonik (level air)
float levelAir = bacaLevelAir();
// Baca sensor cahaya LDR
bacaCahaya();
// Kontrol lampu berdasarkan cahaya
kontrolLampu();
// Kontrol pompa berdasarkan level air
kontrolPompa(levelAir);
// Kontrol alarm
kontrolAlarm(levelAir);
// Tampilkan data di LCD dan Serial Monitor
tampilkanData(levelAir);
delay(1000); // Update setiap 1 detik
}
float bacaLevelAir() {
// Mengirim pulse ultrasonik
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Menerima echo
duration = pulseIn(ECHO_PIN, HIGH);
// Menghitung jarak (level air) dalam cm
// Asumsi: sensor dipasang di atas tangki, jarak ke air = level kosong
distance = duration * 0.034 / 2;
// Konversi ke level air (dalam cm)
// Misal: tinggi tangki 150cm, sensor di atas tangki
float levelAir = 150 - distance; // Asumsi tinggi tangki 150cm
return levelAir;
}
void bacaCahaya() {
ldrValue = analogRead(LDR_PIN);
// Konversi nilai ADC ke lux (approximasi)
// Rumus sederhana: lux = (1023 - analogRead) * 10 / analogRead
// Untuk ESP32 (12-bit ADC): 4095
if (ldrValue > 0) {
lux = (4095.0 - ldrValue) * 1000.0 / ldrValue;
} else {
lux = 0;
}
}
void kontrolLampu() {
if (lux > 1000) {
digitalWrite(LED_LAMPU, LOW); // Lampu OFF
} else if (lux < 100) {
digitalWrite(LED_LAMPU, HIGH); // Lampu ON
}
// Untuk nilai antara 100-1000 lux, pertahankan status sebelumnya
}
void kontrolPompa(float levelAir) {
if (levelAir > 100) {
digitalWrite(LED_POMPA, LOW); // Pompa OFF
} else if (levelAir < 50) {
digitalWrite(LED_POMPA, HIGH); // Pompa ON
}
// Untuk level antara 50-100 cm, pertahankan status sebelumnya
}
void kontrolAlarm(float levelAir) {
if (levelAir > 120 || lux < 10) {
digitalWrite(BUZZER_PIN, HIGH); // Alarm ON
} else {
digitalWrite(BUZZER_PIN, LOW); // Alarm OFF
}
}
void tampilkanData(float levelAir) {
// Tampilkan di Serial Monitor
Serial.print("Level Air: ");
Serial.print(levelAir);
Serial.print(" cm | Cahaya: ");
Serial.print(lux);
Serial.print(" lux | LDR Raw: ");
Serial.println(ldrValue);
Serial.print("L: ");
Serial.print(digitalRead(LED_LAMPU) ? "ON" : "OFF");
Serial.print(" | P: ");
Serial.print(digitalRead(LED_POMPA) ? "ON" : "OFF");
Serial.print(" | A: ");
Serial.println(digitalRead(BUZZER_PIN) ? "ON" : "OFF");
Serial.println("------------------------");
// Tampilkan di LCD
lcd.clear();
// Baris 1: Level Air dan Cahaya
lcd.setCursor(0, 0);
lcd.print("Air:");
lcd.print(levelAir, 0);
lcd.print("cm Lux:");
lcd.print(lux, 0);
// Baris 2: Status Lampu dan Pompa
lcd.setCursor(0, 1);
lcd.print("L:");
lcd.print(digitalRead(LED_LAMPU) ? "ON " : "OFF");
lcd.print(" P:");
lcd.print(digitalRead(LED_POMPA) ? "ON" : "OFF");
lcd.print(" A:");
lcd.print(digitalRead(BUZZER_PIN) ? "ON" : "OFF");
}