#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Inisialisasi objek RTC DS1307
RTC_DS1307 rtc;
// Inisialisasi objek LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Inisialisasi objek Servo
Servo myServo;
// Variabel alarm
int alarmHour = 12; // Jam alarm (format 24 jam)
int alarmMinute = 56; // Menit alarm
// Pin
const int buzzerPin = 8;
const int servoPin = 9;
void setup() {
// Mulai komunikasi serial
Serial.begin(9600);
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("Tidak dapat menemukan RTC");
while (1);
}
// Set RTC jika belum diatur (hanya dilakukan satu kali)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Inisialisasi LCD
lcd.begin(16, 2);
lcd.print("Clock Alarm");
// Inisialisasi Buzzer
pinMode(buzzerPin, OUTPUT);
// Inisialisasi Servo
myServo.attach(servoPin);
delay(2000); // Menunggu selama 2 detik
}
void loop() {
DateTime now = rtc.now(); // Ambil waktu sekarang dari RTC
// Tampilkan waktu di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(now.hour(), DEC);
lcd.print(":");
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute(), DEC);
lcd.print(":");
if (now.second() < 10) lcd.print("0");
lcd.print(now.second(), DEC);
// Periksa apakah waktunya alarm
if (now.hour() == alarmHour && now.minute() == alarmMinute) {
triggerAlarm();
}
delay(1000); // Tunggu 1 detik sebelum perulangan berikutnya
}
void triggerAlarm() {
// Nyalakan buzzer
digitalWrite(buzzerPin, HIGH);
delay(1000); // Bunyi selama 1 detik
digitalWrite(buzzerPin, LOW);
// Gerakkan servo 10 kali
for (int i = 0; i < 10; i++) {
myServo.write(180); // Gerakkan servo ke posisi 180 derajat
delay(1500); // Tahan 0.5 detik
myServo.write(0); // Kembali ke posisi awal (0 derajat)
delay(1500); // Tahan 0.5 detik
}
// Matikan buzzer setelah alarm selesai
delay(2000); // Tunggu 2 detik setelah alarm selesai sebelum menampilkan waktu lagi
}