//Curso: Automação com Arduino
//Pasta: 99 - Cursos_AltSyn\AcDc_2024_Automação com Arduino\2024_06_13_Aula_RTC-a
//2024_06_13_12??ª Aula
//Programa: 2024_06_13_Aula_RTC-c
//          A versão -c para acertar o ano/mes/dia
//Exercício: 

#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
RTC_DS1307 relogio;
//Declaração das variáveis:
int ano= 0;
int mes= 0;
int dia= 0;
int hora= 0;
int minuto = 0;
int segundo = 0;
int hora_liga=0;
int minuto_liga=0;
int hora_desliga=0;
int minuto_desliga=0;
int x=0;

void setup() {
lcd.init();
lcd.backlight();            //para ligar luz de fundo
while (! relogio.begin()) { //retorna nível alto qdo inicializa
delay(500);                 //enqto for = zero fica aqui no while
}
pinMode(7,OUTPUT);          //rele
pinMode(8,INPUT_PULLUP);    //acertar relogio
pinMode(9,INPUT_PULLUP);    //acertar horário de acionamento
pinMode(10,INPUT_PULLUP);   //incrementa
pinMode(11,INPUT_PULLUP);   //decrementa
pinMode(12,INPUT_PULLUP);   //Enter/reset
digitalWrite(7,HIGH);       //Para garantir q o relé vai começar desligado
/*
if(!digitalRead(12)) {relogio.adjust(DateTime(ano, mes, dia, hora, minuto));
delay(300);
}
*/
}
void loop() {
hora= relogio.now().hour();
minuto = relogio.now().minute();
segundo= relogio.now().second();
lcd.setCursor(3,0);

if (hora < 10 ){    //Para colocar o "zero" na frente do dígito
lcd.print ( "0" );  //qdo a hora for menor que 10 (1h, 2h, 3h...
}                   //para não ficar assim: 22:1:5 (22 h 1min 5seg)
lcd.print (hora);
lcd.print (":");

if (minuto < 10 ){
lcd.print ( "0" );
}
lcd.print (minuto);
lcd.print (":");

if (segundo < 10 ){
lcd.print ( "0" );
}
lcd.print (segundo);

lcd.setCursor(3,1);     //Para imprimir a segunda linha

if (hora_liga < 10 ){
lcd.print ( "0" );
}
lcd.print (hora_liga);
lcd.print (":");

if (minuto_liga < 10 ){
lcd.print ( "0" );
}
lcd.print (minuto_liga);
lcd.print (" ");        // Espaço em branco entre H-M (liga) e H-M (desl)

if (hora_desliga < 10 ){
lcd.print ( "0" );
}lcd.print (hora_desliga);
lcd.print (":");

if (minuto_desliga < 10 ){
lcd.print ( "0" );
}
lcd.print (minuto_desliga);
//}     //Aqui terminou o loop na versão -b

//    Incluido na versão -c (Inclusão ajuste de ano/mes/dia)

if(!digitalRead(8)) { //acertar relógio
lcd.setCursor(0,0);
lcd.print (" ANO ");
ano=acertar( )+ 2000;   //para não ficar apertando 2mil e tantas vezes
lcd.setCursor(0,0);
lcd.print (" MES ");
mes=acertar( );
lcd.setCursor(0,0);
lcd.print (" DIA ");
dia=acertar( );
lcd.setCursor(0,0);
lcd.print (" HORA ");
hora=acertar( );
lcd.setCursor(0,0);
lcd.print (" MINUTO ");
minuto=acertar( );        //Até aqui acertamos as variáveis Ano/mes/dia/hora/min/

relogio.adjust(DateTime(ano, mes, dia, hora, minuto,0)); // o "0" é o segundo
lcd.clear( );
}
    // OBS: se mandar compilar vai dar erro porque ainda não fizemos a
    //função "acertar"

    //Para ajustar o horário do alarme:

if(!digitalRead(9)) { // acertar horário de acionamento
lcd.setCursor(0,0);
lcd.print (" HORA LIGA ");hora_liga=acertar( );
lcd.setCursor(0,0);
lcd.print (" MINUTO LIGA ");
minuto_liga=acertar( );
lcd.setCursor(0,0);
lcd.print (" HORA DESLIGA ");
hora_desliga=acertar( );
lcd.setCursor(0,0);
lcd.print (" MINUTO DESLIGA ");
minuto_desliga=acertar( );
lcd.clear( );
}

    //Agora são as comparações

if(hora==hora_liga && minuto== minuto_liga) {
digitalWrite(7,LOW);      //vai ligar o relé
}
if(hora==hora_desliga && minuto== minuto_desliga) {
digitalWrite(7,HIGH);     //vai desligar o relé
}
}

int acertar() {     //Função acertar (é int porque vai retornar inteiro)
lcd.setCursor(0,1);
lcd.print (" ");
x=0;
delay(300);   //deboucing
while(digitalRead(12)) {    //aperta o 12 para qdo chegar no horario correto
lcd.setCursor(8,1);         //No while eu vou acertar o horario
if (x < 10 ){
lcd.print ( "0" );
}
lcd.print (x);
if(!digitalRead(10)) {    //Se ler o pino 10 e for "L" (baixo) eu incremento
x++;
delay(300);
}
if(!digitalRead(11)) {    //Se eu ler o pino 11 e for "L" eu decremento a cada 300ms
x--;
delay(300);}
if(x<0) {       //Para evitar ter número negativo!!
x=0;
} 
}//Fechei o while
lcd.setCursor(0,1);
lcd.print (" PROGRAMADO ");
delay(1000);
return (x); //retorna para ano=acertar( )+ 2000;(1ª vez)
            //retorna para mes=acertar( ); e assim sucessivamente
}
GND5VSDASCLSQWRTCDS1307+
NOCOMNCVCCGNDINLED1PWRRelay Module