Uscita inaspettata da ciclo while

const int rstX = 5,  rstY = 6;

void setup() {
  pinMode(rstX, INPUT_PULLUP);
  pinMode(rstY, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  if ( !digitalRead(rstX) && !digitalRead(rstY) ) {
    Serial.println("setup");
    delay(500);
    DROsetup();
  }
  if (!digitalRead(rstY)) Serial.println("rstY");
  if (!digitalRead(rstX)) Serial.println("rstX");
  Serial.println("loop");
  delay(500);
}

void DROsetup() {
  Serial.println("DROsetup");
  while ( ( digitalRead(rstX) && digitalRead(rstY)) ) {
    Serial.println("while");
    if (!digitalRead(rstX)) {
      Serial.println("WrstX");
    }
    if (!digitalRead(rstY)) {
      Serial.println("WrstY");
    }
  }
}

salve gente, perchè in questo sketch quando sono nel ciclo while, premendo uno dei due pulsanti (e tra l'altro non esegue gli if interni) mi esce dal ciclo, quando la condizione del while è la pressione dei due tasti contemporaneamente? dov'è l'errore?

edit: esce dal ciclo dopo 1-2-3 pressioni di un singolo tasto, così a random.

Non c'è errore, il programma si comporta come deve, mi stupirebbe il contrario.
Il ciclo while ricomincia quando la condizione specificata dentro le parentesi è vera, cioè
while( 1 ) o while ( true ) sono cicli infiniti.
while ( 0 ) o while (false ) non esegue alcun ciclo neanche uno.

Quindi il risultato della espressione:
digitalRead(rstx) && digitalRead(rsty) è true se non premi alcun pulsante poiché sono entrambe gli ingressi con pull-up. Mentre il risultato sarà false appena premi uno o entrambe i pulsanti e ovviamente il while termina di ciclare.

Ciao.

grazie.
scusa ma non mi è chiaro il concetto. la condizione è una AND, quindi dovrebbe essere true quando tutti e due i pulsanti sono low. se avessi messo un OR allora si, bastava un solo pulsante. non è così?

Meglio dare una ripassata alle tabelle di verità, qui ad esempio.

Comunque puoi anche stampare il risultato della espressione e constatare che sarà vera se entrambe sono vere, false in tutti gli altri casi.

ah, forse ho capito. dovrei mettere i pulsanti in pull-down per ottenere quello che voglio

Puoi anche negare l'uscita della espressione così:

while ( ! ( digitalRead(rstX) && digitalRead(rstY)) ) {

Prova se si comporta come desiderato.

PS: non ho compreso come vuoi che si comporti.

Ciao.

ho messo i pulsanti in pull-down ma è lo stesso: premendo i due pulsanti insieme entra in while, cicla, ma se premo uno dei due pulsanti esce.
io vorrei uscire dal ciclo while solo premendo insieme i due pulsanti

void DROsetup() {
  Serial.println("DROsetup");
  while ( 1 ) {
    Serial.println("while");
    if ( ! digitalRead(rstX)  && ! digitalRead(rstY)  ) {
        break;
    }
      Serial.println("WrstX");
    
    if (!digitalRead(rstY)) {
      Serial.println("WrstY");
    }
  }
}

prova così con le pull-up, mentre se vuoi provare con le pull-down devi togliere entrambe i punti esclamativi !.

Ciao.

così funziona!
grazie Maurotec !

Nota: che intendi con "i pulsanti in pull-down"? Io interpreto che i pulsanti tirano giù a massa.
Con le resistenze di pull-up, i pulsanti vanno verso massa; con le resistenze di pull-down, i pulsanti vanno verso il positivo. Non è pignoleria, ma se non si è precisi si rischia di dire l'opposto di ciò che si vorrebbe dire.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.