IF nidificato

Ciao a tutti
in questo spezzone di programma

const int debounceDelay = 10; //  millisecondi da aspettare fino alla stabilità
int fase;
boolean debounce(int pin) {

boolean state;
boolean previousState;
previousState = digitalRead(pin); //salva lo StatoStato dell'interruttore
for(int counter= 0; counter < debounceDelay; counter++)
{
  delay(1); // aspetta 1millisecondo
  state = digitalRead(pin); // legge il pin
  if( state != previousState)
  {
    counter = 0; //azzera il contatore quando cambia lo Stato
    previousState = state; // e salva lo stato corrente
  }
 }
  
// qui quando lo stato dell'interruttore è stabile da un intervallo di tempo
// maggiore di quello di debounce
return state;
}

void Inizio() {
...
fase=1;
}
void setup() {
fase=0;
}
void loop()
 {
  if(debounce(Start))  {   // premuto pulsante Start
   if(fase==0) {
       Inizio();
   }
    else
    {
    IntervStart();
    }
   }

io lo interpreto così:
Se premuto start
Se fase è 0 fai Inizio()
altrimenti fai IntervStart)

con il serial.print
esegue Inizio()
esegue IntervStart() immediatamente dopo

Perchè?
all’inizio fase è zero quando premo il pulsante deve eseguire Inizio()
al loop successivo fase=1 ma non lo testa perchè debounce(Start) deve essere falso
(oppure no?)
Franco

Per come è strutturato il codice non appena teminato Inizio va di nuovo a testare il pulsante e se ancora premuto (come probabilmente accade nella realtà visti i tempi ridotti) esegue l'else in quanto l'alra variabile a quel punto vale 1. Esiste una libreria Debounce per fare il controllo dei pulsanti, prova ad usare quella. EDIT: Ad ogni modo dovresti memorizzarti in una variabile lo stato del pulsante nel loop e entrare nell'if solo se il suo stato cambia o assume il valore premuto e rientra solo se prima il tatso è stato rilasciato Ciao