/*############################################################################
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;
}
}
}