//Projeto baseado no estudo da biblioteca DS3231 de Eric Ayars

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

DS3231 Clock;

int hora, minuto, segundo, dia, mes, ano, DoW;
byte i;

bool Century=false;
bool h12;
bool PM;

LiquidCrystal_I2C lcd(0x27, 16,2);

void setup()
{
  Wire.begin();
  lcd.begin(16,2);
  lcd.backlight();
  Clock.getHour(h12, PM);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
}

void display()
{   
  char texto[20];
        
      hora    = Clock.getHour(h12, PM);
      minuto  = Clock.getMinute();
      segundo = Clock.getSecond();
      dia     = Clock.getDate();
      mes     = Clock.getMonth(Century);
      ano     = Clock.getYear();
         
      lcd.setCursor(0,0);
      sprintf(texto, "Hora: %02d:%02d:%02d",hora, minuto, segundo);
      lcd.print(texto);     
      lcd.setCursor(0,1);
      sprintf(texto, "Data: %02d/%02d/20%02d", dia, mes, ano);
      lcd.print(texto);  
}

void pisca_digito()
{
  byte j = 0;
  while(j < 5 && digitalRead(3) && digitalRead(4))
  {
    j++;
    delay(25);
  }
}
byte edit(byte x, byte y, byte modifica)
{
  char text[3];
  while(!digitalRead(3));                         // Enquanto o botão (pino # 3) estiver pressionado e
  while(true)                                     // Enquanto for verdadeira essa condição e
  {
    while(!digitalRead(4))                        // Enquanto o botão (pino # 4) estiver pressionado
    {                      
      modifica++;                                 // A variávelmodifica incrementa mais 1
      if(i == 0 && modifica > 23)                 // Se a hora for maior que 23, volta a ser = 0
        modifica = 0;
      if(i == 1 && modifica > 59)                 // Se minuto for maior que 59, volta a ser = 0
        modifica = 0;
      if(i == 2 && modifica > 31)                 // Se a data for maior que 31, volta a ser = 1
        modifica = 1;
      if(i == 3 && modifica > 12)                 // Se o mês for maior que 12, volta a ser = 1
        modifica = 1;
      if(i == 4 && modifica > 99)                 // Se o ano for maior que 99, volta a ser = 0
        modifica = 0;
      sprintf(text,"%02u", modifica);
      lcd.setCursor(x, y);
      lcd.print(text);
      delay(400);                                 // Espera 400ms
    }
    lcd.setCursor(x, y);
    lcd.print("  ");                              // Insere dois espaços                           
    pisca_digito();
    sprintf(text,"%02u", modifica);
    lcd.setCursor(x, y);
    lcd.print(text);
    pisca_digito();
    
    if(!digitalRead(3))                           // Se o botão (pino #3) for pressionado
    {                         
      i++;                                        // Incrementa 'i' de um parametro   
      delay(200);
      
      return modifica;                           // Retorna o valor do parâmetro e sai
    }
  }
}

void loop() 
{
  display();

  if(!digitalRead(3))
  { 
    i = 0;   
    hora   = edit(6, 0, hora);
    
    minuto = edit(9, 0, minuto);
      
    dia    = edit(6, 1, dia);
      
    mes    = edit(9, 1, mes);
      
    ano    = edit(14, 1, ano);
        
    Clock.setHour(hora), Clock.setMinute(minuto), Clock.setDate(dia),
    Clock.setMonth(mes), Clock.setYear(ano);
    delay(150);

    
  }
}
GND5VSDASCLSQWRTCDS1307+