#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// Definisi alamat I2C dan ukuran LCD
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
int ldrPin1 = A0; // Pin analog untuk LDR 1
int ldrPin2 = A1; // Pin analog untuk LDR 2
int ledPin1 = 10; // Pin digital untuk LED 1
int ledPin2 = 11; // Pin digital untuk LED 2
int ledPin3 = 12; // Pin digital untuk LED 3
int ldrValue1 = 0; // Variabel untuk menyimpan nilai LDR 1
int ldrValue2 = 0; // Variabel untuk menyimpan nilai LDR 2
int threshold = 100; // Batas ambang untuk LDR
int buzzerPin = 9; // pin digital untuk suara
bool buzzerActive = false; // Status buzzer
void setup() {
// Init LCD
lcd.init();
lcd.backlight();
// Setup untuk LED dan buzzer
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// Setup Serial Monitor
Serial.begin(9600);
// Tampilkan pesan awal
showMessage("Halo Pengguna!", 2000);
showMessage("LDR Monitoring", 2000);
showMessage("Karya Rzxdty", 2000);
}
void loop() {
// Membaca nilai dari kedua LDR
ldrValue1 = analogRead(ldrPin1);
ldrValue2 = analogRead(ldrPin2);
// Menampilkan nilai LDR pada serial monitor
Serial.print("LDR 1: ");
Serial.print(ldrValue1);
Serial.print(" LDR 2: ");
Serial.println(ldrValue2);
// Logika untuk menghidupkan lampu dan buzzer
if (ldrValue1 < threshold && ldrValue2 < threshold) {
// Jika kedua LDR mendeteksi kurang cahaya, hidupkan semua LED
digitalWrite(ledPin1, HIGH); // Nyalakan LED 1
digitalWrite(ledPin2, HIGH); // Nyalakan LED 2
digitalWrite(ledPin3, HIGH); // Nyalakan LED 3
// Jika buzzer belum aktif
if (!buzzerActive) {
buzzerActive = true; // Tandai bahwa buzzer sudah aktif
// Suara pembuka
for (int i = 0; i < 2; i++) { // Mainkan suara pembuka dua kali
tone(buzzerPin, 1500); // Nyalakan buzzer
delay(500); // Tunggu selama 500 ms
noTone(buzzerPin); // Matikan buzzer
delay(500); // Tunggu selama 500 ms
}
}
Serial.println("Lampu: ON"); // Menampilkan status lampu
// Suara berkedip berulang hingga sensor mendeteksi cukup cahaya
tone(buzzerPin, 500); // Nyalakan buzzer
delay(150); // Tunggu selama 500 ms
noTone(buzzerPin); // Matikan buzzer
delay(150);
tone(buzzerPin, 500); // Nyalakan buzzer
delay(150); // Tunggu selama 500 ms
noTone(buzzerPin); // Matikan buzzer
delay(150);
} else {
// Jika salah satu atau kedua LDR mendeteksi cukup cahaya, matikan semua LED
digitalWrite(ledPin1, LOW); // Matikan LED 1
digitalWrite(ledPin2, LOW); // Matikan LED 2
digitalWrite(ledPin3, LOW); // Matikan LED 3
noTone(buzzerPin); // Pastikan buzzer mati jika tidak ada cahaya
buzzerActive = false; // Reset status buzzer
Serial.println("Lampu: OFF"); // Menampilkan status lampu
}
// Tampilkan status LDR dan output di LCD
lcd.setCursor(1, 0); // Set posisi di baris pertama
lcd.print(ldrValue1 < threshold ? "in1=on " : "in1=off ");
lcd.setCursor(9, 0); // Set posisi di baris pertama
lcd.print(ldrValue2 < threshold ? "in2=on " : "in2=off ");
lcd.setCursor(3, 1); // Set posisi di baris kedua
lcd.print((ldrValue1 < threshold && ldrValue2 < threshold) ? "output=on " : "output=off ");
delay(100); // Tunggu 100ms sebelum membaca lagi
}
// Fungsi untuk menampilkan pesan dengan durasi tertentu
void showMessage(const char* message, unsigned long duration) {
lcd.clear(); // Hapus tampilan LCD
lcd.setCursor(0, 0); // Set posisi di baris pertama
lcd.print(message); // Tampilkan pesan
delay(duration); // Tunggu selama durasi yang ditentukan
lcd.clear(); // Hapus tampilan LCD setelah durasi
}