#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD
int pirPin = 7;
int ledPin = 6;
int buzzerPin = 4; // Ubah dari pin 5 ke pin 4 untuk hindari konflik timer
int redPin = 9;
int greenPin = 10;
int bluePin = 11;
bool motionDetected = false;
unsigned long lastMotionTime = 0;
unsigned long motionDuration = 2000; // 2 detik setelah gerakan, alarm tetap menyala
void setup() {
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.backlight();
setRGB(0, 0, 255); // Standby warna biru
lcd.setCursor(0, 0);
lcd.print("Kalibrasi...");
delay(3000);
lcd.clear();
lcd.print("Sensor aktif");
Serial.println("Sensor aktif");
setRGB(0, 255, 0); // Hijau = aman
}
void loop() {
int motion = digitalRead(pirPin);
if (motion == HIGH) {
motionDetected = true;
lastMotionTime = millis();
digitalWrite(ledPin, HIGH);
for (int i = 1000; i <= 2000; i += 50) {
tone(buzzerPin, i);
delay(10);
}
for (int i = 2000; i >= 1000; i -= 50) {
tone(buzzerPin, i);
delay(10);
}
setRGB(255, 0, 0); // Merah = gerakan
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gerakan");
lcd.setCursor(0, 1);
lcd.print("Terdeteksi!!");
Serial.println("Gerakan terdeteksi!");
}
if (motionDetected && millis() - lastMotionTime > motionDuration) {
motionDetected = false;
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
setRGB(0, 255, 0); // Hijau = aman kembali
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tidak ada");
lcd.setCursor(0, 1);
lcd.print("gerakan");
}
delay(100);
}
void setRGB(int r, int g, int b) {
analogWrite(redPin, r);
analogWrite(greenPin, g);
analogWrite(bluePin, b);
}