#include "RTClib.h" //library RTC1307
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //library LCD16x2I2C
RTC_DS1307 rtc; //inisialisasi rtc
LiquidCrystal_I2C lcd(0x27, 16, 2); //inisialisasi lcd 16x2
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; //inisialisasi hari (weekday)
int menu; //inisialisasi menu
int second,minute,hour,weekday; //inisialisasi detik,menit,jam,hari
int monthday,month,year; //inisialisasi tanggal,bulan,tahun
boolean up = false;
boolean down = false;
void setup () {
lcd.init();
lcd.backlight();
Wire.begin();
Serial.begin(9600);
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
pinMode(11,INPUT_PULLUP);
//tampilan awal
lcd.setCursor(0,0);
lcd.print("Kalender Digital");
delay(2000);
lcd.clear();
//cek rtc
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
simpan_rtc();
}
void loop()
{
display();
tombol();
}
void tombol(){
if (digitalRead(8)==0){
lcd.clear();
lcd.print("Setting RTC");
delay(2000);
menu++;
lcd.clear();
display();
lcd.blink();
do{
//------------------------next
if (digitalRead(8)==0){
delay(300);
menu++;
}
//-- ------------------back
else if (digitalRead(9)==0){
delay(300);
if (menu > 1){
menu--;
}
}
//---------------------------up
else if(digitalRead(10)==0){
delay(200);
up=true;
}
//----------------------------down
else if(digitalRead(11)==0){
delay(200);
down=true;
}
//-------------------------edit data jam
if (menu==1){
if(up==true && hour<24){
hour++;
display_edit();
}
else if(down==true && hour>0){
hour--;
display_edit();
}
up=false;
down=false;
if (hour<10){
lcd.setCursor(5,0);
}
else {
lcd.setCursor(6,0);
}
}
//-------------------------edit data menit
else if (menu==2){
if (up==true && minute<59){
minute++;
display_edit();
}
else if (down==true && minute>0){
minute--;
display_edit();
}
up=false;
down=false;
if (hour<10 && minute<10){
lcd.setCursor(7,0);
}
else if (hour<10 && minute>9) {
lcd.setCursor(8,0);
}
else if (hour>9 && minute<10){
lcd.setCursor(8,0);
}
else if (hour>9 && minute>9){
lcd.setCursor(9,0);
}
}
//-------------------------edit data detik
else if (menu==3){
if (up==true && second<59){
second++;
display_edit();
}
else if (down==true && second>0){
second--;
display_edit();
}
up=false;
down=false;
if (hour<10 && minute<10 && second<10){
lcd.setCursor(9,0);
}
else if (hour<10 && minute<10 && second>9){
lcd.setCursor(10,0);
}
else if (hour<10 && minute>9 && second<10){
lcd.setCursor(10,0);
}
else if (hour>9 && minute<10 && second<10){
lcd.setCursor(10,0);
}
else if (hour<10 && minute>9 && second>9){
lcd.setCursor(11,0);
}
else if (hour>9 && minute>9 && second<10){
lcd.setCursor(11,0);
}
else if (hour>9 && minute<10 && second>9){
lcd.setCursor(11,0);
}
else if (hour>9 && minute>9 && second>9){
lcd.setCursor(12,0);
}
}
//-------------------------edit data hari
else if (menu==4){
if (up==true && weekday < 6){
weekday++;
display_edit();
}
else if (down==true && weekday>0){
weekday--;
display_edit();
}
up=false;
down=false;
lcd.setCursor(1,1);
}
//-------------------------edit data tanggal
else if (menu==5){
if (up==true && monthday < 31){
monthday++;
display_edit();
}
else if (down==true && monthday>1){
monthday--;
display_edit();
}
up=false;
down=false;
if (monthday<10){
lcd.setCursor(5,1);
}
else {
lcd.setCursor(6,1);
}
}
//-------------------------edit data bulan
else if (menu==6){
if (up==true && month < 12){
month++;
display_edit();
}
else if (down==true && month>1){
month--;
display_edit();
}
up=false;
down=false;
if (monthday<10 && month<10){
lcd.setCursor(7,1);
}
else if (monthday<10 && month>9){
lcd.setCursor(8,1);
}
else if (monthday>9 && month<10){
lcd.setCursor(8,1);
}
else if (monthday>9 && month>9){
lcd.setCursor(9,1);
}
}
//-------------------------edit data tahun
else if (menu==7){
if (up==true && year < 99){
year++;
display_edit();
}
else if (down==true && year>0){
year--;
display_edit();
}
up=false;
down=false;
if (monthday<10 && month<10 && year<10){
lcd.setCursor(11,1);
}
else if (monthday<10 && month<10 && year>9){
lcd.setCursor(12,1);
}
else if (monthday<10 && month>9 && year<10){
lcd.setCursor(12,1);
}
else if (monthday>9 && month<10 && year<10){
lcd.setCursor(12,1);
}
else if (monthday<10 && month>9 && year>9){
lcd.setCursor(13,1);
}
else if (monthday>9 && month>9 && year<10){
lcd.setCursor(13,1);
}
else if (monthday>9 && month<10 && year>9){
lcd.setCursor(13,1);
}
else if (monthday>9 && month>9 && year>9){
lcd.setCursor(14,1);
}
}
// Serial.println(menu);
//-------------------------simpan data RTC
if(menu==8)settingRTC();
}
while(menu<8);
lcd.clear();
lcd.noBlink();
lcd.print("Setting RTC OK!");
delay(1000);
lcd.clear();
menu=0;
}
}
void display () {
DateTime now = rtc.now();
lcd.setCursor(0,0);
lcd.print("Time: ");
lcd.setCursor(5,0);
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
lcd.setCursor(0,1);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.print(", ");
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
}
void simpan_rtc()
{
DateTime now = rtc.now();
hour=now.hour();
minute=now.minute();
second=now.second();
monthday=now.day();
month=now.month();
year=now.year();
}
void display_edit () {
//DateTime now = rtc.now();
lcd.setCursor(0,0);
lcd.print("Time: ");
lcd.setCursor(5,0);
lcd.print(hour);
lcd.print(':');
lcd.print(minute);
lcd.print(':');
lcd.print(second);
lcd.setCursor(0,1);
hari();
lcd.setCursor(5,1);
lcd.print(monthday);
lcd.print('/');
lcd.print(month);
lcd.print("/");
lcd.print(year);
}
void hari()
{
if(weekday==0){
lcd.print("Sun, ");
}
else if(weekday==1){
lcd.print("Mon, ");
}
else if(weekday==2){
lcd.print("Tue, ");
}
else if(weekday==3){
lcd.print("Wed, ");
}
else if(weekday==4){
lcd.print("Thu, ");
}
else if(weekday==5){
lcd.print("Fri, ");
}
else if(weekday==6){
lcd.print("Sat, ");
}
}
void settingRTC(){
rtc.adjust(DateTime(year, month, monthday, hour, minute, second)); // Set Tahun, bulan, tanggal, jam, menit, detik secara manual
}