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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 | #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
Jadwal jadwal[6] = {{0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0},} ;
Jadwal jadwalSet;
Kalo 10x tinggal ganti 6 jadi 10 sama 7 ganti 11 kang??
untuk menambah jadwalnya menjadi 10,
jadikan :
Jadwal jadwal[10] = {{0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0},} ;
serta sesuaikan baris 107
for (byte i = 0; i < 10; i++)
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.