problema switch case

Ciao a tutti, eccomi ancora con un problema che sicuramente sarà una stupidata ma proprio mi sta facendo impazzire…

Ho Arduino Mega e attraverso un ds1307, e un display LCD 1602 sto impostando una centralina di controllo per accensione e spegnimento di 8 canali. Uso 6 pulsanti di controllo e navigazione (perchè tutto è ordinato da menù e gli orari sono modificabili).

Ho creato un
If…
else if …

per definire in che punto del menù mi trovo modifico una variabile che poi controllo durante il loop. questo è l’estratto del codice che credo possa interessare per trovare il problema (perchè il codice intero è piuttosto lungo).

.....

void loop(void)
{
  char buffer[10] = ""; DateTime now = RTC.now();
  char CH1ora[5]=""; char TCH1ora[5]="";
  char CH2ora[5];
  readButtons();  
  navigateMenus();

  switch (nMenu){
  
    
      
    case 0:
  if ( digitalRead( buttonPinEnter ) == LOW) { time = millis(); }
 
    
    lcd.clear();
 
    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(0,0);
    lcd.print( buffer );
 
 
    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(0,1);
    lcd.print( buffer );
 
    if (time > 0 && setModeTime < (millis() - time) ) { setMode( now ); }
    
    
     if ( digitalRead( buttonPinEsc ) == HIGH) { 
       
        lcd.setCursor(0,1);
        //sprintf( buffer); 
      }else if ( digitalRead( buttonPinEsc ) == LOW) {
        char buffer[10] = "";
        (buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
      }
    
    
    delay(1000);
    break;
    
    
    case 1:
    
              
    if (digitalRead(buttonPiu) == HIGH) {
      ACH1h = (ACH1h++);
      delay(200);
    }
    if (digitalRead(buttonMeno) == HIGH) {
      ACH1m = (ACH1m++);
      delay(200);
    }
    if (ACH1h > 23) { ACH1h = 0; }
    if (ACH1m > 59) { ACH1m = 0; }
    sprintf(CH1ora,"");
    sprintf(CH1ora,  "%02d:%02d", ACH1h, ACH1m);
    lcd.setCursor(0,1);
    lcd.print( CH1ora );  
      
      
      break;
      

    
    case 2:
      if (digitalRead(buttonPiu) == HIGH){
          FACH1=(FACH1++);
          delay(300);
          //lcd.clear;
          lcd.setCursor(0,1);
          lcd.print(FACH1);
      }
      if (digitalRead(buttonMeno) == HIGH && FACH1 >=1){
          FACH1=(FACH1--);
          delay(300);

          lcd.setCursor(0,1);
          lcd.print(FACH1);
      }
   break;   
  
  case 3:
              
    if (digitalRead(buttonPiu) == HIGH) {
      TCH1h = (TCH1h++);
      delay(200);
    }
    if (digitalRead(buttonMeno) == HIGH) {
      TCH1m = (TCH1m++);
      delay(200);
    }
    if (TCH1h > 23) { TCH1h = 0; }
    if (TCH1m > 59) { TCH1m = 0; }
    sprintf(TCH1ora,"");
    sprintf(TCH1ora,  "%02d:%02d", TCH1h, TCH1m);
    lcd.setCursor(0,1);
    lcd.print( TCH1ora );  
      
      
      break;
   

    case 4:
      if (digitalRead(buttonPiu) == HIGH){
          FTCH1=(FTCH1++);
          delay(300);
          //lcd.clear;
          lcd.setCursor(0,1);
          lcd.print(FTCH1);
      }
      if (digitalRead(buttonMeno) == HIGH){
          FTCH1=(FTCH1--);
          delay(300);
          //lcd.clear;
          lcd.setCursor(0,1);
          lcd.print(FTCH1);
      }
   break;

//   ........................

}   //  SWITCH

else if(newMenuItem.getName()=="ACH1"){
      ach();
      lcd.print("ACH1");
      nMenu=1;
  }else if(newMenuItem.getName()=="FACH1"){
      fach();
      lcd.print(FACH1);
      nMenu=2;
  }else if(newMenuItem.getName()=="TCH1"){
      tch();
      lcd.print("TCH1");
      nMenu=3;
  }else if(newMenuItem.getName()=="FTCH1"){
      ftch();
      lcd.print(FTCH1);
      nMenu=4;

Questo il problema:

I pulsanti buttonPiu e buttonMeno sono i pulsanti con cui modifico le variabili che mi appaiono sul display. Riesco a modificare il valore di ACH1h e ACH1m solo se prima mi muovo all’interno del sottomenù (quindi vado avanti, torno indietro) e i valori si modificano…altrimenti NO!!

Qualcuno riuscirebbe ad aiutarmi?

Grazie in anticipo a chi vorrà provarci.

Non ho capito, nel tuo codice vedo istruzioni strane:
ad esempio

ACH1h = (ACH1h++);

e poi:

(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());

Inoltre è indentato male, io non riesco a seguirlo, come logica. Formattalo prima di ripubblicarlo con l’apposita opzione dell’IDE

leo72:
Non ho capito, nel tuo codice vedo istruzioni strane:
ad esempio

ACH1h = (ACH1h++);

e poi:

(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());

Inoltre è indentato male, io non riesco a seguirlo, come logica. Formattalo prima di ripubblicarlo con l'apposita opzione dell'IDE

Hai ragione, scusate.

ACH1h = (ACH1h++);

Questa è una correzione fatta e poi mai ripristinata, in origine era

 (ACH1h++)
(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());

=(
questa è un'istruzione della libreria RTClib.h
Non capisco quale sia la cosa che ti risulta strana
=(

case 1:

    // char CH1ora[5]="";

    if (digitalRead(buttonPiu) == HIGH) {
      ACH1h = (ACH1h++);
      delay(200);
    }
    if (digitalRead(buttonMeno) == HIGH) {
      ACH1m = (ACH1m++);
      delay(200);
    }
    if (ACH1h > 23) { 
      ACH1h = 0; 
    }
    if (ACH1m > 59) { 
      ACH1m = 0; 
    }
    sprintf(CH1ora,"");
    sprintf(CH1ora,  "%02d:%02d", ACH1h, ACH1m);
    lcd.setCursor(0,1);
    lcd.print( CH1ora );  


    break;

  case 2:
    if (digitalRead(buttonPiu) == HIGH){
      FACH1=(FACH1++);
      delay(300);
      //lcd.clear;
      lcd.setCursor(0,1);
      lcd.print(FACH1);
    }
    if (digitalRead(buttonMeno) == HIGH && FACH1 >=1){
      FACH1=(FACH1--);
      delay(300);

      lcd.setCursor(0,1);
      lcd.print(FACH1);
    }
    break;   

  case 3:

    if (digitalRead(buttonPiu) == HIGH) {
      TCH1h = (TCH1h++);
      delay(200);
    }
    if (digitalRead(buttonMeno) == HIGH) {
      TCH1m = (TCH1m++);
      delay(200);
    }
    if (TCH1h > 23) { 
      TCH1h = 0; 
    }
    if (TCH1m > 59) { 
      TCH1m = 0; 
    }
    sprintf(CH1ora,"");
    sprintf(CH1ora,  "%02d:%02d", TCH1h, TCH1m);
    lcd.setCursor(0,1);
    lcd.print( CH1ora ); 
    break;


  case 4:
    if (digitalRead(buttonPiu) == HIGH){
      FTCH1=(FTCH1++);
      delay(300);
      //lcd.clear;
      lcd.setCursor(0,1);
      lcd.print(FTCH1);
    }
    if (digitalRead(buttonMeno) == HIGH){
      FTCH1=(FTCH1--);
      delay(300);
      //lcd.clear;
      lcd.setCursor(0,1);
      lcd.print(FTCH1);
    }
    break;
////////////////  CODICE  



else if(newMenuItem.getName()=="ACH1"){
    ach();
    //lcd.print("ACH1");
    nMenu=1;
  }
  else if(newMenuItem.getName()=="FACH1"){
    fach();
    lcd.print(FACH1);
    nMenu=2;
  }
  else if(newMenuItem.getName()=="TCH1"){
    tch();
    lcd.print("TCH1");
    nMenu=3;
  }
  else if(newMenuItem.getName()=="FTCH1"){
    ftch();
    lcd.print(FTCH1);
    nMenu=4;
  }

La cosa strana è che me lo fa con tutti i primi oggetti di ogni sottomenù.
Per strutturare il menù ho usato la libreria MenuBackend.h
Negli else if ho provato anche ad aggiungere dei lcd.print con dei delay() per capire se effettivamente arrivava in quella parte di codice e quindi se arrivava ad impostare la variabile ed effettivamente mi mostra quanto impostato e per il tempo richiesto, quindi direi che esegua correttamente quella parte di programma.

Mi risultano strane le 2 istruzioni perché la prima è un incremento che lavora in C incrementando la variabile, senza bisogno di assegnamenti:

c = c + 1
equivale a
c += 1
che equivale a
c++

Non devi fare l'assegnamento dopo l'incremento, come hai fatto tu così: c = c++

La seconda non mi torna perché in altri punti del codice usavi la funzione sprintf:
sprintf(buffer, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());

mentre in quel pezzo che ti ho evidenziato non hai usato sprintf().
sptrintf è una funzione predefinita del tool di librerie standard Avr che serve a formattare l'output, non è una funzione della libreria RTC