/*############################################################################
Codigo criado por: MarioParente
Data: 17/01/2024
Detalhes do projeto: v1.1 - Relogio digital RTC com posibilidade de alteração de horario e data.
############################################################################*/

//Inclui as bibliotecas
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>


//#####    Definições    #######
#define Bot_Menu  3
#define Bot_Mudar 4
#define Led       13

//#####    Variaveis    #######
char Aux = 0;                       // Auxilia a contagem de tempo para acessar o Munu de configuração
int Menu = 0;                       // Guarda o Menu atual
int Espaco = 0;
int Alterar_1 = 0;
int Alterar_2 = 0;

int dd = 0;
int MM = 0;
int yy = 0;
int hh = 0;
int mm = 0;

//#####    Objetos    #######
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); 
RTC_DS1307 rtc;       //Objeto rtc da classe DS1307
//RTC_DS3231 rtc;     //Objeto rtc da classe DS3132

//#####    Lista    #######
char diasDaSemana[7][12] = {"Dom ", "Seg ", "Ter ", "Qua ", "Qui ", "Sex ", "Sab "}; //Dias da semana
char Doid_pontos [8] = {
  0b00000,
  0b00000,
  0b00100,
  0b00000,
  0b00000,
  0b00100,
  0b00000,
  0b00000,
};

char Seta[8] = {
  0b00100,
  0b01110,
  0b10101,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00000
};

void setup () {
  lcd.init();
  lcd.createChar(1, Doid_pontos);
  lcd.createChar(2, Seta);
  lcd.setBacklight(HIGH);
  pinMode(Bot_Menu, INPUT_PULLUP);
  pinMode(Bot_Mudar, INPUT_PULLUP);
  pinMode(Led, OUTPUT);

  Serial.begin(9600);                          //Inicializa a comunicacao serial
  if (! rtc.begin()) {                         //Se o RTC nao for inicializado, faz
    Serial.println("RTC NAO INICIALIZADO");    //Imprime o texto
    while (1);                                 //Trava o programa
  }
  //rtc.adjust(DateTime(2019, 3, 6, 15, 24, 00)); //Ajusta o tempo do RTC para a data e hora definida pelo usuario.
  delay(100);                                  // 100 Milissegundos
}

void loop () {
  delay(1000);

  if(!digitalRead(Bot_Menu)){
    Aux += 1;
    digitalWrite(Led, HIGH);
  }

  else{
    digitalWrite(Led, LOW);
    Aux = 0;
  }

  if(Aux == 3){
    Menu = 1;
  }

  switch (Menu) {
    case 0:
      Exibir_DataHota();
      Exibir_DataHota_Serial();
    break;

    case 1:
      Serial.println("Entrando no case 1 do Switch 1");
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Alteracao!"); 
      lcd.setCursor(0,1);
      lcd.print("Data e Hora");
      delay(200);
      Aux = 10;
      Aux_Menu_ajuste();
    break;
  }
}

void Exibir_DataHota(){
  DateTime agora = rtc.now();                             // Faz a leitura de dados de data e hora
  char Data[] = "DD/MM/YYYY";
  char Hora[] = "Hora\x01 hh\x01mm\x01ss";
  lcd.setCursor(1,0);
  lcd.print(diasDaSemana[agora.dayOfTheWeek()]);          //Imprime dia da semana
  lcd.print(agora.toString(Data));
  lcd.setCursor(1,1);
  lcd.print(agora.toString(Hora));                        //Imprime Hora
}

void Exibir_DataHota_Serial(){
  DateTime agora = rtc.now(); 
  char Data[] = "DD/MM/YYYY";
  char Hora[] = "Hora: hh:mm:ss";                         // Faz a leitura de dados de data e hora
  Serial.print(diasDaSemana[agora.dayOfTheWeek()]);       //Imprime dia da semana
  Serial.println(agora.toString(Data));                   //Imprime data
  Serial.println(agora.toString(Hora));                   //Imprime dia
}

void Aux_Menu_ajuste(){
  Serial.println("Entrando no Aux_Menu_ajuste");
  while(digitalRead(Bot_Menu)==LOW){
    delay(100);
  }
  lcd.clear();
  DateTime agora = rtc.now();
  dd = (agora.day());
  MM = (agora.month());
  yy = (agora.year());
  yy = yy%1000;
  hh = (agora.hour());
  mm = (agora.minute());
  Menu_Ajuste();
}

void Menu_Ajuste(){
  Serial.println(" Entrando no Menu_Ajuste");
  lcd.setCursor(0,0);
  lcd.print("Alterar ");
  lcd.print(dd/10);                                              //Imprime dia
  lcd.print(dd%10);
  lcd.print('/');                                                //Imprime barra
  lcd.print(MM/10);                                              //Imprime mes
  lcd.print(MM%10);
  lcd.print('/');                                                //Imprime barra
  lcd.print(yy);                                                 //Imprime ano

  while(Aux >=9){
    switch (Aux) {
      case 10:                    // Caso 10 Swict 2 - 1ª digito Dia
        Alterar_2 = dd/10;
        Alterar_1 = dd%10;
        Espaco = 8;
        lcd.setCursor(Espaco,0);
        lcd.print(Alterar_2);
        Espaco = 9;
        lcd.setCursor(Espaco,0);
        lcd.print(Alterar_1);   
        Serial.println(" Caso 10 Swict 2 - 1ª digito Dia");
        lcd.setCursor(0,1);
        lcd.print("Dia");        
        lcd.setCursor(Espaco,1);
        lcd.print("\x02");
        while(digitalRead(Bot_Menu)==LOW){
          delay(100);
        }
        while(Aux == 10){
          lcd.setCursor(Espaco,0);
          lcd.print(Alterar_1);
          if (!digitalRead(Bot_Mudar)){
            delay(200);           
            if (Alterar_1 ++ >= 9){
              Alterar_1 = 0;
            }
          }
          if (!digitalRead(Bot_Menu)){
              while(digitalRead(Bot_Menu)==LOW){
                delay(100);
              }
            Aux = 11;
            digitalWrite(Led, HIGH);
            lcd.setCursor(Espaco,1);
            lcd.print(" ");
            delay(200);
            digitalWrite(Led, LOW);
          }
        }
      break;

      case 11:
        Espaco = 8;
        Serial.println(" Caso 20 Swict 2 - 2ª digito Dia e Confimação do Dia");
        lcd.setCursor(Espaco,1);
        lcd.print("\x02");
        while(digitalRead(Bot_Menu)==LOW){
          delay(100);
        }
        while(Aux == 11){
          lcd.setCursor(Espaco,0);
          lcd.print(Alterar_2);
          if (!digitalRead(Bot_Mudar)){
            delay(200);           
            if (Alterar_2 ++ >= 3){
              Alterar_2 = 0;
            }
          }
          if (!digitalRead(Bot_Menu)){
            while(digitalRead(Bot_Menu)==LOW){
              delay(100);
            }
            Aux = 12;
            digitalWrite(Led, HIGH);  
            Alterar_2 = (Alterar_2*10) + Alterar_1;
            lcd.setCursor(Espaco,1);
            lcd.print(" ");
            delay(200);
            digitalWrite(Led, LOW);
            Serial.println(Alterar_2);
            if(Alterar_2 > 31 || Alterar_2 == 0){                        //Degub de erro no dia
              Serial.println(" Erro encontardo no Dia");
              lcd.setCursor(0,1);
              lcd.print("Erro encontrado!");                       //Imprime mensagem de erro
              delay(1500);
              lcd.setCursor(0,1);
              lcd.print("Verificar Dia!   ");                      //Os 2 espaço ao final e para limpar a mensagem anterior
              delay(1500);
              lcd.setCursor(0,1);
              lcd.print("                ");                       //Limpa a linha inferior do LCD
              Aux = 10;
            }
            else{
              dd = Alterar_2;
            }
          }          
        }        
      break;

      case 12:
        Alterar_2 = MM/10;
        Alterar_1 = MM%10;
        Espaco = 11;
        lcd.setCursor(Espaco,0);
        lcd.print(Alterar_2);
        Espaco = 12;
        lcd.setCursor(Espaco,0);
        lcd.print(Alterar_1);
        Serial.println(" Caso 30 Swict 2 - 1ª digito Mes");
        lcd.setCursor(0,1);
        lcd.print("Mes");        
        lcd.setCursor(Espaco,1);
        lcd.print("\x02");
        Alterar_1 = MM%10;
        while(digitalRead(Bot_Menu)==LOW){
          delay(100);
        }
        while(Aux == 12){
          lcd.setCursor(Espaco,0);
          lcd.print(Alterar_1);
          if (!digitalRead(Bot_Mudar)){
            delay(200);           
            if (Alterar_1 ++ >= 9){
              Alterar_1 = 0;
            }
          }
          if (!digitalRead(Bot_Menu)){
            while(digitalRead(Bot_Menu)==LOW){
              delay(100);
            }
            Aux = 13;
            digitalWrite(Led, HIGH);
            lcd.setCursor(Espaco,1);
            lcd.print(" ");
            delay(200);
            digitalWrite(Led, LOW);
          }
        }        
      break;

      case 13:
        Espaco = 11;
        Serial.println("Caso 40 Swict 2 - 2ª digito Mes e Confimação do Mes");
        lcd.setCursor(Espaco,1);
        lcd.print("\x02");
        Alterar_2 = MM/10;
        while(digitalRead(Bot_Menu)==LOW){
          delay(100);
        }
        while(Aux == 13){
          lcd.setCursor(Espaco,0);
          lcd.print(Alterar_2);
          if (!digitalRead(Bot_Mudar)){
            delay(200);           
            if (Alterar_2 ++ >= 1){
              Alterar_2 = 0;
            }
          }
          if (!digitalRead(Bot_Menu)){
            while(digitalRead(Bot_Menu)==LOW){
              delay(100);
            }
            Aux = 14;
            digitalWrite(Led, HIGH);
            Alterar_2 = (Alterar_2*10) + Alterar_1;
            lcd.setCursor(Espaco,1);
            lcd.print(" ");
            delay(200);
            digitalWrite(Led, LOW);
            Serial.println(MM);
            if(Alterar_2>12||Alterar_2==0){                         //Degub de erro no dia
              Serial.println("Erro encontardo no Dia");
              lcd.setCursor(0,1);
              lcd.print("Erro encontrado!");                       //Imprime mensagem de erro
              delay(1500);
              lcd.setCursor(0,1);
              lcd.print("Verificar Mes!   ");                      //Os 2 espaço ao final e para limpar a mensagem anterior
              delay(1500);
              lcd.setCursor(0,1);
              lcd.print("                ");                       //Limpa a linha inferior do LCD
              Aux = 12;
            }
            else{
              MM = Alterar_2;
            }
          }          
        }
      break;

      case 14:
        Espaco = 15;
        Serial.println("Caso 50 Swict 2 - 1ª digito Ano");
        lcd.setCursor(0,1);
        lcd.print("Ano");        
        lcd.setCursor(Espaco,1);
        lcd.print("\x02");
        Alterar_1 = yy%10;
        while(digitalRead(Bot_Menu)==LOW){
          delay(100);
        }
        while(Aux == 14){
          lcd.setCursor(Espaco,0);
          lcd.print(Alterar_1);
          if (!digitalRead(Bot_Mudar)){
            delay(200);           
            if (Alterar_1 ++ >= 9){
              Alterar_1 = 0;
            }
          }
          if (!digitalRead(Bot_Menu)){
            while(digitalRead(Bot_Menu)==LOW){
              delay(100);
            }
            Aux = 15;
            digitalWrite(Led, HIGH);
            lcd.setCursor(Espaco,1);
            lcd.print(" ");
            delay(200);
            digitalWrite(Led, LOW);
          }
        }        
      break;

      case 15:
        Espaco = 14;
        Serial.println("Caso 60 Swict 2 - 2ª digito Ano");
        lcd.setCursor(Espaco,1);
        lcd.print("\x02");
        Alterar_2 = yy/10;
        while(digitalRead(Bot_Menu)==LOW){
          delay(100);
        }
        while(Aux == 15){
          lcd.setCursor(Espaco,0);
          lcd.print(Alterar_2);
          if (!digitalRead(Bot_Mudar)){
            delay(200);           
            if (Alterar_2 ++ >= 9){
              Alterar_2 = 0;
            }
          }
          if (!digitalRead(Bot_Menu)){
            while(digitalRead(Bot_Menu)==LOW){
              delay(100);
            }
            Aux = 16;
            digitalWrite(Led, HIGH);
            yy = (Alterar_2*10)+Alterar_1;
            lcd.clear();
            delay(200);
            digitalWrite(Led, LOW);
            Serial.println(yy);
            Serial.println("Data confirmada");
            Serial.print(dd);
            Serial.print("/");
            Serial.print(MM);
            Serial.print("/");
            Serial.println(yy);
          }
        }
      break;

      case 16:
        Alterar_2 = hh/10;
        Alterar_1 = hh%10;
        Serial.println("Caso 70 Swict 2 - 1ª digito Hora");
        lcd.setCursor(0,0);
        lcd.print("Alterar ");
        lcd.print(hh/10);                         //Imprime hora
        lcd.print(hh%10);
        lcd.print('\x01');                        //Imprime dois ponto
        lcd.print(mm/10);                       //Imprime minuto
        lcd.print(mm%10);
        Espaco = 9;
        lcd.setCursor(0,1);
        lcd.print("Hora");        
        lcd.setCursor(Espaco,1);
        lcd.print("\x02");
        while(digitalRead(Bot_Menu)==LOW){
          delay(100);
        }
        while(Aux == 16){
          lcd.setCursor(Espaco,0);
          lcd.print(Alterar_1);
          if (!digitalRead(Bot_Mudar)){
            delay(200);           
            if (Alterar_1 ++ >= 9){
              Alterar_1 = 0;
            }
          }
          if (!digitalRead(Bot_Menu)){
            while(digitalRead(Bot_Menu)==LOW){
              delay(100);
            }
            Aux = 17;
            digitalWrite(Led, HIGH);
            lcd.setCursor(Espaco,1);
            lcd.print(" ");
            delay(200);
            digitalWrite(Led, LOW);
          }
        }
      break;

      case 17:
        Espaco = 8;
        Serial.println("Caso 80 Swict 2 - 2ª digito hora");
        lcd.setCursor(Espaco,1);
        lcd.print("\x02");
        Alterar_2 = hh/10;
        while(digitalRead(Bot_Menu)==LOW){
          delay(100);
        }
        while(Aux == 17){
          lcd.setCursor(Espaco,0);
          lcd.print(Alterar_2);
          if (!digitalRead(Bot_Mudar)){
            delay(200);           
            if (Alterar_2 ++ >= 2){
              Alterar_2 = 0;
            }
          }
          if (!digitalRead(Bot_Menu)){
            while(digitalRead(Bot_Menu)==LOW){
              delay(100);
            }
            Aux = 18;
            digitalWrite(Led, HIGH);
            Alterar_2 = (Alterar_2*10)+Alterar_1;
            lcd.setCursor(Espaco,1);
            lcd.print(" ");
            delay(200);
            digitalWrite(Led, LOW);
            Serial.println(dd);
            if(Alterar_2 > 23){                                      //Degub de erro no dia
              Serial.println("Erro encontardo na Hora");
              lcd.setCursor(0,1);
              lcd.print("Erro encontrado!");                       //Imprime mensagem de erro
              delay(1500);
              lcd.setCursor(0,1);
              lcd.print("Verificar Hora! ");                      //Os 2 espaço ao final e para limpar a mensagem anterior
              delay(1500);
              lcd.setCursor(0,1);
              lcd.print("                ");                       //Limpa a linha inferior do LCD
              Aux = 16;
            }
            else{
              hh = Alterar_2;
            }
          }
        }
      break;

      case 18:                    // 
        Espaco = 12;
        Serial.println("Caso 90 Swict 2 - 1ª digito minuto");
        lcd.setCursor(0,1);
        lcd.print("Minuto");        
        lcd.setCursor(Espaco,1);
        lcd.print("\x02");
        Alterar_1 = mm%10;
        while(digitalRead(Bot_Menu)==LOW){
          delay(100); 
        }
        while(Aux == 18){
          lcd.setCursor(Espaco,0);
          lcd.print(Alterar_1);
          if (!digitalRead(Bot_Mudar)){
            delay(200);
            if (Alterar_1 ++ >= 9){
              Alterar_1 = 0;
            }
          }
          if (!digitalRead(Bot_Menu)){
            while(digitalRead(Bot_Menu)==LOW){
              delay(100);
            }
            Aux = 19;
            digitalWrite(Led, HIGH);
            lcd.setCursor(Espaco,1);
            lcd.print(" ");
            delay(200);
            digitalWrite(Led, LOW);
          }
        }        
      break;

      case 19:                    // Caso 40 Swict 2 - 2ª digito minut
        Espaco = 11;
        Serial.println("Caso 40 Swict 2 - 2ª digito minuto");
        lcd.setCursor(Espaco,1);
        lcd.print("\x02");
        Alterar_2 = mm/10;
        while(digitalRead(Bot_Menu)==LOW){
          delay(100);
        }
        while(Aux == 19){
          lcd.setCursor(Espaco,0);
          lcd.print(Alterar_2);
          if (!digitalRead(Bot_Mudar)){
            delay(200);           
            if (Alterar_2 ++ >= 5){
              Alterar_2 = 0;
            }
          }
          if (!digitalRead(Bot_Menu)){
            while(digitalRead(Bot_Menu)==LOW){
              delay(100);
            }
            Aux = 20;
            digitalWrite(Led, HIGH);
            Alterar_2 = (Alterar_2*10)+ Alterar_1;
            lcd.setCursor(Espaco,1);
            lcd.print(" ");
            delay(200);
            digitalWrite(Led, LOW);
            Serial.println(MM);
            if(Alterar_2>60){                                              //Degub de erro no minuto
              Serial.println("Erro encontardo no minuto");
              lcd.setCursor(0,1);
              lcd.print("Erro encontrado!");                       //Imprime mensagem de erro
              delay(1500);
              lcd.setCursor(0,1);
              lcd.print("Verificar Minuto");                      //Os 2 espaço ao final e para limpar a mensagem anterior
              delay(1500);
              lcd.setCursor(0,1);
              lcd.print("                ");                       //Limpa a linha inferior do LCD
              Aux = 110;
              Aux_Menu_ajuste();
            }
            else{
              mm = Alterar_2;
            }
          }          
        }
      break;

      case 20:                    // Finalizado
        Serial.println("Finalizado?");   
        lcd.setCursor(0,1);
        lcd.print("Data Configurada");
        Serial.println("Caso 70 Swict 2 - 1ª digito hora");
        Serial.print(dd);
        Serial.print("/");
        Serial.print(MM);
        Serial.print("/");
        Serial.println(yy);
        rtc.adjust(DateTime(yy+2000, MM, dd, hh, mm, 00));     //Envia data para o RTC
        delay(1500);
        lcd.clear();
        Aux = 0;
        Menu = 0;
      break;
    } 
  }
}


GND5VSDASCLSQWRTCDS1307+