Feliz año nuevo a todos!!!
Les soy sincero, estoy muy nervioso, este es uno de los proyecto que mas trabajo me ha dado y por este problema todo me esta dando vueltas.
Verán, mi trabajo consiste a un sistema de timbre de colegio automatizado, es muy parecido al que muestra El profe García en su canal de YouTube (aquí el link por si quieren ver https://youtu.be/j9WSRhnVQc4?si=8u4zZ1QkzmXdG01V). En este proyecto yo hago uso de un modulo RTC DS3231 para guardar la fecha y hora, esta información la muestro en tiempo real a través de un display LCD 16/2, la cosa es que justo hoy, lunes primero de enero del 2024 (01/01/2024) imprime el día en que nos encontramos como martes y no como lunes.
Cambie la hora de mi computador a 31/12/2023 con hora 23:59 para ver que pasaba al llegar a las 00:00 del 01/01/2024 y ver que día me mostraba.
Me sigue mostrando martes...
El problema es por 3 letras, en vez de salir Lun sale Mar, sinceramente ya no se que hacer.
Aquí el código
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#include <time.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inicializa la interfaz I2C del LCD 16x2
RTC_DS1307 RTC; // Inicializa el modulo RTC
int r_diaSemana; // Almacena el resultado del dia de la semana calculado
const int timbre = 7; // Pin 7 encargado de activar el timbre, se conecta al Rele
int segundo;
int minuto;
int hora;
int tiempo_timbre = 5000;
///////////////////////// Horario 1 /////////////////////////
int h1_c1 = 15; int m1_c1 = 40; int s1_c1 = 0;
int h2_c1 = 8; int m2_c1 = 35; int s2_c1 = 0;
int h3_c1 = 9; int m3_c1 = 15; int s3_c1 = 0;
int h4_c1 = 9; int m4_c1 = 55; int s4_c1 = 0;
int h5_c1 = 10; int m5_c1 = 15; int s5_c1 = 0;
int h6_c1 = 10; int m6_c1 = 55; int s6_c1 = 0;
int h7_c1 = 11; int m7_c1 = 35; int s7_c1 = 0;
int h8_c1 = 12; int m8_c1 = 15; int s8_c1 = 0;
int h9_c1 = 12; int m9_c1 = 55; int s9_c1 = 0;
///////////////////////// Horario 2 /////////////////////////
int h1_c2 = 6; int m1_c2 = 3; int s1_c2 = 0;
int h2_c2 = 7; int m2_c2 = 55; int s2_c2 = 0;
int h3_c2 = 8; int m3_c2 = 35; int s3_c2 = 0;
int h4_c2 = 9; int m4_c2 = 15; int s4_c2 = 0;
int h5_c2 = 9; int m5_c2 = 55; int s5_c2 = 0;
int h6_c2 = 10; int m6_c2 = 15; int s6_c2 = 0;
int h7_c2 = 10; int m7_c2 = 55; int s7_c2 = 0;
int h8_c2 = 11; int m8_c2 = 35; int s8_c2 = 0;
int h9_c2 = 12; int m9_c2 = 15; int s9_c2 = 0;
int h10_c2 = 12; int m10_c2 = 55; int s10_c2 = 0;
///////////////////////// Horario 3 /////////////////////////
int h1_c3 = 7; int m1_c3 = 15; int s1_c3 = 0;
int h2_c3 = 7; int m2_c3 = 55; int s2_c3 = 0;
int h3_c3 = 8; int m3_c3 = 35; int s3_c3 = 0;
int h4_c3 = 9; int m4_c3 = 15; int s4_c3 = 0;
int h5_c3 = 9; int m5_c3 = 55; int s5_c3 = 0;
int h6_c3 = 10; int m6_c3 = 15; int s6_c3 = 0;
int h7_c3 = 10; int m7_c3 = 55; int s7_c3 = 0;
int h8_c3 = 11; int m8_c3 = 35; int s8_c3 = 0;
int h9_c3 = 12; int m9_c3 = 15; int s9_c3 = 0;
int h10_c3 = 12; int m10_c3 = 55; int s10_c3 = 0;
///////////////////////// Void Setup() /////////////////////////
void setup () {
pinMode(timbre, OUTPUT); // Configura como salida el pin 7
Wire.begin();
RTC.begin(); // Inicia la comunicaci¢n con el RTC
RTC.adjust(DateTime(__DATE__, __TIME__)); // Lee la fecha y hora del PC (Solo en la primera carga)
// el anterior se usa solo en la configuracion inicial luego se pone como comentario
// y se vuelve a cargar el programa sin esa linea.
Serial.begin(9600); // Establece la velocidad de datos del puerto serie a 9600
lcd.init();
lcd.backlight(); // Coloca luz de fondo al LCD
lcd.clear(); // Borra el LCD
}
///////////////////////// Void loop() /////////////////////////
void loop() {
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
int contacto1 = analogRead(A0); // Lee el valor de los contactos para escoger el horario
int contacto2 = analogRead(A1);
int contacto3 = analogRead(A2);
int contacto4 = analogRead(A3); // Contacto que activa o desactiva los fines de semana
Serial.print(now.year(), DEC); // Año
Serial.print('/');
Serial.print(now.month(), DEC); // Mes
Serial.print('/');
Serial.print(now.day(), DEC); // Dia
Serial.print(' ');
Serial.print(now.hour(), DEC); // Horas
Serial.print(':');
Serial.print(now.minute(), DEC); // Minutos
Serial.print(':');
Serial.print(now.second(), DEC); // Segundos
Serial.println();
lcd.setCursor(0, 0);
lcd.print("D:");
lcd.print(now.year(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.day(), DEC);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second(), DEC);
segundo = now.second();
minuto = now.minute();
hora = now.hour();
if (contacto4 <= 1000) { // Si el contacto 4 esta desactivado, despliega -e- entre semana funciona el timbre
lcd.setCursor(10, 1);
lcd.print(" E");
Serial.print("-En-");
}
else { // Si el contacto 4 esta activado, despliega -F- el Fin de semana funciona el timbre
lcd.setCursor(10, 1);
lcd.print(" F");
Serial.print("-Fi-");
}
int r_diaSemana = dia_de_semana(); // llama a la funcion que calcula el dia de la semana y lo almacena en r_diaSemana
if ((r_diaSemana == 6 || r_diaSemana == 0) && (contacto4 <= 1000)) { // Si el contacto4 de Fin de semana esta apagado y es fin de semana no hace nada
}
else {
if (contacto1 >= 1000 && r_diaSemana == 1) // Si el contacto 1 esta activo (Horario 1)
horario_1(); // llama a la funcion que activa el horario 1
if (contacto2 >= 1000 && r_diaSemana == 2) // Si el contacto 2 esta activo (Horario 2)
horario_2(); // llama a la funcion que activa el horario2
if (contacto2 >= 1000 && r_diaSemana == 3) // Si el contacto 2 esta activo (Horario 2)
horario_2();
if (contacto2 >= 1000 && r_diaSemana == 4) // Si el contacto 2 esta activo (Horario 2)
horario_2();
if (contacto2 >= 1000 && r_diaSemana == 5) // Si el contacto 2 esta activo (Horario 2)
horario_2();
if (contacto3 >= 1000) // Si el contacto 1 esta activo (Horario 3)
horario_3(); // llama a la funcion que activa el horario 3
}
digitalWrite(timbre, HIGH); // Apaga el timbre
delay(500); // La informaci¢n se actualiza cada 1/2 seg.
lcd.setCursor(9, 0); // Borra parte de la pantalla del LCD
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print(" ");
}
///////////////////////// Fin del void loop(), inician las funciones /////////////////////////
///////////////////////// Funcion que activa el Timbre /////////////////////////
void activar_timbre() {
digitalWrite(timbre, LOW);
lcd.setCursor(0, 0);
lcd.print("Timbre ON ");
Serial.println("Timbre Activo");
delay(tiempo_timbre);
}
///////////////////////// Calcula el dia de la Semana /////////////////////////
int dia_de_semana() {
// Encuentar el dia de la semana de una fecha
int n_dia;
int r_dia;
int n_mes;
int t_mes;
int n_anno;
int d_anno;
int t_siglo = 6;
DateTime now = RTC.now(); // Fecha y hora del RTC
lcd.setCursor(13, 1);
n_anno = (now.year() - 2000);
d_anno = n_anno / 4;
n_dia = now.day();
n_mes = now.month();
switch (n_mes) {
case 1:
t_mes = 0;
break;
case 2:
t_mes = 3;
break;
case 3:
t_mes = 3;
break;
case 4:
t_mes = 6;
break;
case 5:
t_mes = 1;
break;
case 6:
t_mes = 4;
break;
case 7:
t_mes = 6;
break;
case 8:
t_mes = 2;
break;
case 9:
t_mes = 5;
break;
case 10:
t_mes = 0;
break;
case 11:
t_mes = 3;
break;
case 12:
t_mes = 5;
break;
default:
t_mes = t_mes;
break;
}
r_dia = n_dia + t_mes + n_anno + d_anno + t_siglo;
r_dia = r_dia % 7;
switch (r_dia) {
case 1:
lcd.print("Lun");
Serial.print(" Lun ");
break;
case 2:
lcd.print("Mar");
Serial.println(" Mar ");
break;
case 3:
lcd.print("Mie");
Serial.print(" Mie ");
break;
case 4:
lcd.print("Jue");
Serial.print(" Jue ");
break;
case 5:
lcd.print("Vie");
Serial.print(" Vie ");
break;
case 6:
lcd.print("Sab");
Serial.print(" Sab ");
break;
case 0:
lcd.print("Dom");
Serial.print(" Dom ");
break;
default:
lcd.print("---");
Serial.print(" ---");
break;
}
return r_dia;
}
///////////////////////// Condicional del Horario 1 /////////////////////////
void horario_1() {
lcd.setCursor(13, 0);
lcd.print("1");
Serial.print("Horario_1 ");
if ((hora == h1_c1) && (minuto == m1_c1) && (segundo == s1_c1)) activar_timbre();
if ((hora == h2_c1) && (minuto == m2_c1) && (segundo == s2_c1)) activar_timbre();
if ((hora == h3_c1) && (minuto == m3_c1) && (segundo == s3_c1)) activar_timbre();
if ((hora == h4_c1) && (minuto == m4_c1) && (segundo == s4_c1)) activar_timbre();
if ((hora == h5_c1) && (minuto == m5_c1) && (segundo == s5_c1)) activar_timbre();
if ((hora == h6_c1) && (minuto == m6_c1) && (segundo == s6_c1)) activar_timbre();
if ((hora == h7_c1) && (minuto == m7_c1) && (segundo == s7_c1)) activar_timbre();
if ((hora == h8_c1) && (minuto == m8_c1) && (segundo == s8_c1)) activar_timbre();
if ((hora == h9_c1) && (minuto == m9_c1) && (segundo == s9_c1)) activar_timbre();
}
///////////////////////// Condicional del Horario 2 /////////////////////////
void horario_2() {
lcd.setCursor(14, 0);
lcd.print("2");
Serial.print("Horario_2 ");
if ((hora == h1_c2) && (minuto == m1_c2) && (segundo == s1_c2)) activar_timbre();
if ((hora == h2_c2) && (minuto == m2_c2) && (segundo == s2_c2)) activar_timbre();
if ((hora == h3_c2) && (minuto == m3_c2) && (segundo == s3_c2)) activar_timbre();
if ((hora == h4_c2) && (minuto == m4_c2) && (segundo == s4_c2)) activar_timbre();
if ((hora == h5_c2) && (minuto == m5_c2) && (segundo == s5_c2)) activar_timbre();
if ((hora == h6_c2) && (minuto == m6_c2) && (segundo == s6_c2)) activar_timbre();
if ((hora == h7_c2) && (minuto == m7_c2) && (segundo == s7_c2)) activar_timbre();
if ((hora == h8_c2) && (minuto == m8_c2) && (segundo == s8_c2)) activar_timbre();
if ((hora == h9_c2) && (minuto == m9_c2) && (segundo == s9_c2)) activar_timbre();
if ((hora == h10_c2) && (minuto == m10_c2) && (segundo == s10_c2)) activar_timbre();
}
///////////////////////// Condicional del Horario 3 /////////////////////////
void horario_3() {
lcd.setCursor(15, 0);
lcd.print("3");
Serial.print("Horario_3 ");
if ((hora == h1_c3) && (minuto == m1_c3) && (segundo == s1_c3)) activar_timbre();
if ((hora == h2_c3) && (minuto == m2_c3) && (segundo == s2_c3)) activar_timbre();
if ((hora == h3_c3) && (minuto == m3_c3) && (segundo == s3_c3)) activar_timbre();
if ((hora == h4_c3) && (minuto == m4_c3) && (segundo == s4_c3)) activar_timbre();
if ((hora == h5_c3) && (minuto == m5_c3) && (segundo == s5_c3)) activar_timbre();
if ((hora == h6_c3) && (minuto == m6_c3) && (segundo == s6_c3)) activar_timbre();
if ((hora == h7_c3) && (minuto == m7_c3) && (segundo == s7_c3)) activar_timbre();
if ((hora == h8_c3) && (minuto == m8_c3) && (segundo == s8_c3)) activar_timbre();
if ((hora == h9_c3) && (minuto == m9_c3) && (segundo == s9_c3)) activar_timbre();
if ((hora == h10_c3) && (minuto == m10_c3) && (segundo == s10_c3)) activar_timbre();
}