#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h> // Pustaka RTC DS3231
// Inisialisasi LCD dengan alamat I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Inisialisasi RTC DS3231
RTC_DS3231 rtc;
// Definisi nada untuk not musik
#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
// Pin untuk buzzer dan LED
int buzzerPin = 8;
int ledPin1 = 9;
int ledPin2 = 10;
int ledPin3 = 11;
// Notasi musik untuk lagu "Selamat Ulang Tahun" versi Jamrud (disederhanakan)
int melody[] = {
NOTE_C4, NOTE_C4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, // "Selamat ulang tahun..."
NOTE_C5, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4 // "yang ke-sekian kali..."
};
// Durasi notasi musik (dalam satuan milidetik)
int noteDurations[] = {
4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4
};
// Pesan ucapan yang lebih panjang
String message = "Selamat Ulang Tahun syifa! Semoga panjang umur dan sehat selalu!";
void setup() {
// Mengatur pin LED sebagai output
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
// Mengatur pin buzzer sebagai output
pinMode(buzzerPin, OUTPUT);
// Inisialisasi LCD dengan modul I2C
lcd.begin(16, 2);
lcd.backlight(); // Menghidupkan lampu latar LCD
// Inisialisasi RTC DS3231
if (!rtc.begin()) {
lcd.setCursor(0, 0);
lcd.print("RTC gagal");
while (1); // Jika RTC gagal, berhenti
}
// Cek apakah RTC sudah diset, jika tidak set waktu sekarang
if (rtc.lostPower()) {
lcd.setCursor(0, 0);
lcd.print("Set Waktu RTC");
// Set waktu RTC ke waktu sekarang (format: tahun, bulan, hari, jam, menit, detik)
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
delay(2000); // Tampilkan pesan selama 2 detik
}
// Menampilkan pesan pertama kali
lcd.setCursor(0, 0);
lcd.print("HBD FOR SYIFA");
lcd.setCursor(0, 1);
lcd.print("yang ke 22");
delay(2000); // Tampilkan pesan ini selama 2 detik sebelum memulai scroll
}
void loop() {
// Memainkan lagu "Selamat Ulang Tahun" versi Jamrud
for (int thisNote = 0; thisNote < 12; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(buzzerPin, melody[thisNote], noteDuration);
// Menyalakan LED secara bergantian
if (thisNote % 3 == 0) {
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
} else if (thisNote % 3 == 1) {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
} else {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, HIGH);
}
delay(noteDuration); // Menunggu selama nada dimainkan
noTone(buzzerPin); // Matikan buzzer setelah nada dimainkan
// Memberikan jeda antara nada
int pauseBetweenNotes = noteDuration * 0.30;
delay(pauseBetweenNotes);
}
// Mematikan semua LED setelah lagu selesai
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
// Menunggu sebelum mengulang lagi
delay(2000);
// Menampilkan pesan dengan efek scroll
for (int i = 0; i < message.length() - 15; i++) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(message.substring(i, i + 16)); // Menampilkan 16 karakter
delay(300); // Memberikan waktu untuk scroll
}
// Menampilkan waktu dan tanggal di akhir ucapan
DateTime now = rtc.now();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Waktu:");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) lcd.print("0"); // Tambahkan nol di depan menit jika kurang dari 10
lcd.print(now.minute());
lcd.print(":");
if (now.second() < 10) lcd.print("0"); // Tambahkan nol di depan detik jika kurang dari 10
lcd.print(now.second());
lcd.setCursor(0, 1);
lcd.print("Tanggal:");
lcd.print(now.day());
lcd.print("/");
lcd.print(now.month());
lcd.print("/");
lcd.print(now.year());
delay(10000); // Tampilkan waktu dan tanggal selama 10 detik
}