//Curso: Automação com Arduino
//Pasta: C:/AcDc
//2023_05_02_12ª Aula
//Programa: 2023_05_02_Aula_12-2 (RTC)
//Programa: 2024_06_13_Aula_12c(RTC)
//Exercício: Programa completo    ############# Funcionou #################

//PROGRAMA COMPLETO
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 relogio;

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();
  while (! relogio.begin()) {
    delay(500);  }
  pinMode(7, OUTPUT);       //Para acionar o relé
  pinMode(8, INPUT_PULLUP); //acertar relogio (1a. chave)
  pinMode(9, INPUT_PULLUP); //acertar horário de acionamento (2a. chave)
  pinMode(10, INPUT_PULLUP); //incrementa   (3a. chave)
  pinMode(11, INPUT_PULLUP); //decrementa   (4a. chave)
  pinMode(12, INPUT_PULLUP); //enter        (5a. chave)
  digitalWrite(7, HIGH);
  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);
  lcd.setCursor(0, 0);
  if (hora < 10 ) {
    lcd.print ( "0" );  }
  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(2, 1);
  
  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 (" ");
  
  if (hora_desliga < 10 ) {
    lcd.print ( "0" );  }
  lcd.print (hora_desliga);
  lcd.print (":");
  
  if (minuto_desliga < 10 ) {
    lcd.print ( "0" );  }
  lcd.print (minuto_desliga);
  
  if (!digitalRead(8)) {      //acertar relógio
    lcd.setCursor(0, 0);
    lcd.print (" ANO ");
    ano = acertar( ) + 2000;
    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( );
    relogio.adjust(DateTime(ano, mes, dia, hora, minuto, 0));
    lcd.clear( );
  }
  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( );
  }
  if (hora == hora_liga && minuto == minuto_liga) {
    digitalWrite(7, LOW);
  }
  if (hora == hora_desliga && minuto == minuto_desliga) {
    digitalWrite(7, HIGH);  }
}
int acertar() {
  lcd.setCursor(0, 1);
  lcd.print ("                "); 
      //Antes eu havia deixado só 2 espaços em branco e
      //sobrepunha os caracteres no LCD
  x = 0;
  delay(300);
  while (digitalRead(12)) {
    lcd.setCursor(8, 1);
    if (x < 10 ) {
      lcd.print ( "0" );    }
    lcd.print (x);
    if (!digitalRead(10)) {
      x++;
      delay(300);    }
    if (!digitalRead(11)) {
      x--;
      delay(300);    }
    if (x < 0) {
      x = 0;    }
  }               //Fim do while
  lcd.setCursor(0, 1);
  lcd.print ("   PROGRAMADO   ");
  delay(1000);
  return (x);
}     //Fim função acertar
GND5VSDASCLSQWRTCDS1307+
NOCOMNCVCCGNDINLED1PWRRelay Module