#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi RTC dan LCD
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C untuk LCD
// Pin untuk buzzer
const int buzzer = 8;
// Pin untuk LED
const int led1 = 9;
const int led2 = 10;
const int led3 = 11;
// Waktu alarm yang ingin diatur (misal: jam 8:30 pagi)
const int alarmHour = 13;
const int alarmMinute = 31;
// Melodi sederhana untuk "Goyang Nasi Padang"
int melody[] = {
262, 294, 330, 349, 392, 440, 494, 523, // Nada dasar (C4 - C5)
262, 330, 294, 262, 330, 294, // Bagian sederhana dari lagu
349, 330, 294, 262, 294, 262, // Lanjutan melodi
};
// Durasi setiap nada (dalam milidetik)
int noteDurations[] = {
4, 4, 4, 4, 4, 4, 4, 4, // Durasi untuk nada dasar
4, 4, 4, 4, 4, 4, // Bagian sederhana dari lagu
4, 4, 4, 4, 4, 4, // Lanjutan durasi melodi
};
void setup() {
// Inisialisasi LCD
lcd.begin(16, 2);
lcd.backlight();
// Inisialisasi RTC
if (!rtc.begin()) {
lcd.print("RTC gagal!");
while (1);
}
if (rtc.lostPower()) {
// Set waktu RTC hanya jika RTC mati (misal setelah diputuskan dari power)
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Inisialisasi buzzer dan LED sebagai output
pinMode(buzzer, OUTPUT);
digitalWrite(buzzer, LOW);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
}
void loop() {
// Mendapatkan waktu saat ini dari RTC
DateTime now = rtc.now();
// Menampilkan waktu di LCD
lcd.setCursor(0, 0);
lcd.print("Waktu: ");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute());
lcd.print(":");
if (now.second() < 10) lcd.print("0");
lcd.print(now.second());
// Menampilkan tanggal di baris kedua
lcd.setCursor(0, 1);
lcd.print(now.day());
lcd.print('/');
lcd.print(now.month());
lcd.print('/');
lcd.print(now.year());
// Cek apakah waktu saat ini sama dengan waktu alarm
if (now.hour() == alarmHour && now.minute() == alarmMinute) {
// Mainkan melodi "Goyang Nasi Padang" jika waktu alarm tercapai
playGoyangNasiPadang();
}
// Efek LED kelap-kelip terus menerus
playDiscoLights();
delay(500); // Update setiap 500 ms
}
// Fungsi untuk memainkan melodi "Goyang Nasi Padang"
void playGoyangNasiPadang() {
for (int thisNote = 0; thisNote < sizeof(melody) / sizeof(int); thisNote++) {
// Hitung durasi note
int noteDuration = 1000 / noteDurations[thisNote];
tone(buzzer, melody[thisNote], noteDuration);
// Beri jeda di antara nada
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// Matikan nada
noTone(buzzer);
}
delay(1000); // Jeda 1 detik setelah memainkan lagu
}
// Fungsi untuk menyalakan lampu LED seperti disko
void playDiscoLights() {
// Nyalakan dan matikan LED secara bergantian untuk efek kelap-kelip
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
delay(90);
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
delay(90);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
delay(90);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
delay(90);
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
delay(90);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
delay(90);
}