#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Konfigurasi LCD (Alamat 0x27 atau 0x3F)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definisi Pin Sensor
const int pinPIR = 13;
const int pinIR = 12;
const int pinMag = 14;
// Definisi Pin RGB LED
const int pinR = 27;
const int pinG = 26;
const int pinB = 25;
void setup() {
Serial.begin(115200);
// Setup Pin Mode
pinMode(pinPIR, INPUT);
pinMode(pinIR, INPUT);
pinMode(pinMag, INPUT_PULLUP); // Biasanya menggunakan pullup untuk magnetic switch
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Sistem Aktif...");
delay(2000);
lcd.clear();
}
void loop() {
// Baca Status Sensor
int statusPIR = digitalRead(pinPIR);
int statusIR = digitalRead(pinIR);
int statusMag = digitalRead(pinMag);
// Logika Output Berdasarkan Sensor
lcd.setCursor(0, 0);
if (statusPIR == HIGH) {
// Gerakan terdeteksi - LED Merah
updateOutput("Ada Gerakan!", 255, 0, 0);
}
else if (statusIR == LOW) { // Sensor IR biasanya LOW saat ada halangan
// Objek dekat - LED Biru
updateOutput("Objek Terdeteksi", 0, 0, 255);
}
else if (statusMag == HIGH) { // Terbuka jika menggunakan PULLUP
// Pintu/Jendela Terbuka - LED Kuning (R+G)
updateOutput("Pintu Terbuka!", 255, 255, 0);
}
else {
// Kondisi Aman - LED Hijau
updateOutput("Kondisi Aman", 0, 255, 0);
}
delay(200); // Delay singkat untuk stabilitas pembacaan
}
// Fungsi pembantu untuk update LCD dan Warna LED
void updateOutput(String pesan, int r, int g, int b) {
lcd.setCursor(0, 0);
lcd.print("Status: "); // Clear baris pertama
lcd.setCursor(0, 1);
lcd.print(pesan + " "); // Tambah spasi untuk clear sisa karakter
analogWrite(pinR, r);
analogWrite(pinG, g);
analogWrite(pinB, b);
}