Latar Belakang
Seiring dengan perkembangan teknologi, penerapan sistem otomatis dalam lingkungan pendidikan menjadi suatu kebutuhan untuk meningkatkan efisiensi dan kedisiplinan. Salah satu aspek penting dalam kegiatan belajar mengajar di sekolah adalah penggunaan bel sebagai penanda waktu masuk kelas, pergantian jam pelajaran, waktu istirahat, dan pulang sekolah.
Pada umumnya, bel sekolah masih dioperasikan secara manual oleh petugas. Sistem manual ini memiliki beberapa kelemahan, seperti keterlambatan membunyikan bel, ketidakkonsistenan jadwal, serta ketergantungan pada kehadiran petugas. Hal tersebut dapat berdampak pada kurang optimalnya kedisiplinan waktu bagi guru maupun siswa.
Oleh karena itu, diperlukan sebuah sistem bel sekolah yang dapat bekerja secara otomatis dan akurat sesuai dengan jadwal yang telah ditentukan. Dengan memanfaatkan teknologi mikrokontroler Arduino yang dipadukan dengan modul Real Time Clock (RTC), bel sekolah dapat diatur untuk berbunyi secara otomatis berdasarkan waktu yang telah diprogram, tanpa memerlukan pengoperasian manual.
Selain itu, penambahan layar LCD pada sistem ini berfungsi sebagai media informasi yang menampilkan waktu saat ini dan status bel, sehingga memudahkan pengguna dalam memantau kinerja sistem. Penerapan proyek ini diharapkan mampu meningkatkan kedisiplinan, mengurangi kesalahan manusia, serta menjadi sarana pembelajaran bagi siswa dalam memahami penerapan teknologi mikrokontroler di lingkungan sekolah.
Berdasarkan latar belakang tersebut, kami mengusulkan pembuatan “Bel Sekolah Otomatis Berbasis Arduino” sebagai solusi teknologi yang sederhana, efektif, dan aplikatif untuk mendukung kegiatan operasional sekolah.
Tujuan Proyek
Tujuan proyek ini adalah untuk membuat sistem bel sekolah yang bekerja secara otomatis sesuai jadwal waktu, meningkatkan kedisiplinan siswa dan guru, serta menerapkan teknologi Arduino sebagai solusi praktis dalam mendukung kegiatan operasional dan pembelajaran di sekolah
Cara Kerja
Input: Waktu real-time dari modul RTC (jam dan menit).
Proses: Arduino membaca waktu dari RTC lalu mencocokkannya dengan jadwal bel yang telah diprogram.
Output: Buzzer atau bel sekolah berbunyi dan informasi waktu serta status ditampilkan pada LCD.

Souce Code
Berikut ini disajikan source code dari proyek sistem bel sekolah otomatis
#include
#include
#include
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS3231 rtc;
// ================= PIN =================
#define BTN_MODE A0
#define BTN_SET A1
#define BTN_UP A2
#define BTN_DOWN A3
#define RELAY 8
#define BUZZER 13
#define FIRE_ALARM 7
// ================= DATA =================
int hh, mm, ss;
// jadwal
#define TOTAL_BELL 3
int bellHH[TOTAL_BELL] = {7, 9, 12};
int bellMM[TOTAL_BELL] = {0, 30, 0};
// ================= STATUS =================
bool ringing = false;
int counter = 0;
unsigned long lastMillis = 0;
bool bellTriggered = false;
// ================= MENU =================
int menu = 0; // 0=RUN,1=SET,2=PILIH
int editMode = 0; // 0=tidak,1=jam,2=menit
int indexBell = 0;
// ================= DEBOUNCE =================
unsigned long lastDebounce[4] = {0,0,0,0};
bool lastReading[4] = {HIGH,HIGH,HIGH,HIGH};
bool buttonState[4] = {HIGH,HIGH,HIGH,HIGH};
int btnPin[4] = {BTN_MODE, BTN_SET, BTN_UP, BTN_DOWN};
const unsigned long debounceDelay = 50;
// =========================================
void setup() {
Wire.begin();
Serial.begin(9600);
lcd.init();
lcd.backlight();
for(int i=0;i<4;i++){
pinMode(btnPin[i], INPUT_PULLUP);
}
pinMode(RELAY, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(FIRE_ALARM, INPUT_PULLUP);
digitalWrite(RELAY, HIGH);
digitalWrite(BUZZER, LOW);
// RTC
if (!rtc.begin()) {
lcd.print("RTC ERROR!");
while (1);
}
// ⚠️ Jalankan SEKALI saja lalu comment
rtc.adjust(DateTime(F(_DATE), F(TIME_)));
lcd.setCursor(0,0);
lcd.print("SMART BELL");
lcd.setCursor(0,1);
lcd.print("INITIALIZING");
delay(2000);
lcd.clear();
}
// =========================================
void loop() {
bacaRTC();
bacaTombol();
// ???? FIRE ALARM PRIORITAS
if(digitalRead(FIRE_ALARM)==LOW){
StartBell();
}
// ================= AUTO BEL =================
if(menu == 0 && !ringing){
for(int i=0;i if(hh == bellHH[i] && mm == bellMM[i] && ss == 0 && !bellTriggered){ StartBell(); bellTriggered = true; } } } if(ss > 2) bellTriggered = false; // ================= TIMER ================= if(ringing){ if(millis() - lastMillis >= 1000){ lastMillis = millis(); counter--; if(counter <= 0) StopBell(); } } tampil(); } // ========================================= // RTC // ========================================= void bacaRTC(){ DateTime now = rtc.now(); hh = now.hour(); mm = now.minute(); ss = now.second(); } // ========================================= // TOMBOL (DEBOUNCE STABIL) // ========================================= void bacaTombol(){ for(int i=0;i<4;i++){ bool reading = digitalRead(btnPin[i]); if(reading != lastReading[i]){ lastDebounce[i] = millis(); } if((millis() - lastDebounce[i]) > debounceDelay){ if(reading != buttonState[i]){ buttonState[i] = reading; if(buttonState[i] == LOW){ handleButton(i); } } } lastReading[i] = reading; } } // ========================================= // HANDLE TOMBOL // ========================================= void handleButton(int btn){ switch(btn){ case 0: // MODE menu++; if(menu > 2) menu = 0; lcd.clear(); break; case 1: // SET if(menu == 1){ editMode++; if(editMode > 2) editMode = 0; } break; case 2: // UP if(menu == 1){ if(editMode == 1){ bellHH[indexBell]++; if(bellHH[indexBell] > 23) bellHH[indexBell] = 0; } else if(editMode == 2){ bellMM[indexBell]++; if(bellMM[indexBell] > 59) bellMM[indexBell] = 0; } } if(menu == 2){ indexBell++; if(indexBell >= TOTAL_BELL) indexBell = 0; } break; case 3: // DOWN if(menu == 1){ if(editMode == 1){ if(bellHH[indexBell] == 0) bellHH[indexBell] = 23; else bellHH[indexBell]--; } else if(editMode == 2){ if(bellMM[indexBell] == 0) bellMM[indexBell] = 59; else bellMM[indexBell]--; } } if(menu == 2){ if(indexBell == 0) indexBell = TOTAL_BELL-1; else indexBell--; } break; } } // ========================================= // BEL // ========================================= void StartBell(){ ringing = true; counter = 5; digitalWrite(RELAY, LOW); digitalWrite(BUZZER, HIGH); } void StopBell(){ ringing = false; digitalWrite(RELAY, HIGH); digitalWrite(BUZZER, LOW); } // ========================================= // LCD // ========================================= void tampil(){ lcd.setCursor(0,0); if(hh<10) lcd.print("0"); lcd.print(hh); lcd.print(":"); if(mm<10) lcd.print("0"); lcd.print(mm); lcd.print(":"); if(ss<10) lcd.print("0"); lcd.print(ss); lcd.print(" "); // bersihkan sisa karakter lcd.setCursor(0,1); if(menu == 0){ lcd.print("AUTO MODE "); } else if(menu == 1){ lcd.print("SET "); lcd.print(bellHH[indexBell]); lcd.print(":"); lcd.print(bellMM[indexBell]); if(editMode == 1) lcd.print(" H "); else if(editMode == 2) lcd.print(" M "); else lcd.print(" "); } else if(menu == 2){ lcd.print("PILIH BELL "); lcd.print(indexBell+1); lcd.print(" "); } } TIM Proyek Bel Sekolah Otomatis Berbasis Arduino : Akram Ziyad (Ketua tim, Teknisi Hardware, Coding) Abdillah (Dokumentasi) Andi Almira (Coding/Pemrograman) Nurul Amelia.R (Desain) Maulifia Azzahra (Presentasi) Nabila Azzahra ( Desain dan Dokumentasi)


