Como se puede mejorar este codigo

Buenas, mirar estoy intentando hacer un digamos calendario para que me avise si estamos en festivo o fin de semana.
lo he realizado con if y else if, pero la verdad para mi nivel de programación, es un prodigio pero estoy seguro que se puede realizar de otra manera mas simplificado.
Claro que para 30 lineas no es mucho, pero no se puede utilizar un array? por ejemplo.
me podeis dar ideas gracias.

1 de enero (viernes): Año Nuevo
2 de abril: Viernes Santo
1 de mayo (sábado): Fiesta del Trabajo
12 de octubre (martes): Fiesta Nacional de España
1 de noviembre (lunes): Día de Todos los Santos
6 de diciembre (lunes): Día de la Constitución
8 de diciembre (miércoles): Inmaculada Concepción
25 de diciembre (sábado): Navidad
*/
void comprobarSiEsFestivo_FinDe(){
  int DiaSemana = tActual.dayOfTheWeek();
  int MesAnyo = tActual.month();
  if (DiaSemana==(6||7)){
    Serial.println("FESTIVO, Fin de semana");
    }
    else if( MesAnyo== 1 && DiaSemana == 1)
  {
       Serial.println("FESTIVO, Año Nuevo");
       }
  else if( MesAnyo== 4 && DiaSemana == 2)
  {
       Serial.println("FESTIVO, Viernes Santo");
       }
 else if( MesAnyo== 5 && DiaSemana == 1)
  {
       Serial.println("FESTIVO, Fiesta del Trabajo");
       }
        else if( MesAnyo== 10 && DiaSemana == 12)
  {
       Serial.println("FESTIVO, Fiesta Nacional de España");
       }
        else if( MesAnyo== 11 && DiaSemana == 1)
  {
       Serial.println("FESTIVO, Día de Todos los Santos ");
       }
        else if( MesAnyo== 12 && DiaSemana == 6)
  {
       Serial.println("FESTIVO, Día de la Constitución");
       }
        else if( MesAnyo== 12 && DiaSemana == 8)  //PARA COMPROBAR ES EL 12 Y EL 8
  {
       Serial.println("FESTIVO, Inmaculada Concepción");
       }
        else if( MesAnyo== 12 && DiaSemana == 25)
  {
       Serial.println("FESTIVO, Navidad");
       }
       else{
        Serial.println("LABORAL");
       }
       
  Serial.print(DiaSemana);
  Serial.println("  DiaSemana");
  Serial.print(MesAnyo);
  Serial.println("  MesAnyo");
}

Coloca los dias festivos en una estructura structure que contenga mes, dia, mensaje algo asi

struct Feriado {
     byte mesAnyo ;
     byte diaSemana;
     String mensaje;
};

Ahora defines un array a la estructura

#define CANT_FERIADOS   3
Feriado compruebo[CANT_FERIADOS];

Puedes definir ahi mismo o asi

compruebo[0] = {12, 6, "FESTIVO, Dia de todos los Santos"};
compruebo[1] = {12, 8, "FESTIVO, Dia de la Constitucion"};
compruebo[2] = {12, 25, "FESTIVO, Navidad"};

Luego te alcanza con hacer un ciclo y si algun dia mesAnyo esta contenido en el array consulta el diaSemana y si ambos existen entonces presentas el cartel.

Supongamos que fuera Navidad y ya lo preguntaste

for (int i=0; i<CANT_FERIADOS; i++) {
      if (DiaSemana  = comruebo[i].diaSemana && MesAnyo == compruebo[i].mesAnyo) {
            Serial.println(compruebo[i].mensaje);
}

Gracias Surbyte me pongo en ello, si me bloqueo os lo hago saber.
gracias.

Si claro, lo que te puse no es fácil de digerir o si de acuerdo a tu autoaprendizaje.
Pregunta que somos varios para ayudarte.

Pues, tienes razón no me es facil de digerir, pero lo intentare, gracias.

Empienza entendiendo que es una estructura!!
Una estructura es como definiri un tipo de variable que actúa como un registro de base de datos. Yo lo entiendo asi.
Tengo muchas varios elementos relacionados, entonces a esos elementos los agrupo.
En tu caso los elementos son : mesAnyo, diaSemana, mensaje
Eso es lo que tenías en tu código.
Ahora la estructura tiene una forma de definición que solo debes respetar. Ver link
Llamé a la estructura Feriado.
Si es una variable, puedo crear un array de esa variable. Entonces pongo en el array los elementos que quiero consultar.
Por eso puse

#define CANT_FERIADOS   3                  // este numero lo varias a tu gusto
Feriado compruebo[CANT_FERIADOS];

finalmente me queda agregar los valores y para ellos tienes varias maneras de hacerlo.
La que puse es una. Tmb podria asignarse de otro modo. Pero eso míralo en algun tutorial.
Para terminar los elementos de la estructura que ahora tienen ademas un índice dentro del array se direcciona por índice y por su subnombre.
asi compruebo[1].mensaje contiene "FESTIVO, Dia de la constitucion"
OJO MUCHO OJO y lo pongo con mayúsculas, con los acentos si no quieres tener problemas al imprimir.



 String mensaje1=" Ingresa el dia";
 String mensaje2="ingresa el Mes";
byte MesAnyo;
    byte diaSemana;

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
Serial.println(mensaje1);
while(Serial.available()==0){
  
}
MesAnyo=Serial.parseInt();

Serial.println(mensaje2);
while(Serial.available()==0){
  
}
diaSemana=Serial.parseInt();
}


void loop() {

struct Festivos{
byte mesAnyo;
byte DiaSemana;
    String mensaje;
    };
 #define Es_Festivo 8
 Festivos compruebo[Es_Festivo];
 /*===========FESTIVOS EN ESPAÑA===================
1 de enero (viernes): Año Nuevo
2 de abril: Viernes Santo
1 de mayo (sábado): Fiesta del Trabajo
12 de octubre (martes): Fiesta Nacional de España
1 de noviembre (lunes): Día de Todos los Santos
6 de diciembre (lunes): Día de la Constitución
8 de diciembre (miércoles): Inmaculada Concepción
25 de diciembre (sábado): Navidad
*/
 compruebo[0] ={1,1,"Any Nuevo"}; 
 compruebo[1] ={4,2,"Viernes Santo"}; 
 compruebo[2] ={5,1,"Fiesta del Trabajo"};
 compruebo[3] ={10,12,"Fiesta Nacional de España"};
 compruebo[4] ={11,1,"Día de Todos los Santos"};
 compruebo[5] ={12,6,"Día de la Constitucion"};
 compruebo[6] ={12,8,"Inmaculada Concepcion"};
 compruebo[7] ={12,25,"Navidad"};   

for(int i=0; i<compruebo;i++){
   if (diaSemana  = compruebo[i].DiaSemana && MesAnyo == compruebo[i].mesAnyo) {
            Serial.println(compruebo[i].mensaje);
         
           
            
}}}

He escrito este programa, he intentado usar el monitor serial para poder escribir los dias, pero me genera fallos. no funciona correctamente, da multiples valores y mensajes con caracteres raros, que por lo que sea no me deja copiarlos del monitorSerial.

23:27:05.910 ->  Ingresa el dia
23:27:08.891 -> ingresa el Mes
23:27:09.875 -> Día de la Constitucion
23:27:09.921 -> Inmaculada Concepcion
23:27:09.921 -> Navidad
23:27:09.969 -> 
23:27:09.969 -> Día de la Constitucion
23:27:09.969 -> Inmaculada Concepcion
23:27:10.016 -> Navidad
23:27:10.016 -> 
23:27:10.016 -> 

Por eso @Surbyte te advirtió esto

NO pongas vocales acentuadas en mensaje.

Define la estructura fuera del loop (al principio del código), no hace falta hacerlo en cada pasada.

En el if() te faltó un signo igual en la primer comparación, debe ser

if (diaSemana  == compruebo[i].DiaSemana && ...

@Edu, te puse un link para que sigas la guia.
No pongas una estructura en cualquier lado, lee la guia..

Acabo de editar el código como para que puedas correrlo

struct Festivos {
  byte mesAnyo ;
  byte diaSemana;
  String mensaje;
};

#define ES_FESTIVO 8
Festivos compruebo[ES_FESTIVO];

String mensaje1 = "Ingresa el dia";
String mensaje2 = "ingresa el Mes";
byte MesAnyo;
byte DiaSemana;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  Serial.println(mensaje1);
  while (Serial.available() == 0) {
    MesAnyo = Serial.parseInt();
    Serial.println(mensaje2);
  }

  while (Serial.available() == 0) {
    DiaSemana = Serial.parseInt();
  }
  /*===========FESTIVOS EN ESPAÑA===================
    1 de enero (viernes): Año Nuevo
    2 de abril: Viernes Santo
    1 de mayo (sábado): Fiesta del Trabajo
    12 de octubre (martes): Fiesta Nacional de España
    1 de noviembre (lunes): Día de Todos los Santos
    6 de diciembre (lunes): Día de la Constitución
    8 de diciembre (miércoles): Inmaculada Concepción
    25 de diciembre (sábado): Navidad
  */
  compruebo[0] = { 1, 1, "Any Nuevo"};
  compruebo[1] = { 4, 2, "Viernes Santo"};
  compruebo[2] = { 5, 1, "Fiesta del Trabajo"};
  compruebo[3] = {10, 12, "Fiesta Nacional de Espana"};
  compruebo[4] = {11, 1, "Dia de Todos los Santos"};
  compruebo[5] = {12, 6, "Dia de la Constitucion"};
  compruebo[6] = {12, 8, "Inmaculada Concepcion"};
  compruebo[7] = {12, 25, "Navidad"};
}

void loop() {
  for (int i = 0; i < ES_FESTIVO; i++) {
    if (DiaSemana  = compruebo[i].diaSemana && MesAnyo == compruebo[i].mesAnyo)
      Serial.println(compruebo[i].mensaje);
  }
}

NOTA:
Observa como quien te responde usa identación, para que se pueda leer bien, cada loop. no hacemos cosas asi.

void loop() {
for (int i = 0; i < ES_FESTIVO; i++) {
if (DiaSemana  = compruebo[i].diaSemana && MesAnyo == compruebo[i].mesAnyo)
Serial.println(compruebo[i].mensaje);
}
}

Ojo que sigue estando el error en la comparación.

Saludos

if (DiaSemana  == compruebo[i].diaSemana && MesAnyo == compruebo[i].mesAnyo)

Gracias Surbyte, lo compruebo ahora, y gracias gatul, menudo error con el igual, siempre me olvido de que un igual es asignacion, no comparación gracias.

Pues señores, el problema veo que esta en la lectura del monitor serial.
He modificado el codigo colocando esos Serial.print para poder ver el recorrido del programa, porque se quedaba estancado.

ingresa el Mes
Mes introducido: 12
ingresa el dia
Dia introducido: 0 <== este valor lo ha tomado el directamente yo no lo he introducido.

struct Festivos {
  byte mesAnyo ;
  byte diaSemana;
  String mensaje;
};

#define ES_FESTIVO 8
Festivos compruebo[ES_FESTIVO];

String mensaje2 = "Ingresa el dia";
String mensaje1 = "ingresa el Mes";
byte MesAnyo;
byte DiaSemana;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

Serial.println(mensaje1);
  while (Serial.available() == 0) {
    MesAnyo = Serial.parseInt();
    }
    Serial.print("Mes introducido:  ");
       Serial.println(MesAnyo);
        delay(500);   

Serial.println(mensaje2);
  while (Serial.available() == 0) {
    DiaSemana = Serial.parseInt();
     }
     Serial.print("Dia introducido:  ");
         Serial.println(DiaSemana);
  /*===========FESTIVOS EN ESPAÑA===================
    1 de enero (viernes): Año Nuevo
    2 de abril: Viernes Santo
    1 de mayo (sábado): Fiesta del Trabajo
    12 de octubre (martes): Fiesta Nacional de España
    1 de noviembre (lunes): Día de Todos los Santos
    6 de diciembre (lunes): Día de la Constitución
    8 de diciembre (miércoles): Inmaculada Concepción
    25 de diciembre (sábado): Navidad
  */
  compruebo[0] = { 1, 1, "Any Nuevo"};
  compruebo[1] = { 4, 2, "Viernes Santo"};
  compruebo[2] = { 5, 1, "Fiesta del Trabajo"};
  compruebo[3] = {10, 12, "Fiesta Nacional de Espana"};
  compruebo[4] = {11, 1, "Dia de Todos los Santos"};
  compruebo[5] = {12, 6, "Dia de la Constitucion"};
  compruebo[6] = {12, 8, "Inmaculada Concepcion"};
  compruebo[7] = {12, 25, "Navidad"};
}

void loop() {
  for (int i = 0; i < ES_FESTIVO; i++) {
    if (DiaSemana  == compruebo[i].diaSemana && MesAnyo == compruebo[i].mesAnyo)
      Serial.println(compruebo[i].mensaje);
  }
}

A mi no me cierra

  while (Serial.available() == 0) {
    TuVariable = Serial.parseInt();
  }
  

Estás queriendo leer el buffer serie mientras está vacío.

si, veo que es eso lo que pasa, me lee el valor que introduzco y le asigna el 0 al siguiente.
tendré que mirar mas tutoriales de entrada de datos por monitor serial. creo que hay que poner algo entre las dos entradas del monitor para que no leea el monitor si no se pulsa el enter.

Prueba así

while (Serial.available() == 0);

TuVariable = Serial.parseInt();

Mientras no hay datos para leer se queda en el bucle esperando que ingreses algo, luego hace la conversión.

No es muy pintoresco pero es solo a modo de prueba.

Al margen, te describo mejor lo que te dije antes.
El código como tu lo hiciste ejecuta parseInt() mientras en buffer no tiene datos, entonces parseInt() espera 1 segundo y, si no encuentra nada para convertir, devuelve 0.

Saludos

probado, :sleepy: , sigue asignado el valor 0 a la variable

Prueba esto, a mi me ha funcionado.

struct Festivos {
  byte mesAnyo ;
  byte diaSemana;
  String mensaje;
};

#define ES_FESTIVO 8
Festivos compruebo[ES_FESTIVO];

String mensaje2 = "Ingresa el dia";
String mensaje1 = "ingresa el Mes";
long MesAnyo;
long DiaSemana;
bool flag = true;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  Serial.println(mensaje1);
  while (flag) {
        if (Serial.available() > 0) {
            MesAnyo = Serial.parseInt(SKIP_ALL, '\n');
            if (MesAnyo > 0) {
                flag = false;
                // prints the received integer
                Serial.print("I received: ");
                Serial.println(MesAnyo);
            }
        }
  }
  flag = true;
  Serial.print("Mes introducido:  ");
  Serial.println(MesAnyo);
  
  Serial.println(mensaje2);
  while (flag) {
        if (Serial.available() > 0) {
            DiaSemana = Serial.parseInt(SKIP_ALL, '\n');
            if (MesAnyo > 0) {
                flag = false;
                Serial.print("Dia introducido:  ");
                Serial.println(DiaSemana);
            }
        }
  }
  /*===========FESTIVOS EN ESPAÑA===================
    1 de enero (viernes): Año Nuevo
    2 de abril: Viernes Santo
    1 de mayo (sábado): Fiesta del Trabajo
    12 de octubre (martes): Fiesta Nacional de España
    1 de noviembre (lunes): Día de Todos los Santos
    6 de diciembre (lunes): Día de la Constitución
    8 de diciembre (miércoles): Inmaculada Concepción
    25 de diciembre (sábado): Navidad
  */
  compruebo[0] = { 1, 1, "Any Nuevo"};
  compruebo[1] = { 4, 2, "Viernes Santo"};
  compruebo[2] = { 5, 1, "Fiesta del Trabajo"};
  compruebo[3] = {10, 12, "Fiesta Nacional de Espana"};
  compruebo[4] = {11, 1, "Dia de Todos los Santos"};
  compruebo[5] = {12, 6, "Dia de la Constitucion"};
  compruebo[6] = {12, 8, "Inmaculada Concepcion"};
  compruebo[7] = {12, 25, "Navidad"};
}

void loop() {
  for (int i = 0; i < ES_FESTIVO; i++) {
    if (DiaSemana  == compruebo[i].diaSemana && MesAnyo == compruebo[i].mesAnyo)
      Serial.println(compruebo[i].mensaje);
  }
}

Perfecto funciona muy bien, pero veo que has introducido (SKIP_ALL, '\n') que "efecto" genera?
lo estoy buscando, para entender que funcion tiene, pero no lo encuentro.
literalmente es saltar todo pero puedes darme unas pinceladas de como funciona?
Gracias.

La mejor pincelada
https://www.arduino.cc/en/Reference/parseInt

Serial.parseInt(char skipChar)

Parameters

skipChar: used to skip the indicated char in the search. Used for example to skip thousands divider.

Pero la solución no esta ahi, prueba sin ello y veras que funciona. Muchas veces cuando programo como no recuerdo toda la sintaxis busco algo como parseint y luego copio y pego. El ejemplo estaba asi y falló.
Entonces le puse el flag y ahi pude controlarlo.
Asi que la solución no esta en el SKIP_ALL sino en si el valor es > 0
Porque sigue pasando.