lio con condicionales y variables de estado

Buenas noches.

Estoy configurando una calefacción con Arduino y tengo varias dudas con el código que ya no se como solucionar.

Primero:

Opción manual → puede actuar de varias maneras OFF, boiler 40, boiler 60 y calefacción
Opción auto-> quiero que se active calefacción a la hora programada.

Requisitos:

  • si está activada la programación, da igual la función elegida en manual que a la hora fijada, debe ponerse la calefacción.
  • una vez finalizado el periodo programado debe ponerse de nuevo lo seleccionado en manual.
  • debe aparecer en la pantalla lo que se este pasando, es decir, off, boiler 40, boiler 60, calefacción. EN otra linea manual o auto ON o auto OFF.

Es un problema de concepto que no lo veo claro como atacarlo.

tengo en código en tres pestañas, las pongo aquí, y el enlace a GitHub.

https://github.com/AnakinSpain/Anakin_truma

Gracias.

PD: NO me deja copiar código, porque es muy extenso. copio y pego fragmentos.

void pantalla1()      //PANTALLA DE INICIO
{
    Data d = rtc.getData();
    lcd.setCursor(0,0);
    lcd.print( d.toString("d/m/y    H:i:s") ); //Imprime en pantalla la hora y fecha
    lcd.setCursor(0,1); lcd.print("SET:"); lcd.print(temp_confort);
    lcd.setCursor(13,1); lcd.print(temp_habit);lcd.print("C");
    lcd.setCursor(0,2);
    if (funcion==1)  { lcd.print("OFF        ");} else       // Si hemos seleccionado apagado
    if (funcion==2)  { lcd.print("BOILER 40  ");} else // Si hemos seleccionado boiler a 40º    
    if (funcion==3)  { lcd.print("BOILER 60  ");} else // Si hemos seleccionado boiler a 60º     
    if (funcion==4)  { lcd.print("CALEFACCION");}    // Si hemos seleccionado calefaccion   
    lcd.setCursor(13,2); lcd.print(hum_habit);lcd.print("%");
    lcd.setCursor(0,3);
    if (modo==true) {lcd.print("MANUAL");} else
    if (modo==false) {
                      if (estado==true) {lcd.print("AUTO ON ");} else
                       {lcd.print("AUTO OFF");}
                      }
    lcd.setCursor(15,3);
    if (activar==true){ (lcd.write(2));} else {lcd.print(" ");}
    encoderSW_bounce.update();  
    if (encoderSW_bounce.fallingEdge())
        { if (!lcd_encendido) {lcd.backlight(); lcd_encendido=true;delay(500);   Serial.print("pulso enciende");}//Si pulsamos entramos 
          else if (lcd_encendido) {lcd.noBacklight(); lcd_encendido=false;delay(500);} Serial.print("pulso apaga");//Si
        }
        
}
//***********   PANTALLA AJUSTE MODO *******************************************
void modo_func()

{
  boolean set_modo = false;
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("<SELEC. MODO>");
  
   menu= 0 ;                                 //Inicializamos variables para ENCODER
   lastmenu = 0; 
  while (set_modo == false){
     rotating = true;                    //Establecemos el debounce
    if(menu > lastmenu){                    //Si menu es mayor que last menu sumamos valor
      funcion++;
      funcion=constrain(funcion,1,4);    //Limite de variable 1-4
      lastmenu=menu;
    }
    else if (menu < lastmenu){             //Si menu es menor que last menu restamos valor
      funcion--;
      funcion=constrain(funcion,1,4);    //Limite de variable 1-4
      lastmenu=menu;
    }
    else if (menu == lastmenu){            //Si nada cambia mantenemos
      funcion=funcion;
    }
    lcd.setCursor(1,1); 
    if (funcion==1)  { lcd.print("OFF        ");} else       // Si hemos seleccionado apagado
    if (funcion==2)  { lcd.print("BOILER 40  ");} else // Si hemos seleccionado boiler a 40º    
    if (funcion==3)  { lcd.print("BOILER 60  ");} else // Si hemos seleccionado boiler a 60º     
    if (funcion==4)  { lcd.print("CALEFACCION");}    // Si hemos seleccionado calefaccion    
    
    encoderSW_bounce.update();                //Consultamos si hemos pulsado
    if (encoderSW_bounce.fallingEdge()){      //Si pulsamos el boton salimos de ajustar hora y pasamos a minutos
      set_modo = true ;
      Serial.print(funcion);
    }
  } 
  grabar_configuracion(); //Llamamos a la funcion para guardar en la EEPROM
 lcd.setCursor(11,3);lcd.print("GRABADO!"); delay(2000);
}
void programacion()
  {
    //int funcion_anterior;   
            Data d = rtc.getData();
             state = d.isBetween(calH_ON,calM_ON, calH_OFF,calM_OFF);
      if ((activar==true) && (state==true )) // si esta dentro de lo programado, es decir  state = true        
                {
                  (funcion=4);    // cambiamos valor variable para encender calefaccion
                  (estado=true);  // cambiamos valor variable para que pase a auto ON        
                  } else
              if (state==false)
                { (funcion=1);  (estado=false); 
                 }

No se si se entenderá lo suficiente.

Añado información de las variables:

  • boolean state; // esta variable indicara si estamos dentro del periodo programado de funcionamiento

  • boolean modo; // Variable del modo de la calefaccion MANULAL o AUTOMATICO
    // true = manual -> No funciona con temporizador, solo se fija en la tempertura seleccionada
    // false= automático -> La calefaccion actua segun el temporizador

  • boolean estado; // indica el estado
    // true = AUTO ON
    // true = AUTO OFF

  • byte modo_temp; // variable temporal modo

  • int funcion; // funcion de la calefaccion
    // 0 off
    // 1 agua a 40º
    // 2 agua 60º
    // 3 calefacción

  • boolean activar; //variable que indica si queremos activar la programacion o no

He pensado en crear una variable donde se encuadren todas las opciones es decir:

int estado; y luego asignar así:
1 si esta apagado
2 si esta boiler 40 on
3 si esta boiler 60 on
4 si esta calefacción on manual
5 si esta calefacción on automático
6 si esta calefacción off automático
en fin que no se como salir de este lío :slight_smile:

pues ya me ha ocurrido la solución.
si al final las soluciones vienen solas.

Bueno, mas allá que encontraste tu solución sería bueno que la publiques para ayudar a alguien que quiera aprender.
De todos modos es un buen programa para que se observe como se programa sin usar DELAY (por sobre todas las cosas) y interesante el uso del rotary Encoder.

Tienes razón, aunque como es un poco lioso. Lo vamos a intentar.

La variable que hace que la calefacción funcione de una manera u otra es FUNCION. de manera que cuando se cumpla que la programación esta activada y se encuentra dentro del periodo de activación cambie ese valor. luego, una vez terminada vuelva al modo manual seleccionado. si está el modo programación activado.

void programacion()
{
  //int funcion_anterior;   
  Data d = rtc.getData();
  state = d.isBetween(calH_ON,calM_ON, calH_OFF,calM_OFF);
  if ((activar==true) && (state==true )) // si esta dentro de lo programado, es decir  state = true        
  {
    (funcion=4);    // cambiamos valor variable para encender calefaccion AUTO ON CALEFACCION                        
  } 
  else
    if (state==false)
    {
      (funcion=modo_manual);
    } 

}

De todos modos en el enlace a GitHub está el código completo.