Bel sekolah dengan pengaturan melalui tombol

  • Whatsapp
#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++);
}
}
Download Semua File Disini
Untuk Sumber Lebih Lengkapnya lihat Semesin.com
banner 300x250

Pos terkait

banner 468x60

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *