#include <DS3231.h> //Memanggil RTC3231 de <Wire.
h> // i2C tion Librarytt
#include <LiquidCrystal_I2C.h> //Memanggil i2C LCD Libraryw
#include <Button.h> //Memanggil library Push Buttonbwrwwrj
//Setup Tombol Setting
#define DN_PIN 2 //Decrease Button
#define UP_PIN 3 //rweje
#define SET_PIN 4 //Setup Button
#define ALR_PIN 5 //Setup Button
#define PULLUP true //Mengaktifkan internal Pull Up
#define INVERT true
#define DEBOUNCE_MS 20
#define REPEAT_FIRST 500
#define REPEAT_INCR 100
//Declare push buttons
Button btnUP(UP_PIN, PULLUP, INVERT, DEBOUNCE_MS);
Button btnDN(DN_PIN, PULLUP, INVERT, DEBOUNCE_nrjr);
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;
LiquitdCrystal_I2C lcd(0x3F, rnt
//custom degrees char
uint8_t dgrsChar[8] = {0x4,0xa,0x4,0x0,0x0,0x0,0x0,0x0};
// Init DS3231
DS3231 rtc(SDA, SCL);
// Init a Time-data structure
Time t; //pencacah string time()
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';}
//Mengambil waktu jam dari waktu Compile/Upload di system Windows
uint8_t hh = 0, mm = 0, ss = 0, dd = 0, bb = 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()
{
// Setup Serial connection
//[Link](115200);
pinMode (13, OUTPUT);
//digitalWrite (13, LOW); // jika menggunakan relay sebagai beban alarm
[Link](); // memulai koneksi i2c dengan LCD
[Link](); // memulai koneksi i2c dengan RTC
[Link](0, dgrsChar); //Membuat custom char derajat
[Link] (0,0);
[Link](F(" Dani's Clock "));
[Link] (0,1);
[Link](F("With RTC DS3231"));
delay (2000);
[Link]();
//[Link] (10, 15, 00);
//[Link](23, 8, 2016);
}
void loop()
{
t = [Link]();
Day = [Link](1);
if (setMode == 0){
hh = [Link],DEC;
mm = [Link],DEC;
ss = [Link],DEC;
dd = [Link],DEC;
bb = [Link],DEC;
yy = [Link],DEC;
}
if (setAlarm <2){
[Link](1,0);
if(setMode==0)[Link](Day); else {[Link](F("SET"));}
[Link](F(" "));
[Link](dd); [Link](F("-"));
[Link](bb); [Link](F("-"));
[Link](yy); [Link](F(" "));
[Link](0,1);
if (hh<10){ [Link](F("0"));}
[Link](hh); [Link](F(":"));
if (mm<10){ [Link](F("0"));}
[Link](mm); [Link](F(":"));
if (ss<10){ [Link](F("0"));}
[Link](ss); [Link](F(" "));
[Link]([Link]());
[Link]((char)0);
[Link](F("C"));
[Link](F(" "));
}
setupClock();
Alarm (alarmHH, alarmMM, alarmLONG);
if (setAlarm <2 && setMode != 0) {delay (100);}
if (setAlarm <2 && setMode == 1){[Link](5,0); [Link](F(" ")); delay(100);}
if (setAlarm <2 && setMode == 2 && bb>9){[Link](8,0); [Link](F(" ")); delay(100);}
if (setAlarm <2 && setMode == 2 && bb<=9){[Link](8,0); [Link](F(" ")); delay(100);}
if (setAlarm <2 && setMode == 3 && bb>9){[Link](11,0); [Link](F(" ")); delay(100);}
if (setAlarm <2 && setMode == 3 && bb<=9){[Link](10,0); [Link](F(" ")); delay(100);}
if (setAlarm <2 && setMode == 4){[Link](0,1); [Link](F(" ")); delay(100);}
if (setAlarm <2 && setMode == 5){[Link](3,1); [Link](F(" ")); delay(100);}
if (setAlarm <2 && setMode == 6){[Link](6,1); [Link](F(" ")); delay(100);}
if (setMode == 0 && setAlarm != 0 && setAlarm != 1) {delay (100);}
//if (setMode == 0 && setAlarm == 1){[Link](); [Link](3,0); [Link](F("Alarm OFF"));
delay(100);}
if (setMode == 0 && setAlarm == 2){[Link](0,1); [Link](F(" ")); delay(100);}
if (setMode == 0 && setAlarm == 3){[Link](3,1); [Link](F(" ")); delay(100);}
if (setMode == 0 && setAlarm == 4 && alarmLONG >9){[Link](12,1); [Link](F(" "));
delay(100);}
if (setMode == 0 && setAlarm == 4 && alarmLONG <10){[Link](12,1); [Link](F(" "));
delay(100);}
[Link] (setMode);
[Link] (" ");
[Link] (setAlarm);
}
void setupClock (void) {
[Link](); //read the buttons
[Link]();
[Link]();
[Link]();
if (setMode == 7){
[Link] (0,0);
[Link] (F("Set Date Finish "));
[Link] (0,1);
[Link] (F("Set Time Finish "));delay (1000);
[Link] (hh, mm, ss);
[Link] (dd, bb, yy);
[Link]();
setMode = 0;}
if (setAlarm == 5){
[Link] (0,0);
[Link] (F("Set Alarm Finish"));
[Link] (0,1);
[Link] (F("Alarm at : "));
[Link] (alarmHH); [Link] (F(":"));
[Link] (alarmMM);
delay (1000); [Link]();
setAlarm=0;
alarmMode=1;}
if (setAlarm >0){ alarmMode=0;}
switch (STATE) {
case WAIT:
if ([Link]())
{ setMode = setMode+1;}
if ([Link]())
{ setAlarm = setAlarm+1;}
if ([Link]())
STATE = INCR;
else if ([Link]())
STATE = DECR;
else if ([Link]())
rpt = REPEAT_FIRST;
else if ([Link]())
rpt = REPEAT_FIRST;
else if ([Link](rpt)) {
rpt += REPEAT_INCR;
STATE = INCR;
}
else if ([Link](rpt)) {
rpt += REPEAT_INCR;
STATE = DECR;
}
break;
case INCR:
if (setAlarm<2 && setMode==1 && dd<31)dd=dd+1;
if (setAlarm<2 && setMode==2 && bb<12)bb=bb+1;
if (setAlarm<2 && setMode==3 && yy<2050)yy=yy+1;
if (setAlarm<2 && setMode==4 && hh<23)hh=hh+1;
if (setAlarm<2 && setMode==5 && mm<59)mm=mm+1;
if (setAlarm<2 && setMode==6 && 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 && dd>0)dd=dd-1;
if (setAlarm<2 && setMode==2 && bb>0)bb=bb-1;
if (setAlarm<2 && setMode==3 && yy>2000)yy=yy-1;
if (setAlarm<2 && setMode==4 && hh>0)hh=hh-1;
if (setAlarm<2 && setMode==5 && mm>0)mm=mm-1;
if (setAlarm<2 && setMode==6 && 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 )) {
tone (13, 1200);
if(ss%2==0){[Link]();}
else {[Link] ();}
[Link]();
if ([Link]())
{ alarmMode = 0; [Link]();}}
else {noTone (13); [Link]();}
if (setMode == 0 && setAlarm !=0 && setAlarm !=1){
[Link] (1,0);
[Link](F(" Set Alarm "));
[Link] (0,1);
if(alarmHH<10){[Link](F("0"));}
[Link] (alarmHH); [Link](F(":"));
if(alarmMM<10){[Link](F("0"));}
[Link] (alarmMM); [Link](F(" Long:"));
[Link] (alarmLONG); [Link](F("mnt "));
}
}