Go Down

Topic: IF nidificato (Read 199 times) previous topic - next topic

Frankq_it

Ciao a tutti
in questo spezzone di programma
Code: [Select]

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

fabpolli

#1
Jul 24, 2014, 12:53 pm Last Edit: Jul 24, 2014, 12:59 pm by fabpolli Reason: 1
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

Go Up