//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);
}
}