if(millis()-t1>2000): una conferma, per favore

Datman:
se la condizione è vera, l'esecuzione salta dove previsto, senza controllare ulteriormente se la condizione è vera

La domanda era un po' ambigua anche se più o meno si poteva intuire. E si, in una logica a stati/tempi discreti non parallela le cose avvengono solo in un certo momento, per cui una condizione viene valutata solo nell'esatto momento in cui viene valutata :slight_smile: ed è solo in quell'istante che diventa determinante per il corso degli eventi immediatamente successivo.

Se interessa fare qualcosa al variare della condizione questa va valutata continuamente (che è il modo normale di procedere nei programmi per PLC o nei programmi a stati non bloccanti, dove tutte le condizioni vengono testate decine, centinaia o migliaia di volte al secondo).

Ad esempio questa è la parte relativa alla regolazione ora/minuti con un encoder che sto sperimentando in questi giorni. Il case è eseguito migliaia di volte al secondo. Una pressione lunga fa ritornare alla maschera principale (fase=0). Ruota destra/sinistra (eventi onUp/onDn) modificano il valore. Con clic si avanza da regolazione ore a regolazione minuti a conferma. Se non si tocca nulla per 60 secondi si torna alla maschera principale.

case REGORA:
    if (primo)                     //  prima esecuzione del case
    {
            s = 0;                 // 0 = regola ora, 1 minuti
            modHour = now.hour;
            modMinute = now.minute;
            displayModHour(s, modHour, modMinute);
            modify = false;
            t = gmillis; 
    }

    if (onLpress) { fase = PRINCIPALE;  beepLpress();  break; }  //  abbandono

    if (onUp)
    {
            if      (0 == s) { modHour   = (modHour + 1)   % 24; }
            else if (1 == s) { modMinute = (modMinute + 1) % 60; }

            beepUp();
            modify = true;
            displayModHour(s, modHour, modMinute);
            t = gmillis;
    }
    else if (onDn)
    {
            if      (0 == s) { modHour   = (modHour > 0)   ? modHour-1   : 23; }
            else if (1 == s) { modMinute = (modMinute > 0) ? modMinute-1 : 59; }

            beepDn();
            modify = true;
            displayModHour(s, modHour, modMinute);
            t = gmillis;
    }

    if (onClic) { beepClic();  t = gmillis; }

    if (onClic  &&  0 == s)             // avanza a regolazione minuti
    {
            s = 1;
            displayModHour(s, modHour, modMinute); 
    }
    else if (onClic  &&  1 == s)        // conferma, salva ed esce
    {
            fase = 0; 
            if (modify)
            {
                    now.hour = modHour;
                    now.minute = modMinute;
                    setHour(); 
            }
    }

    if ((uint16_t)gmillis-t > 60000) { fase = PRINCIPALE; }  // timeout inattivita`
break;