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(
"http://www.semesin.com/project"
);
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
Tidak ada komentar:
Posting Komentar