#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
RTC_DS3231 rtc;
// Inisialisasi LCD dengan alamat I2C (0x27 biasanya alamat LCD 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int relayPin = 8; // Pin relay
const int buzzerPin = 9; // Pin buzzer
const int buttonPin = 10; // Pin tombol manual
const int numSchedulesRegular = 6;
int belHourRegular[numSchedulesRegular] = {7, 9, 10, 10, 12, 14};
int belMinuteRegular[numSchedulesRegular] = {45, 45, 25, 40, 40, 0};
int belTimesRegular[numSchedulesRegular] = {3, 1, 2, 3, 1, 4};
const int numSchedulesFriday = 4;
int belHourFriday[numSchedulesFriday] = {7, 9, 10, 11};
int belMinuteFriday[numSchedulesFriday] = {45, 15, 45, 20};
int belTimesFriday[numSchedulesFriday] = {3, 2, 3, 4};
int belDuration = 1000; // Durasi bel berbunyi (dalam milidetik)
// Array nama hari
const char* daysOfTheWeek[7] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
// Teks untuk teks berjalan
String runningText = "Bel Otomatis SMK N5 ABDYA";
void setup() {
Serial.begin(9600);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Bel Otomatis");
if (!rtc.begin()) {
lcd.setCursor(0, 1);
lcd.print("RTC Error!");
Serial.println("RTC gagal, periksa koneksi.");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC kehilangan daya, atur ulang waktu.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Set waktu sesuai waktu kompilasi
}
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW); // Matikan bel pada awalnya
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW); // Matikan buzzer pada awalnya
pinMode(buttonPin, INPUT_PULLUP); // Menggunakan pull-up internal untuk tombol
delay(2000); // Tampilkan pesan "Bel Otomatis" selama 2 detik
lcd.clear();
}
void ringBell(int times) {
for (int i = 0; i < times; i++) {
digitalWrite(relayPin, HIGH); // Nyalakan bel
digitalWrite(buzzerPin, HIGH); // Nyalakan buzzer
tone(buzzerPin, 262); // Atur Bunyi buzzer
delay(belDuration); // Tunggu selama durasi yang ditentukan
digitalWrite(relayPin, LOW); // Matikan bel
digitalWrite(buzzerPin, LOW); // Matikan buzzer
noTone(buzzerPin); // bunyi buzzer mati
delay(belDuration); // Jeda antara bunyi bel
}
}
// Fungsi untuk menampilkan teks berjalan
void displayRunningText(String text) {
static int scrollIndex = 0;
lcd.setCursor(0, 1);
String displayText = text.substring(scrollIndex, scrollIndex + 16);
lcd.print(displayText);
scrollIndex++;
if (scrollIndex + 16 > text.length()) {
scrollIndex = 0; // Reset ketika selesai satu kali scroll
}
}
void loop() {
// Dapatkan waktu saat ini dari RTC
DateTime now = rtc.now();
int currentDay = now.dayOfTheWeek(); // Dapatkan hari dalam seminggu
// Tampilkan waktu saat ini di Serial Monitor
Serial.print("Waktu: ");
Serial.print(now.hour());
Serial.print(':');
Serial.print(now.minute());
Serial.print(':');
Serial.println(now.second());
// Tampilkan waktu pada LCD
lcd.setCursor(0, 0);
lcd.print(daysOfTheWeek[currentDay]);
lcd.print(", ");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
// Tampilkan teks berjalan di baris kedua LCD
displayRunningText(runningText);
lcd.print(" "); // hapus sisa teks
// Cek jika hari adalah Minggu (0), bel tidak berbunyi
if (currentDay == 0) {
Serial.println("Hari Minggu, bel tidak berbunyi.");
lcd.setCursor(0, 1);
lcd.print("Minggu, Bel OFF");
delay(60000); // Tunggu 1 menit sebelum cek ulang
return; // Tidak lakukan apa-apa di hari Minggu
}
// Jika hari Jumat (5), gunakan jadwal khusus
if (currentDay == 5) {
for (int i = 0; i < numSchedulesFriday; i++) {
if (now.hour() == belHourFriday[i] && now.minute() == belMinuteFriday[i]) {
Serial.print("Bel berbunyi ");
Serial.print(belTimesFriday[i]);
Serial.println(" kali (Jumat)!");
ringBell(belTimesFriday[i]); // Panggil fungsi untuk membunyikan bel sesuai jumlah pada hari Jumat
lcd.setCursor(0, 1);
lcd.print("Bel berbunyi: ");
lcd.print(belTimesFriday[i]);
lcd.print(" kali (Jumat)");
delay(60000); // Tunggu 1 menit agar bel tidak berbunyi lagi di menit yang sama
}
}
}
// Jika hari selain Jumat, gunakan jadwal biasa
else {
for (int i = 0; i < numSchedulesRegular; i++) {
if (now.hour() == belHourRegular[i] && now.minute() == belMinuteRegular[i]) {
Serial.print("Bel berbunyi ");
Serial.print(belTimesRegular[i]);
Serial.println(" kali (hari biasa)!");
ringBell(belTimesRegular[i]); // Panggil fungsi untuk membunyikan bel sesuai jumlah pada hari biasa
lcd.setCursor(0, 1);
lcd.print("Bel berbunyi: ");
lcd.print(belTimesRegular[i]);
lcd.print(" kali");
delay(60000); // Tunggu 1 menit agar bel tidak berbunyi lagi di menit yang sama
}
}
}
// Cek jika tombol manual ditekan
if (digitalRead(buttonPin) == LOW) { // Jika tombol ditekan (LOW karena menggunakan pull-up)
Serial.println("Tombol bel manual ditekan!");
lcd.setCursor(0, 1);
lcd.print("Bel Manual On ");
ringBell(1);// Berbunyi 1 kali atau sesuai yang diinginkan
delay(1000); // Tunggu 1 detik sebelum memeriksa lagi
}
delay(1000); // Cek setiap detik
}