¿Por que mi proyecto muestra la fecha 01/01/2024 como martes y no como lunes?

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();
}

Publica tu código para que podamos identificar la causa del problema…

Ya lo subí.

Alguien que baje tu archivo de Google podrá ayudarte.

Yo podría hacerlo si lo pones en este foro, conforme a las normas: https://forum.arduino.cc/t/normas-del-foro-en-espanol/300112

Jaja disculpa, ya me di cuenta de mi error, aun soy nuevo en esto.

es un error de los meses enero y febrero del año bisiesto

arreglo del fallo

  r_dia = n_dia + t_mes + n_anno + d_anno + t_siglo;
  if ((n_mes < 3) && ((n_anno % 4) == 0)) r_dia--;
  r_dia = r_dia % 7;

Prueba si esa librería RTClib es la que tiene la función dayOfTheWeek() (0=domingo)

Porque si estos con contactos tal como tu mismo describes en el comentario los leescon analogRead?

 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); 

deberia ser

 int contacto1 = digitalRead(A0);    // Lee el valor de los contactos para escoger el horario
  int contacto2 = digitalRead(A1);
  int contacto3 = digitalRead(A2);
  int contacto4 = digitalRead(A3); 

y si es asi, debes indicarlo en el setup() con

pinMode(timbre, INPUT); 
o 
pinMode(timbre, INPUT_PULLUP);

TE LO AGRADEZCO MUCHISIMO
Tu respuesta me fue de gran ayuda, ahora el sistema me muestra el día que es.
La verdad me es curiosa tu respuesta ya que solucionaste el error con un condicional if, pero bueno, siempre se aprende. Muchas gracias.

Esto se debe a que hago uso de un mini interruptor de 4 posiciones, esto porque al prender uno de los pines puedo elegir un horario según haya sido asignado al pin.

Esto es así por causas de seguridad, al estar el interruptor dentro de la caja nadie podrá ingresar fácilmente y cambiar (o desactivar) los horarios y funciones establecidas.

Lo que te dice @Surbyte es que aunque uses los pines Ax, puedes usarlos en modo digital y simplemente leer si están en HIGH o LOW (que es más lógico para un interruptor que solo puede tener 2 estados).

Por otro lado, si hubieses hecho

r_dia = now.dayOfTheWeek();

no tendrías problema con el día.

Y para ser prolijos, si usas un DS3231 lo adecuado sería

RTC_DS3231 RTC; // Inicializa el modulo RTC

igualmente se me olvidó que luego las comparaciones debes hacerlas contra LOW y HIGH o 0 y 1 no contra 1000 como lo haces.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.