#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi RTC dan LCD I2C
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int pirPin = 5; // Pin untuk sensor PIR
const int ledPin = 4; // Pin untuk LED
const int buzzerPin = 3; // Pin untuk buzzer
int startHour = 11; // Jam mulai aktif PIR
int startMinute = 34; // Menit mulai aktif PIR
int endHour = 12; // Jam selesai aktif PIR
int endMinute = 00; // Menit selesai aktif PIR
void setup() {
// Inisialisasi pin
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// Inisialisasi LCD I2C
lcd.init();
lcd.backlight();
Serial.begin(9600);
lcd.print("Initializing...");
// Cek koneksi RTC
if (!rtc.begin()) {
lcd.clear();
lcd.print("RTC Not Found");
while (1); // Berhenti jika RTC tidak terdeteksi
}
// Jika RTC kehilangan daya, set waktu ulang
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Set waktu RTC sesuai waktu compile
}
lcd.clear();
lcd.print("System Ready");
delay(2000);
}
void loop() {
DateTime now = rtc.now(); // Ambil waktu sekarang dari RTC
int currentHour = now.hour();
int currentMinute = now.minute();
int currentSecond = now.second();
// Tampilkan waktu saat ini di LCD
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(currentHour);
lcd.print(":");
if (currentMinute < 10) lcd.print("0"); // Tambahkan nol di depan jika kurang dari 10
lcd.print(currentMinute);
lcd.print(":");
if (currentSecond < 10) lcd.print("0"); // Tambahkan nol di depan jika kurang dari 10
lcd.print(currentSecond);
// Cek waktu (startHour:startMinute - endHour:endMinute)
if ((currentHour > startHour || (currentHour == startHour && currentMinute >= startMinute)) &&
(currentHour < endHour || (currentHour == endHour && currentMinute <= endMinute))) {
int pirState = digitalRead(pirPin);
if (pirState == HIGH) {
lcd.setCursor(0, 1);
lcd.print("Ada Maling!!! "); // Tambahkan spasi untuk menghapus teks lama
digitalWrite(ledPin, HIGH);
tone(buzzerPin, 1000); // Bunyi buzzer dengan frekuensi 1000Hz
} else {
lcd.setCursor(0, 1);
lcd.print("Sistem Aktif "); // Tambahkan spasi untuk menghapus teks lama
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
}
} else {
// Waktu di luar startHour:startMinute - endHour:endMinute, matikan semua
lcd.setCursor(0, 1);
lcd.print("Pir Tidak Aktif "); // Tambahkan spasi untuk menghapus teks lama
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
}
delay(1000); // Delay untuk stabilitas (jangan clear LCD)
}