#include <DS1307RTC.h> // Memanggil RTC3231 Library
#include <Wire.h> // i2C Conection Library
#include <LiquidCrystal_I2C.h> // Memanggil i2C LCD Library
#include <Button.h> // Memanggil library Push Button
#include <RTClib.h>
#define DN_PIN 2 // Decrease Button Down
#define UP_PIN 3 // Increase Button Up
#define SET_PIN 4 // Setup Button Settings Jam
#define ALR_PIN 5 // Setup Button Alarm
#define PULLUP true
#define INVERT true
#define DEBOUNCE_MS 20
#define REPEAT_FIRST 500
#define REPEAT_INCR 100
Button btnUP(UP_PIN, PULLUP, INVERT, DEBOUNCE_MS);
Button btnDN(DN_PIN, PULLUP, INVERT, DEBOUNCE_MS);
Button btnSET(SET_PIN, PULLUP, INVERT, DEBOUNCE_MS);
Button btnALR(ALR_PIN, PULLUP, INVERT, DEBOUNCE_MS);
enum {WAIT, INCR, DECR};
uint8_t STATE;
int count;
int lastCount = -1;
unsigned long rpt = REPEAT_FIRST;
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7);
uint8_t dgrsChar[8] = {0x4, 0xa, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0};
RTC_DS1307 rtc();
#define Time t
uint32_t targetTime = 0;
uint8_t conv2d(const char* p) {
uint8_t v = 0;
if ('0' <= *p && *p <= '9')
v = *p - '0';
return 10 * v + *++p - '0';
}
uint8_t hh = 0, mm = 0, ss = 0, dd = 0, bb = 0, dy = 0;
int yy = 0;
String Day = " ";
uint8_t alarmHH = 9, alarmMM = 30;
int alarmLONG = 5;
uint8_t setMode = 0, setAlarm = 0, alarmMode = 0;
void setup() {
Serial.begin(115200);
pinMode (13, OUTPUT);
lcd.begin(20, 4);
lcd.setBacklightPin(3,Positive);
lcd.setBacklight(HIGH);
rtc.begin();
lcd.createChar(0, dgrsChar);
lcd.setCursor (0, 0);
lcd.print(F(" Nandan DS "));
lcd.setCursor (0, 1);
lcd.print(F(" Jam Digital "));
delay (2000);
lcd.clear();
digitalWrite(13, HIGH);
delay (300);
digitalWrite(13, LOW);
delay (300);
digitalWrite(13, HIGH);
delay (300);
digitalWrite(13, LOW);
// rtc.setDOW (MINGGU);
// rtc.setTime (23, 59, 55); // Set Jam, Menit, Detik
// rtc.setDate (14, 3, 2017); // Set Tgl, Bulan, Tahun
}
void loop() {
t = rtc.getTime();
Day = rtc.getDoWStr(FORMAT_SHORT);
if (setMode == 0) {
if (((rtc.getDoWStr(FORMAT_SHORT)) == "SEN")) {
dy = 1;
}
if (((rtc.getDoWStr(FORMAT_SHORT)) == "SEL")) {
dy = 2;
}
if (((rtc.getDoWStr(FORMAT_SHORT)) == "RAB")) {
dy = 3;
}
if (((rtc.getDoWStr(FORMAT_SHORT)) == "KAM")) {
dy = 4;
}
if (((rtc.getDoWStr(FORMAT_SHORT)) == "JUM")) {
dy = 5;
}
if (((rtc.getDoWStr(FORMAT_SHORT)) == "SAB")) {
dy = 6;
}
if (((rtc.getDoWStr(FORMAT_SHORT)) == "MIN")) {
dy = 7;
}
hh = t.hour, DEC;
mm = t.min, DEC;
ss = t.sec, DEC;
dd = t.date, DEC;
bb = t.mon, DEC;
yy = t.year, DEC;
}
if (setAlarm < 2) {
lcd.setCursor(2, 0);
if (setMode == 0)
lcd.print((rtc.getDoWStr(FORMAT_SHORT))); // Hari
else {
lcd.setCursor(2, 0);
lcd.print(Day); // Hari
lcd.setCursor(2, 0);
}
if (dy == 1) { // hari
lcd.print("SEN");
}
else if (dy == 2) {
lcd.print("SEL");
}
else if (dy == 3) {
lcd.print("RAB");
}
else if (dy == 4) {
lcd.print("KAM");
}
else if (dy == 5) {
lcd.print("JUM");
}
else if (dy == 6) {
lcd.print("SAB");
}
else if (dy == 7) {
lcd.print("MIN");
}
lcd.setCursor(5, 0);
lcd.print(", ");
if (dd < 10) { // Tanggal
lcd.print(F("0"));
}
lcd.print(dd); lcd.print(F(" "));
if (bb == 1) { // Bulan
lcd.print("JAN ");
}
else if (bb == 2) {
lcd.print("FEB ");
}
else if (bb == 3) {
lcd.print("MAR ");
}
else if (bb == 4) {
lcd.print("APR ");
}
else if (bb == 5) {
lcd.print("MEI ");
}
else if (bb == 6) {
lcd.print("JUN ");
}
else if (bb == 7) {
lcd.print("JUL ");
}
else if (bb == 8) {
lcd.print("AUG ");
}
else if (bb == 9) {
lcd.print("SEP ");
}
else if (bb == 10) {
lcd.print("OKT ");
}
else if (bb == 11) {
lcd.print("NOV ");
}
else if (bb == 12) {
lcd.print("DES ");
}
lcd.print(yy); lcd.print(F(" ")); // Tahun
lcd.setCursor(2, 1);
if (hh < 10) { // Jam
lcd.print(F("0"));
}
lcd.print(hh); lcd.print(F(":"));
if (mm < 10) {
lcd.print(F("0")); // Menit
}
lcd.print(mm); lcd.print(F(":"));
if (ss < 10) { // Detik
lcd.print(F("0"));
}
lcd.print(ss); lcd.print(F(" ")); //
lcd.print(rtc.getTemp() - 2); //
lcd.print((char)0); // Temperatur
lcd.print(F("C")); //
lcd.print(F(" ")); //
if (rtc.getTemp() > 40) {
lcd.setCursor(0, 0);
digitalWrite(13, HIGH);
lcd.print(" Suhu Terlalu Panas ");
delay (500); // Notifikasi Suhu Tinggi
lcd.setCursor(0, 0);
digitalWrite(13, LOW);
lcd.print(" ");
delay (500);
}
}
if ((hh == 0 && mm == 0 && ss == 0) || (hh == 1 && mm == 0 && ss == 0) || (hh == 2 && mm == 0 && ss == 0) ||
(hh == 3 && mm == 0 && ss == 0) || (hh == 4 && mm == 0 && ss == 0) || (hh == 5 && mm == 0 && ss == 0) ||
(hh == 6 && mm == 0 && ss == 0) || (hh == 7 && mm == 0 && ss == 0) || (hh == 8 && mm == 0 && ss == 0) ||
(hh == 9 && mm == 0 && ss == 0) || (hh == 10 && mm == 0 && ss == 0) || (hh == 11 && mm == 0 && ss == 0) ||
(hh == 12 && mm == 0 && ss == 0) || (hh == 13 && mm == 0 && ss == 0) || (hh == 14 && mm == 0 && ss == 0) ||
(hh == 15 && mm == 0 && ss == 0) || (hh == 16 && mm == 0 && ss == 0) || (hh == 17 && mm == 0 && ss == 0) ||
(hh == 18 && mm == 0 && ss == 0) || (hh == 19 && mm == 0 && ss == 0) || (hh == 20 && mm == 0 && ss == 0) ||
(hh == 21 && mm == 0 && ss == 0) || (hh == 22 && mm == 0 && ss == 0) || (hh == 23 && mm == 0 && ss == 0)) {
digitalWrite(13, HIGH);
delay (300); // Buzzer Berbunyi Otomastis Setiap Jam
digitalWrite(13, LOW);
delay (300);
digitalWrite(13, HIGH);
delay (300);
digitalWrite(13, LOW);
delay (100);
}
if ((dd == 15 && bb == 3 && hh == 0 && mm == 0 && (ss >= 0 && ss <= 30))) {
lcd.setCursor(0, 1);
lcd.print("Selamat Ulang Tahun"); // Alarm Ultah 15 Maret 1992, Berbunyi selama 30 Detik
digitalWrite(13, HIGH);
lcd.noBacklight();
delay (300);
digitalWrite(13, LOW);
lcd.backlight();
delay (700);
lcd.clear();
}
setupClock();
Alarm (alarmHH, alarmMM, alarmLONG);
if (setAlarm < 2 && setMode != 0) {
delay (100);
}
if (setAlarm < 2 && setMode == 1) {
lcd.setCursor(2, 0); // Set Hari Cursor
lcd.print(F(" "));
delay(100);
}
if (setAlarm < 2 && setMode == 2) {
lcd.setCursor(7, 0); // Set Tanggal Cursor
lcd.print(F(" "));
delay(100);
}
lcd.setCursor(10, 0);
if (setAlarm < 2 && setMode == 3) { // Set Bulan Cursor
lcd.print(F(" "));
delay(100);
}
if (setAlarm < 2 && setMode == 4) {
lcd.setCursor(14, 0); // Set Tahun Cursor
lcd.print(F(" "));
delay(100);
}
if (setAlarm < 2 && setMode == 5) {
lcd.setCursor(2, 1); // Set Jam Cursor
lcd.print(F(" "));
delay(100);
}
if (setAlarm < 2 && setMode == 6) {
lcd.setCursor(5, 1); // Set Menit Cursor
lcd.print(F(" "));
delay(100);
}
if (setAlarm < 2 && setMode == 7) {
lcd.setCursor(8, 1); // Set detik Cursor
lcd.print(F(" "));
delay(100);
}
if (setMode == 0 && setAlarm != 0 && setAlarm != 1) {
delay (100);
}
// if (setMode == 0 && setAlarm == 1) {
// lcd.clear();
// lcd.setCursor(0, 0); // Notifikasi Alarm OFF
// lcd.print(F(" Alarm OFF "));
// delay(1500);
// setMode = 0;
// }
if (setMode == 0 && setAlarm == 2) {
lcd.setCursor(11, 0); // Set Alarm Jam Cursor
lcd.print(F(" "));
delay(100);
}
if (setMode == 0 && setAlarm == 3) {
lcd.setCursor(14, 0); // Set Alarm Menit Cursor
lcd.print(F(" "));
delay(100);
}
if (setMode == 0 && setAlarm == 4 && alarmLONG > 9) {
lcd.setCursor(11, 1); // Set Lama Alarm Cursor
lcd.print(F(" "));
delay(100);
}
if (setMode == 0 && setAlarm == 4 && alarmLONG < 10) {
lcd.setCursor(11, 1); // Set Lama Alarm Cursor
lcd.print(F(" "));
delay(100);
}
Serial.print (setMode);
Serial.print (" ");
Serial.println (setAlarm);
}
void setupClock (void) {
btnUP.read();
btnDN.read();
btnSET.read();
btnALR.read();
if (setMode == 8) {
lcd.setCursor (0, 0);
lcd.print (F(" PENGATURAN JAM "));
lcd.setCursor (0, 1);
lcd.print (F(" DI SIMPAN "));
digitalWrite(13, HIGH);
delay (300);
digitalWrite(13, LOW);
delay (2000);
rtc.setDoW (dy);
rtc.setTime (hh, mm, ss); // Simpan Pengaturan Jam ke RTC
rtc.setDate (dd, bb, yy);
lcd.clear();
setMode = 0;
}
if (setAlarm == 5) {
lcd.setCursor (0, 0);
lcd.print (F(" ALARM DISIMPAN "));
lcd.setCursor (0, 1);
if (alarmHH < 10) {
lcd.print(F("0"));
}
lcd.print (alarmHH);
lcd.print (F(":"));
if (alarmMM < 10) { // Alarm disimpan
lcd.print(F("0"));
}
lcd.print (alarmMM);
lcd.print (F(" LAMA ALARM "));
lcd.print(alarmLONG); lcd.print(F("M"));
digitalWrite(13, HIGH);
delay (300);
digitalWrite(13, LOW);
delay (3000);
lcd.clear();
setAlarm = 0;
alarmMode = 1;
}
if (setAlarm > 0) {
alarmMode = 0;
}
switch (STATE) {
case WAIT:
if (btnSET.pressed())
{
setMode = setMode + 1;
}
if (btnALR.pressed())
{
setAlarm = setAlarm + 1;
}
if (btnUP.pressed())
STATE = INCR;
else if (btnDN.pressed())
STATE = DECR;
else if (btnUP.released())
rpt = REPEAT_FIRST;
else if (btnDN.released())
rpt = REPEAT_FIRST;
else if (btnUP.pressed(rpt)) {
rpt += REPEAT_INCR;
STATE = INCR;
}
else if (btnDN.pressed(rpt)) {
rpt += REPEAT_INCR;
STATE = DECR;
}
break;
case INCR:
if (setAlarm < 2 && setMode == 1 && dy < 7)dy = dy + 1;
if (setAlarm < 2 && setMode == 2 && dd < 31)dd = dd + 1;
if (setAlarm < 2 && setMode == 3 && bb < 12)bb = bb + 1;
if (setAlarm < 2 && setMode == 4 && yy < 2050)yy = yy + 1;
if (setAlarm < 2 && setMode == 5 && hh < 23)hh = hh + 1;
if (setAlarm < 2 && setMode == 6 && mm < 59)mm = mm + 1;
if (setAlarm < 2 && setMode == 7 && ss < 59)ss = ss + 1;
if (setMode == 0 && setAlarm == 2 && alarmHH < 23)alarmHH = alarmHH + 1;
if (setMode == 0 && setAlarm == 3 && alarmMM < 59)alarmMM = alarmMM + 1;
if (setMode == 0 && setAlarm == 4 && alarmLONG < 59)alarmLONG = alarmLONG + 1;
STATE = WAIT;
break;
case DECR:
if (setAlarm < 2 && setMode == 1 && dy > 0)dy = dy - 1;
if (setAlarm < 2 && setMode == 2 && dd > 0)dd = dd - 1;
if (setAlarm < 2 && setMode == 3 && bb > 0)bb = bb - 1;
if (setAlarm < 2 && setMode == 4 && yy > 2000)yy = yy - 1;
if (setAlarm < 2 && setMode == 5 && hh > 0)hh = hh - 1;
if (setAlarm < 2 && setMode == 6 && mm > 0)mm = mm - 1;
if (setAlarm < 2 && setMode == 7 && ss > 0)ss = ss - 1;
if (setMode == 0 && setAlarm == 2 && alarmHH > 0)alarmHH = alarmHH - 1;
if (setMode == 0 && setAlarm == 3 && alarmMM > 0)alarmMM = alarmMM - 1;
if (setMode == 0 && setAlarm == 4 && alarmLONG > 0)alarmLONG = alarmLONG - 1;
STATE = WAIT;
break;
}
}
void Alarm (uint8_t alarmHH, uint8_t alarmMM, int alarmLONG) {
if (alarmMode == 1 && hh == alarmHH && (mm - alarmMM >= 0 ) && (mm - alarmMM <= alarmLONG )) {
digitalWrite(13, HIGH); // Menyalakan Alarm
delay (500);
digitalWrite (13, LOW);
delay (500);
if (ss % 2 == 0) {
lcd.noBacklight();
}
else {
lcd.backlight ();
}
btnALR.read();
if (btnALR.pressed())
{
alarmMode = 0;
lcd.backlight();
}
}
else {
digitalWrite (13, LOW);
lcd.backlight();
}
if (setMode == 0 && setAlarm != 0 && setAlarm != 1) {
lcd.setCursor (0, 0);
lcd.print(F("Set Alarm ")); // Menampilkan Set Jam Alarm
if (alarmHH < 10) {
lcd.print(F("0"));
}
lcd.print (alarmHH); lcd.print(F(":"));
if (alarmMM < 10) { // Menampilkan Set Menit Alarm
lcd.print(F("0"));
}
lcd.print (alarmMM); lcd.print(F(" WIB"));
lcd.setCursor (0, 1);
lcd.print(F("Lama Alarm ")); // Menampilkan Set Lama Alarm
if (alarmLONG < 10) {
lcd.print(F("0"));
}
lcd.print(alarmLONG); lcd.print(F(" Menit"));
}
}