Bel sekolah merupakan pengingat waktu terjadwal yang menandai pergantian antar waktu pelajaran di sekolah. Ber sekolah juga memiliki penjawalan mingguan dan bulanan.
Perangkat bel sekolah otomatis bisa diaplikasikan menggunakan arduino sebagai unit prosesornya, tidak seperti bel sekolah digital berbasis komputer yang menyimpan jadwal dalam harddisk, bel sekolah digital arduino menyimpan data jadwal pelajaran didalam EEPROM. Data Jadwal disimpan dalam format/struktur berikut :
- Aktif
- Jam
- Menit
Guna mengatur data jadwal tersebut, perangkat bel sekolah ini dilengkapi dengan tombol-tombol dengan fungsi [menu], [tambah], [kurang] dan [ok].
serta penggunaan LCD sebagai tampilan waktu sekarang dan tampilan jadwal apabila waktunya telah tepat.
skema bel sekolah dengan pengaturan melalui tombol/button:
komponen yang digunakan :
- Arduino uno
- RTC DS3231
- LCD i2C
- push button 4x
sketch/koding bel sekolah arduino :
#define pinTombolMenu 5 #define pinTombolTambah 4 #define pinTombolKurang 3 #define pinTombolOk 2 #include <EEPROM.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <SoftwareSerial.h> #include "RTC.h" LiquidCrystal_I2C lcd(0x3F, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display RTC_DS3231 rtc; char namaHari[][7] = {"Minggu", "Senin", "Selasa", " Rabu", "Kamis", "Jum'at", "Sabtu"}; char textMenuUtama[][17] = { "Bel masuk +pel 1", "Ganti pel 2 ", "Bel istirahat ", "Bel masuk +pel 3", "Ganti pel 4 ", "Bel pulang ", "Set Jam ", }; char textAktif[][6] = {"Mati ", "Aktif"}; char bufWaktu[40]; struct Jadwal { bool aktif; byte jam; byte menit; }; Jadwal jadwal[6] = {{0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0},} ; Jadwal jadwalSet; void setup() { pinMode(pinTombolMenu, INPUT_PULLUP); pinMode(pinTombolTambah, INPUT_PULLUP); pinMode(pinTombolKurang, INPUT_PULLUP); pinMode(pinTombolOk, INPUT_PULLUP); Serial.begin (9600); rtc.begin(); if (rtc.lostPower()) { Serial.println(F("Waktu RTC di set ulang")); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } Wire.beginTransmission(0x3F); if (Wire.endTransmission()) { lcd = LiquidCrystal_I2C(0x27, 16, 2); } lcd.begin(); // Print a message to the LCD. lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Nama"); lcd.setCursor(0, 1); lcd.print("Judul"); // delay(3000); if (EEPROM.read(0) != 0x48) { simpanJadwal(); EEPROM.write(0, 0x48); } else { ambilJadwal(); } Serial.println("Bel sekolah dimulai"); } byte detikSebelumnya = 60; byte menitSebelumnya = 60; byte menuLevel = 0; byte menuIndex[2]; DateTime setWaktu; void loop() { DateTime now = rtc.now(); if (detikSebelumnya != now.detik) { detikSebelumnya = now.detik; if (!menuLevel) { sprintf(bufWaktu, "Pukul : %02d:%02d:%02d", now.jam, now.menit, now.detik); lcd.setCursor(0, 0); lcd.print(bufWaktu); sprintf(bufWaktu, "%s, %02d/%02d/%02d", namaHari[now.hari - 1], now.tanggal, now.bulan, now.tahun - 2000); lcd.setCursor(0, 1); lcd.print(bufWaktu); } if (menitSebelumnya != now.menit) { menitSebelumnya = now.menit; for (byte i = 0; i < 6; i++) { if (jadwal[i].aktif) { if ((jadwal[i].jam == now.jam) && (jadwal[i].menit == now.menit)) { lcd.setCursor(0, 0); lcd.print(" Bel Sekolah "); lcd.setCursor(0, 1); lcd.print(textMenuUtama[i]); delay(10000); } } } } } if (!digitalRead(pinTombolMenu)) { delay(100); if (!digitalRead(pinTombolMenu)) { if (menuLevel == 0) { menuLevel = 1; menuIndex[0] = 0; } else { menuLevel = 0; lcd.noBlink(); } tampilanMenu(); while (!digitalRead(pinTombolMenu)); } } if (!digitalRead(pinTombolTambah)) { delay(100); if (!digitalRead(pinTombolTambah)) { if (menuLevel == 1) { menuIndex[0]++; if (menuIndex[0] >= sizeof(textMenuUtama) / sizeof(textMenuUtama[0])) { menuIndex[0] = 0; } tampilanMenu(); } if (menuLevel == 2) { if (menuIndex[0] == 6) { switch (menuIndex[1]) { case 0: setWaktu.jam++; if (setWaktu.jam >= 24) { setWaktu.jam = 0; } break; case 1: setWaktu.menit++; if (setWaktu.menit >= 60) { setWaktu.menit = 0; } break; case 2: setWaktu.detik++; if (setWaktu.detik >= 60) { setWaktu.detik = 0; } break; } } else { switch (menuIndex[1]) { case 0: jadwalSet.aktif = !jadwalSet.aktif; break; case 1: jadwalSet.jam++; if (jadwalSet.jam >= 24) { jadwalSet.jam = 0; } break; case 2: jadwalSet.menit++; if (jadwalSet.menit >= 60) { jadwalSet.menit = 0; } break; } } tampilanMenu(); } delay(100); } } if (!digitalRead(pinTombolKurang)) { delay(100); if (!digitalRead(pinTombolKurang)) { if (menuLevel == 1) { if (menuIndex[0] == 0) { menuIndex[0] = sizeof(textMenuUtama) / sizeof(textMenuUtama[0]) - 1; } else { menuIndex[0]--; } tampilanMenu(); } if (menuLevel == 2) { if (menuIndex[0] == 6) { switch (menuIndex[1]) { case 0: if (setWaktu.jam == 0) { setWaktu.jam = 23; } else { setWaktu.jam--; } break; case 1: if (setWaktu.menit == 0) { setWaktu.menit = 59; } else { setWaktu.menit--; } break; case 2: if (setWaktu.detik == 0) { setWaktu.detik = 59; } else { setWaktu.detik--; } break; } } else { switch (menuIndex[1]) { case 0: jadwalSet.aktif = !jadwalSet.aktif; break; case 1: if (jadwalSet.jam == 0) { jadwalSet.jam = 23; } else { jadwalSet.jam--; } break; case 2: if (jadwalSet.menit == 0) { jadwalSet.menit = 59; } else { jadwalSet.menit--; } break; } } tampilanMenu(); } delay(100); } } if (!digitalRead(pinTombolOk)) { delay(100); if (!digitalRead(pinTombolOk)) { if (menuLevel == 1) { menuLevel = 2; menuIndex[1] = 0; if (menuIndex[0] == 6) { setWaktu = rtc.now(); tampilanMenu(); lcd.setCursor(4, 1); lcd.blink(); } else { jadwalSet.aktif = jadwal[menuIndex[0]].aktif; jadwalSet.jam = jadwal[menuIndex[0]].jam; jadwalSet.menit = jadwal[menuIndex[0]].menit; tampilanMenu(); lcd.setCursor(2, 1); lcd.blink(); } } else if (menuLevel == 2) { menuIndex[1]++; if (menuIndex[0] == 6) { switch (menuIndex[1]) { case 1: tampilanMenu(); lcd.setCursor(7, 1); lcd.blink(); break; case 2: tampilanMenu(); lcd.setCursor(10, 1); lcd.blink(); break; case 3: menuLevel = 1; rtc.adjust(setWaktu); tampilanMenu(); lcd.noBlink(); break; } } else { switch (menuIndex[1]) { case 1: tampilanMenu(); lcd.setCursor(8, 1); lcd.blink(); break; case 2: tampilanMenu(); lcd.setCursor(11, 1); lcd.blink(); break; case 3: menuLevel = 1; jadwal[menuIndex[0]].aktif = jadwalSet.aktif; jadwal[menuIndex[0]].jam = jadwalSet.jam; jadwal[menuIndex[0]].menit = jadwalSet.menit; simpanJadwal(); lcd.noBlink(); tampilanMenu(); break; } } while (!digitalRead(pinTombolOk)); delay(500); } } } } void tampilanMenu() { if (menuLevel == 1) { lcd.setCursor(0, 0); lcd.print(" Menu Utama "); lcd.setCursor(0, 1); lcd.print(textMenuUtama[menuIndex[0]]); } else if (menuLevel == 2) { if (menuIndex[0] == 6) { lcd.setCursor(0, 0); lcd.print(textMenuUtama[menuIndex[0]]); sprintf(bufWaktu, " %02d:%02d:%02d ", setWaktu.jam, setWaktu.menit, setWaktu.detik); lcd.setCursor(0, 1); lcd.print(bufWaktu); } else { lcd.setCursor(0, 0); lcd.print(textMenuUtama[menuIndex[0]]); sprintf(bufWaktu, " %s %02d:%02d ", textAktif[jadwalSet.aktif], jadwalSet.jam, jadwalSet.menit); lcd.setCursor(0, 1); lcd.print(bufWaktu); } } } void ambilJadwal() { byte *alamat = (byte*)jadwal; for (byte i = 1; i < sizeof(jadwal) + 1; i++) { *alamat++ = EEPROM.read(i); } } void simpanJadwal() { byte *alamat = (byte*)jadwal; for (byte i = 1; i < sizeof(jadwal) + 1; i++) { EEPROM.update(i, *alamat++); } }
library yang digunakan:
mksh kg coding nya,izin save…..klo tambah dfplayer lbh mantap lg kg…tp coding bagian mn yg di ubah kg?
kode panggil eksekusi jadwal ada pada bagian ini :
if ((jadwal[i].jam == now.jam) && (jadwal[i].menit == now.menit))
{
lcd.setCursor(0, 0);
lcd.print(" Bel Sekolah ");
lcd.setCursor(0, 1);
lcd.print(textMenuUtama[i]);
delay(10000);
}
relay ampli, buzzer, mp3 player, telegram alert, hitung mundur dan lain-lain bisa disisipkan dibagian tersebut
Makasih kg asep,,izin nyoba.
class LiquidCrystal_I2C’ has no member named ‘init’ itu knp y kg? pdhl pake library nya kg asep..
terima kasih infonya,
miss di library (posting sudah diperbaiki)
lcd.init();
diganti dengan
lcd.begin();
sami2 kg,skrg udah done tinggal utak atik nambah dfplayer…
Gan kalau seperti ini eror kenapa
Arduino: 1.8.5 (Windows 7), Board: “Arduino/Genuino Uno”
Build options changed, rebuilding all
bel_tombol:11: error: #include expects “FILENAME” or
#include <EEPROM.h>
^
bel_tombol:13: error: #include expects “FILENAME” or
#include <Wire.h>
^
bel_tombol:15: error: #include expects “FILENAME” or
#include <LiquidCrystal_I2C.h>
^
bel_tombol:17: error: #include expects “FILENAME” or
#include <SoftwareSerial.h>
^
bel_tombol:19: error: #include expects “FILENAME” or
#include "
^
exit status 1
#include expects “FILENAME” or
This report would have more information with
“Show verbose output during compilation”
option enabled in File -> Preferences.
compilernya menolak
#include <<>>
karenanya ganti dengan
#include "EEPROM.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
#include "SoftwareSerial.h"
#include "RTC_Semesin.h"
berarti tidak pake quot lg y kg asep?
bang, ko dicompile eror yah?
minta pencerahannya bang
Sketch/Koding ini sudah ditest dan berfungsi,
kalo ada masalah tolong lebih detail lagi, biar bisa di analisa
untuk RTC semesinnya gak bisa ya selalu gagal di compailnya katanya rtc semesinya no such file or directori katanya
install dulu library yang digunakan
Assalamualaikum…
Saya sudah mencoba ketik program dan compile program dan error
pinMode(pinTombolMenu,INPUT_PULLUP);
pinMode(pinTombolTambah,INPUT_PULLUP);
pinMode(pinTombolKuran,INPUT_PULLUP);
pinMode(pinTombolOk, INPUT_PULLUP);
“error”
expected primary-expression before ‘,’ token
menuIndex[0]=sizeof(textMenuUtama)/sizeof(textMenuUtama [0] – 1;
“error”
textMenuUtama waspada not declared ini this scope
Mohon koreksinya
Terima kasih
Sulit dideteksi kesalahannya jika informasinya seperti itu,
coba balik lagi (ctrl-z) sampai compile sukses, kemudian lakukan modifikasi bertahap.
Mas itu bisa berapa jadwal..?
contoh ini 6 jadwal
Maksudnya 6 jadwal gimana kang…?
Gan kalo mau nambah jadwal nyisipinnya di bagian mana?
Tambahkan item variabel textMenuUtama dan variabel jadwal
Bnag kalo untuk suara gimana ya
mohon maaf mas, kalau mau putar file di dfplayer berdsarkan jadwal nya gimana ya mas?
Sisipkan saja kode panggilnya
mp3_play(i);
dimana ‘i’ adalah nomor urut jadwal dan juga nomor file mp3
maaf mas, bisa di jelaskan cara kerja nya kenapa “i” bisa manggil nomor file mp3 ?
apa sebelumnya file mp3 nya harus dibuat aray dulu atau gimana mas ?
mathurnuwun kang
kang, ini hari minggu bel nya tetap jalan.? klw kita mau kecualikan jatwal di hari jum’at dan minggu gimana kang.? mohon contohnya
setting melalui aplikasi android, centang semua hari kecuali jum’at dan minggu
kalo mau saya tambahkan relay ketika jadwal aktif, penambahannya di mana ya mas, terima kasih
bisa disisip antara baris 113 – 117
oke terima kasih mas
mas mau nanya, kalo mau ditambah jadi 9 jadwalnya bagaimana ya, terima kasih
bisa saja, dengan menambahkan textMenuUtama
mengganti baris 107
for (byte i = 0; i < 6; i++)
dan sesuaikan baris2 "menuIndex[0] == 6" ke index "Set Jam " yang baru
mas kalau ingin atur lama belnya aktif bisa diatur juga berapa detiknya itu bagaimana yah ?
pada block 113-117 bisa di tambahi koding untuk bel misalnya digitalWrite(pinBel, HIGH) dan di ikuti delay(detik * 1000) dan seterusnya sesuai kebutuhan
min saya ingin buat 2 buah data panggil
data panggil pertama untuk aktifkan relay 1
dan data panggil kedua untuk aktifkan relay 2
mohon pencerahanya
terimakasih
dalam konteks bel (penjadwalan) ini bisa memasukkan baris program khusus (relay) dalam blok
if ((jadwal[i].jam == now.jam) && (jadwal[i].menit == now.menit))
dimana variabel ‘i’ (=0,1,2,3) adalah data panggil nya
contohnya :
if(i==0)
{
digitalWrite(pinrelay1, HIGH);
}
else if(i == 1)
{
digitalWrite(pinrelay1, HIGH);
}
terimakasih pencerahannya sudah saya coba dan berhasil……
ada satu pertanyaan lagi min mohon pencerahan tambahan.
jika tampilan lcd berada pada posisi “menu utama” , dan tombol tidak di tekan delam waktu lebih dari 1 atau 2 menit tampilan akan otomatis kembali ke tampilan awal ( buf ) mana yang harus di rubah
mohon wejangan anda
terimakasih
buat sebuah block millis, contohnya
if(millisNganggur < millis()) { menuLevel = 0; lcd.noBlink(); }
Maaf Mas ADMIN saya menemukan sedikit kesalahan dalam set waktu menit dalam blok di bawah . set waktu menit di tombol tambah dalam sketch tertulis 24 sehingga pada seting jam , ” seting menit ” tidak bisa lebih dari 24 menit.
case 1:
setWaktu.menit++;
if (setWaktu.menit >= 24)
seharus nya
case 1:
setWaktu.menit++;
if (setWaktu.menit >= 60)
Terimakasih
terima kasih infonya
[sudah di update sketch nya di halaman ini]
terima kasih mass…saya izin save dan pelajarii…
semoga berkah ilmunya mass…
Pembuatan blok milis di letak kan di dalam blok tombol memu atau di dalam void loop kang maaf saya maih bingung …
Dan jika saya ingin simpan data dari hasil data panggil i ke EEPROM agar ketika arduino mati lampu
Dan saat nyala kembali kondisi relay mengikuti kondisi sebelum mati lampu.
Misal relay dalam kondisi on sebelum mati lampu
Dan ketika lampu nyala kembali relay akan langsun on atau sebaliknya.
Terimakasih
blok millis di letakkan dalam void loop
data i bisa di simpan ke EEPROM menggunakan perintah
EEPROM.write(100, i);
dalam void setup paggil lagi
i = EEPROM.read(100);
Assalamualaikum bang
saya coba pake RtcDS1302 dan saya sudah install librarynya tapi serinf muncul erros di baris 350 yang ada perintah ( rtc.adjust(setWaktu);). kenapa itu bang ?
case 3:
menuLevel = 1;
rtc.adjust(setWaktu);
tampilanMenu();
lcd.noBlink();
break;
Sesuaikan fungsi adjut itu dengan standar librarynya (biasanya contoh penggunaannya di sertakan di example library tersebut)
Jam yg tampil kok 165:165:85 kenapa ya bang?
kemungkinan modul rtc belum terhubung/belum terbaca
cek modul rtc, cek kabel dan konektor rtc-arduino
Mantap. terima kasih ilmunya sangat bermanfaat kang asep. sukses selalu.