#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16,2);
RTC_DS1307 clock;
byte hora, minuto, segundo, ds, dia, mes, menu = 0;
uint16_t ano;


void setup() 
{
  lcd.begin(16,2);
  clock.begin();
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
}

void loop() 
{
  relogio();
  botao();
  selecionaMenu();
}

void relogio()
{
  DateTime t = clock.now();
  hora    = t.hour();
  minuto  = t.minute();
  segundo = t.second();  
  dia     = t.day();
  mes     = t.month();
  ano     = t.year();
  ds      = t.dayOfTheWeek(); 
  
  lcd.setCursor(4,0);
  lcd.print(hora / 10);
  lcd.print(hora % 10);
  lcd.print(":");
  lcd.print(minuto / 10);
  lcd.print(minuto % 10);
  lcd.print(":");
  lcd.print(segundo / 10);
  lcd.print(segundo % 10); 

  lcd.setCursor(0,1);
  lcd.print(dia / 10);
  lcd.print(dia % 10);
  lcd.print("/");
  lcd.print(mes / 10);
  lcd.print(mes % 10);
  lcd.print("/");
  lcd.print(ano / 10);
  lcd.print(ano % 10); 

  lcd.setCursor(13,1); 
  switch(ds)
  {
    case 0: lcd.print("DOM"); break;
    case 1: lcd.print("SEG"); break;
    case 2: lcd.print("TER"); break;
    case 3: lcd.print("QUA"); break;
    case 4: lcd.print("QUI"); break;
    case 5: lcd.print("SEX"); break;
    case 6: lcd.print("SAB"); break;
  }
}

void botao()
{
  if(menu == 1)
  {
    lcd.setCursor(4,0);
    lcd.print(hora / 10);
    lcd.print(hora % 10);
    delay(100);

    lcd.setCursor(4,0);
    lcd.print(" ");
    lcd.print(" ");
    delay(25);
  
    if(!digitalRead(8))      // acerta a hora
    {
      hora++;
      if(hora > 23) hora = 0;
      clock.adjust(DateTime(ano, mes, dia, hora, minuto, segundo));
      while(!digitalRead(8));
    }  
  }

  else if(menu == 2)
  {
    lcd.setCursor(7,0);
    lcd.print(minuto / 10);
    lcd.print(minuto % 10);
    delay(100);

    lcd.setCursor(7,0);
    lcd.print(" ");
    lcd.print(" ");
    delay(100);

    if(!digitalRead(8))     // acerta o minuto
    {
      minuto++;
      if(minuto > 59) minuto = 0;
      clock.adjust(DateTime(ano, mes, dia, hora, minuto, segundo));
      while(!digitalRead(8));
    }
  }

  else if(menu == 3)
  {
    lcd.setCursor(0,1);
    lcd.print(dia / 10);
    lcd.print(dia % 10);
    delay(100);

    lcd.setCursor(0,1);
    lcd.print(" ");
    lcd.print(" ");
    delay(100);

    if(!digitalRead(8))     // acerta o minuto
    {
      dia++;
      if(dia > 59) dia = 0;
      clock.adjust(DateTime(ano, mes, dia, hora, minuto, segundo));
      while(!digitalRead(8));
    }
  } 
  
  else if(menu == 4)
  {
    lcd.setCursor(3,1);
    lcd.print(mes / 10);
    lcd.print(mes % 10);
    delay(100);

    lcd.setCursor(3,1);
    lcd.print(" ");
    lcd.print(" ");
    delay(100);

    if(!digitalRead(8))     // acerta o minuto
    {
      mes++;
      if(mes > 59) mes = 0;
      clock.adjust(DateTime(ano, mes, dia, hora, minuto, segundo));
      while(!digitalRead(8));
    }
  }
}

void selecionaMenu()
{
  if(!digitalRead(7))
  {
    menu++;
    if(menu > 6) menu = 0;
    delay(400);
  }
}
GND5VSDASCLSQWRTCDS1307+