#include <Wire.h> // Library untuk komunikasi I2C
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C 20x4
#define LDR_PIN A0 // Pin input sensor cahaya
#define PIR_PIN 6 // Pin input sensor gerakan
#define RELAY_PIN 9 // Pin output relay (mengontrol LED/lampu)
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C dan ukuran LCD 20x4
bool lastLampState = false; // Status terakhir lampu
unsigned long lampOffDelay = 5000; // Waktu tunda 5 detik untuk mematikan lampu
unsigned long lastMotionTime = 0; // Menyimpan waktu terakhir gerakan terdeteksi
void setup() {
pinMode(LDR_PIN, INPUT); // Set pin LDR sebagai input
pinMode(PIR_PIN, INPUT); // Set pin PIR sebagai input
pinMode(RELAY_PIN, OUTPUT); // Set pin relay sebagai output
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Nyalakan backlight LCD
lcd.setCursor(0, 1); // Atur posisi kursor di baris ke-2 kolom pertama
lcd.print(" Smart Lamp "); // Tampilkan judul (spasi untuk di tengah)
delay(3000); // Tunda selama 3 detik
lcd.clear(); // Bersihkan layar
}
void loop() {
int ADCValue = analogRead(LDR_PIN); // Baca nilai ADC dari LDR (0–1023)
bool isDark = ADCValue > 500; // Ambang batas gelap
bool motionDetected = digitalRead(PIR_PIN) == HIGH; // Baca status PIR, HIGH = gerakan
// Jika gelap atau gerakan terdeteksi, hidupkan lampu
if (isDark || motionDetected) {
digitalWrite(RELAY_PIN, HIGH);
lastLampState = true;
if (motionDetected) {
lastMotionTime = millis(); // Perbarui waktu terakhir gerakan
}
} else {
// Jika tidak ada gerakan dan tidak gelap, cek apakah waktu tunda sudah lewat
if (lastLampState && (millis() - lastMotionTime >= lampOffDelay)) {
digitalWrite(RELAY_PIN, LOW);
lastLampState = false;
}
}
// Tampilkan status cahaya di LCD baris 1
lcd.setCursor(0, 0);
lcd.print("Cahaya : ");
lcd.print(isDark ? "Redup " : "Terang");
// Tampilkan status gerakan di LCD baris 2
lcd.setCursor(0, 1);
lcd.print("Gerakan : ");
lcd.print(motionDetected ? "Terdeteksi" : "Tidak Ada ");
// Tampilkan status lampu di LCD baris 3
lcd.setCursor(0, 2);
lcd.print("Lampu : ");
lcd.print((lastLampState || isDark) ? "ON " : "OFF");
// Tampilkan nilai ADC dari LDR di LCD baris 4
lcd.setCursor(0, 3);
lcd.print("Nilai ADC: ");
lcd.print(ADCValue);
lcd.print(" "); // Hapus sisa angka (jika nilai sebelumnya lebih panjang)
delay(200); // Delay pembacaan sensor dan refresh LCD
}