
//Classess
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>

//Constants
#define DS3231_I2C_ADDRESS 0x68
#define POLSADOR_1 5
#define POLSADOR_2 6
#define POLSADOR_3 7
#define RETARD 200

// Constructors
LiquidCrystal_I2C lcd(0x27,16,2); //0x27 is the LCD Address
DS3231 clock;

// Variables
int menu = 1;
int sortir = 0;
int hora ;
int minut ;
int segon ;
int dia ;
int mes ;
int any ;
int setmana; 
int utc =1;
int diferencia=1;

bool century = false;
bool h12;
bool pm;

String dia_setmana[7]={"Diumeng", "Dilluns","Dimarts","Dimecre","Dijous ","Divendr","Dissabt"};
                                                                                                                                                                                                                                                                                                                                              
void setup(){
  Wire.begin();
  lcd.backlight();  
  lcd.init();
  lcd.clear();
  pinMode(POLSADOR_1,INPUT_PULLUP);
  pinMode(POLSADOR_2,INPUT_PULLUP);
  pinMode(POLSADOR_3,INPUT_PULLUP);
}
   
void ajusta_hora(){
    sortir=0;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Hora UTC");
    delay(RETARD);
    hora =clock.getHour(h12, pm);
    while ( sortir == 0){
    if (digitalRead(POLSADOR_1)==0){
      sortir=1;
      }
    if (digitalRead(POLSADOR_2)==0){
      hora =hora +1;
      }
    if (digitalRead(POLSADOR_3)==0){
      hora =hora -1;
      }
    if (hora >23){
      hora =0;
      }
    if (hora <0){
      hora =23;
      }
    lcd.setCursor(0,1);
    if(hora <10){
    lcd.print(" ");   
      }
    lcd.print(hora );  
    delay(RETARD);
  }
  clock.setHour(hora );
  
}

void ajusta_minut(){
    sortir=0;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Minut");
    delay(RETARD);
    minut =clock.getMinute();
    while ( sortir == 0){
    if (digitalRead(POLSADOR_1)==0){
      sortir=1;
      }
    if (digitalRead(POLSADOR_2)==0){
      minut =minut +1;
      }
    if (digitalRead(POLSADOR_3)==0){
      minut =minut -1;
      }
    if (minut >59){
      minut =0;
      }
    if (minut <0){
      minut =59;
      }
    lcd.setCursor(0,1);
    if(minut <10){
    lcd.print(" ");   
      }
    lcd.print(minut ); 
    delay(RETARD); 
   
  }
  clock.setMinute(minut );
}
    

void ajusta_segon(){
    sortir=0;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Segon");
    delay(RETARD);
    segon =clock.getSecond();
    while ( sortir == 0){
    if (digitalRead(POLSADOR_1)==0){
      sortir=1;
      }
    if (digitalRead(POLSADOR_2)==0){
      segon =segon +1;
      }
    if (digitalRead(POLSADOR_3)==0){
      segon = segon-1;
      }
    if (segon >59){
      segon = 0;
      }
    if (segon<0){
      segon = 59;
      }
    lcd.setCursor(0,1);
    if(segon <10){
    lcd.print(" ");   
      }
    lcd.print(segon);  
    delay(RETARD);
  }
  clock.setSecond(segon);
  }
  
void ajusta_dia(){
    sortir=0;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Dia");
    delay(RETARD);
    dia =clock.getDate();
    while ( sortir == 0){
    if (digitalRead(POLSADOR_1)==0){
      sortir=1;
      }
    if (digitalRead(POLSADOR_2)==0){
      dia = dia+1;
      }
    if (digitalRead(POLSADOR_3)==0){
      dia = dia-1;
      }
    if (dia >31){
      dia =1;
      }
    if (dia<1){
      dia = 31;
      }
    lcd.setCursor(0,1);
    if(dia <10){
    lcd.print(" ");   
      }
    lcd.print(dia);  
    delay(RETARD);
  }
  clock.setDate(dia);
  }

 
void ajusta_mes(){
    sortir=0;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Mes");
    delay(RETARD);
    mes =clock.getMonth(century);
    while ( sortir == 0){
    if (digitalRead(POLSADOR_1)==0){
      sortir=1;
      }
    if (digitalRead(POLSADOR_2)==0){
      mes = mes+1;
      }
    if (digitalRead(POLSADOR_3)==0){
      mes = mes-1;
      }
    if (mes >12){
      mes =1;
      }
    if (mes < 1){
      mes = 12;
      }
    lcd.setCursor(0,1);
    if(mes < 10){
    lcd.print(" ");   
      }
    lcd.print(mes);  
    delay(RETARD);
  }
  clock.setMonth(mes);
  }
  
void ajusta_any(){
    sortir=0;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Any");
    delay(RETARD);
    any =clock.getYear();
    while ( sortir == 0){
    if (digitalRead(POLSADOR_1)==0){
      sortir=1;
      }
    if (digitalRead(POLSADOR_2)==0){
      any = any+1;
      }
    if (digitalRead(POLSADOR_3)==0){
      any = any-1;
      }
    if (any >99){
      any = 21;
      }
    if (any < 21){
      any = 21;
      }
    lcd.setCursor(0,1);
    if(any<10){
    lcd.print(" ");   
      }
    lcd.print(any);  
    delay(RETARD);
  }
  clock.setYear(any);
  }
  
void ajusta_setmana(){
      sortir=0;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Dia setmana");
    delay(RETARD);
    setmana =clock.getDoW();
    while ( sortir == 0){
    if (digitalRead(POLSADOR_1)==0){
      sortir=1;
      }
    if (digitalRead(POLSADOR_2)==0){
      setmana = setmana+1;
      }
    if (digitalRead(POLSADOR_3)==0){
      setmana = setmana-1;
      }
    if (setmana > 6){
      setmana = 0;
      }
    if (setmana < 0){
      setmana = 6;
      }
    lcd.setCursor(0,1);
    if(any<10){
    lcd.print(" ");   
      }
    lcd.print(dia_setmana[setmana]);
    delay(RETARD);
  }
  clock.setDoW(setmana);
  }

void hora_local(){
  hora =clock.getHour(h12,pm);
  minut =clock.getMinute();
  segon =clock.getSecond();
  dia = clock.getDate();
  mes = clock.getMonth(century);
  setmana = clock.getDoW();

  if (hora==0 and minut==0 and segon>=0){
    if (mes==10 and dia>22 and setmana==0){
      diferencia=2;
      }
    if (mes==3 and dia>22 and setmana==0){
      diferencia=1;
      }
  }
return diferencia;
}
   

void mostra_hora(){

  hora =clock.getHour(h12,pm);
  minut =clock.getMinute();
  segon =clock.getSecond();
  dia = clock.getDate();
  mes = clock.getMonth(century);
  any = clock.getYear();
  setmana = clock.getDoW();

  lcd.setCursor(0,0);
  delay (RETARD);
if (utc==0){
  hora_local();
  lcd.print("Local   ");
  hora=hora+diferencia;
  }
else{
  lcd.print("UTC     ");
  }
  if (hora<10){
    lcd.print("0");}
  lcd.print(hora ); 
  lcd.print(":");
  if (minut<10){
    lcd.print("0");}
  lcd.print(minut ); 
  lcd.print(":");
  if (segon<10){
    lcd.print("0");}
  lcd.print(segon ); 
  lcd.setCursor(0,1);
  lcd.print(dia_setmana[setmana]);
  lcd.print(" ");
  if (dia<10){
    lcd.print("0");}
 lcd.print(dia); 
  lcd.print("-");
  if (mes<10){
    lcd.print("0");}
  lcd.print(mes); 
  lcd.print("-");
  lcd.print(any); 
  }

void loop(){
sortir=0;
delay(RETARD);  
if (digitalRead(POLSADOR_3)==0){
      if(utc == 0){
        utc=1;
      }
      else{
        utc=0;
      }
}
if (digitalRead(POLSADOR_1)==0){
      if (menu<7){
      menu=menu+1;}
      else{
      menu=1;  }
      sortir=1;
      }
if (sortir == 1){
    if (menu == 1){
      ajusta_hora();
    }  
    if (menu == 2){
      ajusta_minut();
    }  
    if (menu == 3){
      ajusta_segon();
    }  
    if (menu == 4){
      ajusta_dia();
    }  
    if (menu == 5){
      ajusta_mes();
    }  
    if (menu == 6){
      ajusta_any();
    }  
    if (menu == 7){
      ajusta_setmana();
    }
}     

mostra_hora(); 
    

} 
