Bel sekolah digital dimanfaatkan untuk menentukan waktu pertukaran kegiatan di sekolah-sekolah. Jadwal untuk sebuah sekolah berbeda dengan sekolah lainnya, baik perbedaan tingkat sekolah maupun zona waktunya. Selain itu terdapat juga perbedaan jadwal untuk masing masing hari, seperti senin pertama setiap bulan untuk upacara dan hari lainnya yang mempunyai kekhususan waktu. Bel sekolah digital berbasis arduino atau mikrokontroller lain memiliki kemampuan penjadwalan jam pelajaran tersebut. selain itu bel sekolah digital arduino juga mudah dalam pengembangan nantinya.
Dalam perancangan bel sekolah arduino ini dibatasi hanya sampai pengaplikasian tabel database arduino fleksibel yang bisa disesuaikan dengan kebutuhan. Bel sekolah berbasis arduino ini hanya berupa penerapan dasar saja yang bisa dikombinasikan dengan aplikasi Bel Sekolah fungsional lainnya.
Untuk pengembangannya bisa saja perangkat bel sekolah otomatis berbasis arduino ini ditambahkan sistem entri data dari bluetooth, wifi, PC dll. juga bisa ditambahkan sistem output multimedia seperti alarm, suara, running text, DMD dan lain-lain.
Kelebihan perancangan ini adalah:
- Tabel database jadwal fleksibel
- Pembacaan RTC dengan interupsi sehingga menghemat resource
- Pemanfaatan sleep mode
Komponen yang digunakan:
- Arduino Uno
- RTC DS3231
berikut skema / rangkaian bel sekolah dengan arduino:
dan program/sketch Arduino:
#include <DS3232RTC.h>
#include <avr/sleep.h>
#define SQWPin 12
struct Waktu
{
byte jam;
byte menit;
};
struct TabelMataPelajaran
{
byte aktif;
Waktu waktu;
byte hariAktif;
byte mingguAktif;
byte kegiatan;
};
enum _kegiatan
{
JamPelajaran1,
JamPelajaran2,
JamPelajaran3,
JamPelajaran4,
JamPelajaran5,
JamPelajaran6,
JamPelajaran7,
JamPelajaran8,
JamPelajaran9,
JamPelajaran10,
JamPelajaran11,
JamPelajaran12,
JamPelajaran13,
JamPelajaran14,
JamPelajaran15,
Masuk,
Upacara,
Istirahat,
SelesaiIstirahat,
Kepramukaan,
Khusus,
Pulang,
PulangJumat,
PulangSabtu
};
volatile bool interupsiDetik;
byte indexMataPelajaran;
#define hariAktifSenin 1<<6
#define hariAktifSelasa 1<<5
#define hariAktifRabu 1<<4
#define hariAktifKamis 1<<3
#define hariAktifJumat 1<<2
#define hariAktifSabtu 1<<1
#define hariAktifMinggu 1<<7
String namaHari[] = {"Minggu","Senin","Selasa","Rabu","Kamis","Jum;at","Sabtu"};
#define _hariAktif(Sen,Sel,Rab,Kam,Jum,Sab,Mgu) (Mgu<<7)|(Sen<<6)|(Sel<<5)|(Rab<<4)|(Kam<<3)|(Jum<<2)|(Sab<<1)
#define _mingguAktif(Mgu1,Mgu2,Mgu3,Mgu4,Mgu5) (Mgu1<<7)|(Mgu2<<6)|(Mgu3<<5)|(Mgu4<<4)|(Mgu5<<3)
#define _waktu(Jam, Menit) {Jam, Menit}
#define Aktif 1
#define TidakAktif 0
TabelMataPelajaran jadwalBelajar[35];
Waktu waktu;
tmElements_t tm;
void setup() {
byte i = 0;
//Senin
jadwalBelajar[i++] = {Aktif, _waktu( 6, 45 ), hariAktifSenin, _mingguAktif(1,0,0,0,0), Upacara};
jadwalBelajar[i++] = {Aktif, _waktu( 6, 45 ), hariAktifSenin, _mingguAktif(0,1,1,1,1), JamPelajaran1};
jadwalBelajar[i++] = {Aktif, _waktu( 6, 45 ), _hariAktif(0,1,1,1,1,0,0), _mingguAktif(1,1,1,1,1), JamPelajaran1};
jadwalBelajar[i++] = {Aktif, _waktu( 7, 30 ), _hariAktif(1,1,1,1,0,0,0), _mingguAktif(1,1,1,1,1), JamPelajaran2};
jadwalBelajar[i++] = {Aktif, _waktu( 8, 15 ), _hariAktif(1,1,1,1,0,0,0), _mingguAktif(1,1,1,1,1), JamPelajaran3};
jadwalBelajar[i++] = {Aktif, _waktu( 9, 0 ), _hariAktif(1,1,1,1,0,0,0), _mingguAktif(1,1,1,1,1), JamPelajaran4};
jadwalBelajar[i++] = {Aktif, _waktu( 9, 45 ), _hariAktif(1,1,1,1,0,0,0), _mingguAktif(1,1,1,1,1), Istirahat};
jadwalBelajar[i++] = {Aktif, _waktu( 10, 15 ), _hariAktif(1,1,1,1,0,0,0), _mingguAktif(1,1,1,1,1), JamPelajaran5};
jadwalBelajar[i++] = {Aktif, _waktu( 11, 0 ), _hariAktif(1,1,1,1,0,0,0), _mingguAktif(1,1,1,1,1), JamPelajaran6};
jadwalBelajar[i++] = {Aktif, _waktu( 11, 45 ), _hariAktif(1,1,1,1,0,0,0), _mingguAktif(1,1,1,1,1), Istirahat};
jadwalBelajar[i++] = {Aktif, _waktu( 12, 30 ), _hariAktif(1,1,1,1,0,0,0), _mingguAktif(1,1,1,1,1), JamPelajaran7};
jadwalBelajar[i++] = {Aktif, _waktu( 13, 15 ), _hariAktif(1,1,1,1,0,0,0), _mingguAktif(1,1,1,1,1), JamPelajaran8};
jadwalBelajar[i++] = {Aktif, _waktu( 14, 0 ), _hariAktif(1,1,1,0,0,0,0), _mingguAktif(1,1,1,1,1), JamPelajaran9};
jadwalBelajar[i++] = {Aktif, _waktu( 14, 45 ), _hariAktif(1,1,1,0,0,0,0), _mingguAktif(1,1,1,1,1), JamPelajaran10};
jadwalBelajar[i++] = {Aktif, _waktu( 14, 0 ), hariAktifKamis, _mingguAktif(1,1,1,1,1), Kepramukaan};
jadwalBelajar[i++] = {Aktif, _waktu( 14, 45 ), hariAktifKamis, _mingguAktif(1,1,1,1,1), Khusus};
jadwalBelajar[i++] = {Aktif, _waktu( 15, 30 ), _hariAktif(1,1,1,1,0,0,0), _mingguAktif(1,1,1,1,1), Pulang};
jadwalBelajar[i++] = {Aktif, _waktu( 7, 25 ), hariAktifJumat, _mingguAktif(1,1,1,1,1), JamPelajaran2};
jadwalBelajar[i++] = {Aktif, _waktu( 8, 5 ), hariAktifJumat, _mingguAktif(1,1,1,1,1), JamPelajaran3};
jadwalBelajar[i++] = {Aktif, _waktu( 8, 45 ), hariAktifJumat, _mingguAktif(1,1,1,1,1), JamPelajaran4};
jadwalBelajar[i++] = {Aktif, _waktu( 9, 25 ), hariAktifJumat, _mingguAktif(1,1,1,1,1), Istirahat};
jadwalBelajar[i++] = {Aktif, _waktu( 9, 55 ), hariAktifJumat, _mingguAktif(1,1,1,1,1), JamPelajaran5};
jadwalBelajar[i++] = {Aktif, _waktu( 10, 35 ), hariAktifJumat, _mingguAktif(1,1,1,1,1), JamPelajaran6};
jadwalBelajar[i++] = {Aktif, _waktu( 11, 15 ), hariAktifJumat, _mingguAktif(1,1,1,1,1), PulangJumat};
indexMataPelajaran = i;
Serial.begin(9600);
Serial.println("Bel Sekolah menggunakan tabel database flexibel berbaasis Arduino");
Serial.println("Bisa ditambahkan input bluetooth, wifi, PC, komputer dll");
Serial.println("Bisa ditambahkan output multimedia seperti suara, alarm, running text, dmd dll");
Serial.println("https://www.project.semesin.com");
byte ControlRegister;
RTC.readRTC(0x0E,&ControlRegister,1);
ControlRegister &= ~(0x07<<2);
RTC.writeRTC(0x0E, &ControlRegister,1);
*digitalPinToPCMSK(SQWPin) |= bit (digitalPinToPCMSKbit(SQWPin));
PCIFR |= bit (digitalPinToPCICRbit(SQWPin));
PCICR |= bit (digitalPinToPCICRbit(SQWPin));
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
////Set waktu sekali saja
// tm.Day = 1;
// tm.Month = 4;
// tm.Year = CalendarYrToTm(2018);
// tm.Hour = 15;
// tm.Minute = 24;
// tm.Second = 00;
//
// time_t t = makeTime(tm);
// tm.Wday = dayOfWeek(t);
// RTC.write(tm);
// TampilkanWaktu();
}
ISR (PCINT0_vect)
{
if(digitalRead(SQWPin))
{
interupsiDetik = true;
}
}
void loop() {
if(interupsiDetik)
{
interupsiDetik = false;
RTC.read(tm);
if(tm.Second == 0)
{
TampilkanWaktu();//***
byte hariKeDiTanggal1 = (((tm.Wday + 8) - (tm.Day % 7)) % 7);
byte SeninKe = ((tm.Day + 7 - hariKeDiTanggal1) / 7);
byte mingguKe = ((tm.Day + 8 - hariKeDiTanggal1) / 7) + 1;
for(byte i=0; i<indexMataPelajaran ;i++)
{
if(jadwalBelajar[i].aktif)
{
if((jadwalBelajar[i].waktu.jam == tm.Hour) &&
(jadwalBelajar[i].waktu.menit == tm.Minute) &&
(jadwalBelajar[i].hariAktif & (1<<(8-tm.Wday))) &&
(jadwalBelajar[i].mingguAktif & (1<<(8-SeninKe))))
{
TampilkanWaktu();
//Bisa ditambahkan sistem output
switch(jadwalBelajar[i].kegiatan)
{
case JamPelajaran1:
Serial.println("Jam Pelajaran 1");
break;
case JamPelajaran2:
Serial.println("Jam Pelajaran 2");
break;
case JamPelajaran3:
Serial.println("Jam Pelajaran 3");
break;
case JamPelajaran4:
Serial.println("Jam Pelajaran 4");
break;
case JamPelajaran5:
Serial.println("Jam Pelajaran 5");
break;
case JamPelajaran6:
Serial.println("Jam Pelajaran 6");
break;
case JamPelajaran7:
Serial.println("Jam Pelajaran 7");
break;
case JamPelajaran8:
Serial.println("Jam Pelajaran 8");
break;
case JamPelajaran9:
Serial.println("Jam Pelajaran 9");
break;
case JamPelajaran10:
Serial.println("Jam Pelajaran 10");
break;
case JamPelajaran11:
Serial.println("Jam Pelajaran 11");
break;
case JamPelajaran12:
Serial.println("Jam Pelajaran 12");
break;
case JamPelajaran13:
Serial.println("Jam Pelajaran 13");
break;
case JamPelajaran14:
Serial.println("Jam Pelajaran 14");
break;
case JamPelajaran15:
Serial.println("Jam Pelajaran 15");
break;
case Masuk:
Serial.println("Masuk");
break;
case Upacara:
Serial.println("Upacara");
break;
case Istirahat:
Serial.println("Istirahat");
break;
case SelesaiIstirahat:
Serial.println("Selesai istirahat");
break;
case Kepramukaan:
Serial.println("Kepramukaan");
break;
case Khusus:
Serial.println("Khusus");
break;
case Pulang:
Serial.println("Jam pelajaran telah selesai, sampai jumpa esok hari");
break;
case PulangJumat:
Serial.println("Jam pelajaran telah selesai, sampai jumpa minggu depan");
break;
case PulangSabtu:
Serial.println("Jam pelajaran telah selesai, sampai jumpa minggu depan");
break;
default:
Serial.println("Lainnya");
break;
}
}
}
}
}
}
delay(100);//Selesaikan Serial nge print, hapus saja jika tidak diperlukan
sleep_mode();
}
void TampilkanWaktu()
{
Serial.print("Waktu = ");
print2digits(tm.Hour);
Serial.write(':');
print2digits(tm.Minute);
Serial.write(':');
print2digits(tm.Second);
Serial.print(", Tanggal = ");
Serial.print(namaHari[tm.Wday-1]);
Serial.write(' ');
Serial.print(tm.Day);
Serial.write('/');
Serial.print(tm.Month);
Serial.write('/');
Serial.print(tmYearToCalendar(tm.Year));
Serial.println();
}
void print2digits(int number) {
if (number >= 0 && number < 10) {
Serial.write('0');
}
Serial.print(number);
}
contoh Bel Sekolah Arduino Uno dengan output modul mini MP3 DFPlayer (library DFPlayer_Mini_Mp3.h) dan software serial : Bel_Sekolah_tanpa_interupsi.ino
Bel sekolah bluetooth dengan kontrol android : disini