#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
RTC_DS1307 DS1307;
LiquidCrystal_I2C LCD(0x27,16,2);
DateTime datumCas;
byte SET = 9, UP = 10, DOWN = 11,page = 0;
long refreshLimit,blinkLimit;
bool MenuShowed = false, ON=true;
int hour,minute,day,month,year,interval = 250,del = 150;
void setup () {
LCD.init();
LCD.backlight();
for(int i = 9; i <12; i++){
pinMode(i,INPUT_PULLUP);
}
if (! DS1307.begin()) {
LCD.print("NEpripojeno!");
while (1);
}
if (! DS1307.isrunning()) {
LCD.print("NEspusteny!");
}
DS1307.adjust(DateTime(__DATE__,__TIME__));
}
void loop () {
datumCas = DS1307.now();
if(((millis()-interval)>refreshLimit) && !MenuShowed){
refreshLimit = millis();
Show();
}
if(!digitalRead(SET) ){
MenuShowed = true;
page = 1;
hour = datumCas.hour();
minute = datumCas.minute();
day = datumCas.day();
year= datumCas.year();
month=datumCas.month();
delay(del);
}
if(MenuShowed){
switch(page){
case 1: Page1();break;//h
case 2: Page2();break;//m
case 3: Page3();break;//d
case 4: Page4();break;//m
case 5: Page5();break;//y
case 6: OKScreen();break;
}
}
}
void Show(){
if((millis()-blinkLimit)>500){
ON=!ON;
blinkLimit = millis();
}
LCD.setCursor(0,0);
LCD.print(" ");
LCD.print(datumCas.hour() < 10? "0"+String(datumCas.hour()) : datumCas.hour() );
ON == true?LCD.print(':'): LCD.print(' ');
LCD.print(datumCas.minute() < 10? "0"+String(datumCas.minute()) : datumCas.minute());
ON == true?LCD.print(':'): LCD.print(' ');
LCD.print(datumCas.second() < 10? "0"+String(datumCas.second()):datumCas.second());
LCD.print(" ");
LCD.setCursor(0,1);
LCD.print(" ");
LCD.print(datumCas.day() < 10? "0"+String(datumCas.day()):datumCas.day());
LCD.print('.');
LCD.print(datumCas.month()< 10? "0"+String(datumCas.month()):datumCas.month());
LCD.print('.');
LCD.print(datumCas.year() < 10? "0"+String(datumCas.year()):datumCas.year());
LCD.println(" ");
}
void Page1(){
LCD.setCursor(0,0);
LCD.print("SET TIME: HOUR " );
LCD.setCursor(0,1);
LCD.print(hour < 10? "0"+String(hour) : hour );
LCD.print(':');
LCD.print(minute < 10? "0"+String(minute) : minute);
LCD.print(" ");
if(!digitalRead(UP)){
hour++;
hour> 23 ? hour = 0: hour;
hour < 0 ? hour = 23 : hour;
delay(del);
}
if(!digitalRead(DOWN)){
hour--;
hour> 23 ? hour = 0: hour;
hour < 0 ? hour = 23 : hour;
delay(del);
}
if(MenuShowed && !digitalRead(SET)){
page = 2;
delay(250);
Page2();
}
}
void Page2(){
LCD.setCursor(0,0);
LCD.print("SET TIME: MINUTE " );
LCD.setCursor(0,1);
LCD.print(hour < 10? "0"+String(hour) : hour );
LCD.print(':');
LCD.print(minute < 10? "0"+String(minute) : minute);
LCD.print(" ");
if(!digitalRead(UP)){
minute++;
minute> 59 ? minute = 0: minute;
minute < 0 ? minute = 59 : minute;
delay(del);
}
if(!digitalRead(DOWN)){
minute--;
minute> 59 ? minute = 0: minute;
minute < 0 ? minute = 59 : minute;
delay(del);
}
if(MenuShowed && !digitalRead(SET)){
delay(250);
page = 3;
Page3();
}
}
void Page3(){
LCD.setCursor(0,0);
LCD.print("SET TIME: DAY " );
LCD.setCursor(0,1);
LCD.print(day < 10? "0"+String(day) : day );
LCD.print('.');
LCD.print(month < 10? "0"+String(month) : month);
LCD.print('.');
LCD.print(year < 10? "0"+String(year) : year);
LCD.print(" ");
if(!digitalRead(UP)){
day++;
day> 31 ? day = 1: day;
day < 1 ? day = 31 : day;
delay(del);
}
if(!digitalRead(DOWN)){
day--;
day> 31 ? day = 1: day;
day < 1 ? day = 31 : day;
delay(del);
}
if(MenuShowed && !digitalRead(SET)){
delay(250);
page = 4;
Page4();
}
}
void Page4(){
LCD.setCursor(0,0);
LCD.print("SET TIME: MONTH " );
LCD.setCursor(0,1);
LCD.print(day < 10? "0"+String(day) : day );
LCD.print('.');
LCD.print(month < 10? "0"+String(month) : month);
LCD.print('.');
LCD.print(year < 10? "0"+String(year) : year);
LCD.print(" ");
if(!digitalRead(UP)){
month++;
month> 12 ? month = 1: month;
month < 1 ? month = 12 : month;
delay(del);
}
if(!digitalRead(DOWN)){
month--;
month> 12 ? month = 1: month;
month < 1 ? month = 12 : month;
delay(del);
}
if(MenuShowed && !digitalRead(SET)){
delay(250);
page = 5;
Page5();
}
}
void Page5(){
LCD.setCursor(0,0);
LCD.print("SET TIME: YEAR " );
LCD.setCursor(0,1);
LCD.print(day < 10? "0"+String(day) : day );
LCD.print('.');
LCD.print(month < 10? "0"+String(month) : month);
LCD.print('.');
LCD.print(year < 10? "0"+String(year) : year);
LCD.print(" ");
if(!digitalRead(UP)){
year++;
delay(del);
}
if(!digitalRead(DOWN)){
year--;
delay(del);
}
if(MenuShowed && !digitalRead(SET)){
delay(250);
page = 6;
OKScreen();
}
}
void OKScreen(){
LCD.clear();
LCD.setCursor(0,0);
LCD.print(" OK ");
page = 0;
DS1307.adjust(DateTime(year, month, day, hour, minute, 0));
delay(400);
MenuShowed = false;
Show();
}