boucle while

Bonjour, j'ai un autre problème de boucle sur mon programme. C'est pour réaliser un autotest d'interrupteur, je demande à l'opérateur d'appuyer sur 8 boutons et si je détecte l'appuie je dis que c'est bon et sinon je dis que ce n'est pas bon. ca marchait mais j'ai remarqué que en cas de panne d'un bouton le test était bloqué la et je souhaite donc rajouter un timer pour que si l'opérateur appuie sur le bouton mais que celui ci est en rade, le programme passe au prochain step au bout de 5 s...
voila le bout de code:

//Autotest commandes boite de raccordement EV:
  for (int i = 0; i < nombreCommandes; i++) {
    genie.WriteStr(9, "appuyer sur Cde bte raccord EV");
    tempo = millis();
    evenement = lireEvenement(&numPoussoir);
    while( millis() - tempo < 5000 || evenement != EVENEMENT_PRESSE){
     evenement = lireEvenement(&numPoussoir);
      if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
        resultatAT++;
        genie.WriteStr(affCr[numPoussoir + 16], "OK");
      } else {
        genie.WriteStr(affCr[numPoussoir + 16], "NOK");
      }
      delay(10);
    }
  }
  
  //autotest des commandes déportées:
  for (int i = 0; i < nombreCommandes; i++) {
    genie.WriteStr(9, "appuyer sur Cde deportee EV");
    etatCev[i] = digitalRead(pinCEV[i]);
    if (etatCev[i] != 0) {
      tempo = millis();
      while (millis() - tempo < 5000 || etatCev[i] == 1) {
        etatCev[i] = digitalRead(pinCEV[i]);
        if (etatCev[i] == 0) {
          resultatAT++;
          genie.WriteStr(affCr[i + 24], "OK");
        } else {
          genie.WriteStr(affCr[i + 24], "NOK");
        }
      }
    } else {
      genie.WriteStr(affCr[i + 24], "NC");
      AT++;
    }
  }

La première partie du code test 8 boutons qui sont sur un seul fil, si au bout de 5s le bouton n'est pas détecté appuyé je passe au bouton suivant et ainsi de suite.

La deuxième partie ce sont des télécommandes déportées optionnelles du coup si je met à la masse la pin de mesure ca signifie que la télécommande n'est pas connectée… pour le reste c'est le même principe, je détecte un appui je met ok sinon je met nok.

Le problème est que la tempo marche sur toute la boucle for au lieu de fonctionner sur la while. Je souhaite en fait que pour chaque bouton, l'opérateur a 5s pour appuyé sinon on considère que le bouton est HS et on passe au bouton suivant. donc si on passe les 5 s je veux afficher NOK et incrémenter ma boucle for… alors que la, d'une je n'ai pas le NOK qui s'affiche et en plus j'ai 5s pour appuyé sur les 8 boutons en gros…

Bonjour,
numPoussoir ne change pas dans la boucle while

c'est normal, la boucle while est là pour attendre l'appui sur un poussoir où passer à la prochaine itération de la boucle for dans le cas où le dit poussoir est HS… sauf que ça ne fonctionne pas...

Essaie comme ça:

  for (int i = 0; i < nombreCommandes; i++) {
    genie.WriteStr(9, "appuyer sur Cde bte raccord EV");
    tempo = millis();
    evenement = lireEvenement(&numPoussoir);
    while( millis() - tempo < 5000 || evenement != EVENEMENT_PRESSE){
     evenement = lireEvenement(&numPoussoir);
     // delay(10);
    }
    if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
      resultatAT++;
      genie.WriteStr(affCr[numPoussoir + 16], "OK");
    } else {
      genie.WriteStr(affCr[numPoussoir + 16], "NOK");
    }
  }

harkilius:
c'est normal, la boucle while est là pour attendre l'appui sur un poussoir où passer à la prochaine itération de la boucle for dans le cas où le dit poussoir est HS… sauf que ça ne fonctionne pas...

Je me suis trompé, c'est dans la boucle for que tu ne changes pas de bouton

savoriano:
Essaie comme ça:

  for (int i = 0; i < nombreCommandes; i++) {

genie.WriteStr(9, "appuyer sur Cde bte raccord EV");
    tempo = millis();
    evenement = lireEvenement(&numPoussoir);
    while( millis() - tempo < 5000 || evenement != EVENEMENT_PRESSE){
    evenement = lireEvenement(&numPoussoir);
    // delay(10);
    }
    if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
      resultatAT++;
      genie.WriteStr(affCr[numPoussoir + 16], "OK");
    } else {
      genie.WriteStr(affCr[numPoussoir + 16], "NOK");
    }
  }

Ne fonctionne pas... en revanche j'ai trouvé... en fait dans ma boucle while je dois mettre un "et" et non un "ou" car la boucle actuelle continu de tourner car j'ai toujours la condition evenement != EVENEMENT_PRESSE qui est toujours vrai étant donné que je n'appui pas sur les boutons... tandis que si je met un et (&&) dés qu'une des conditions n'est plus rempli, soit la tempo est dépassé ou si j'appui sur un bouton, je sort de ma boucle while...

en revanche la tempo n'est pas respecté je suis passé sur une tempo a 20000 ms ce qui si je ne m'abuse fait 20s sauf que les itérations de la boucle for durent 2s à tout casser...

Voila le code auquel j'ai abouti pour l'instant:

//Autotest commandes boite de raccordement EV:
  for (int i = 0; i < nombreCommandes; i++) {
    genie.WriteStr(9, "appuyer sur Cde bte raccord EV");
    evenement = lireEvenement(&numPoussoir);
    tempo = millis();
    do {
      evenement = lireEvenement(&numPoussoir);
      delay(20);
      if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
        resultatAT++;
        genie.WriteStr(affCr[numPoussoir + 16], "OK");
      } else {
        genie.WriteStr(affCr[i + 16], "NOK");
      }
    } while ((millis() - tempo <= 20000) && (evenement != EVENEMENT_PRESSE));
  }

J'ai opté pour une boucle do... while sinon je n'ai pas de résultat... le soucis de cette partie de code c'est que comme numPoussoir est différent de i, je peux avoir les résultats ok mais les nok ne s'afficheront pas forcément...

pour la deuxième boucle de commande optionnelle voila ce que ca donne:

//autotest des commandes déportées:

  for ( int i = 0; i < 7 ; i + 2 ) {
    genie.WriteStr(9, "appuyer sur Cde deportee EV");
    etatCev[i] = digitalRead(pinCEV[i]);
    etatCev[i + 1] = digitalRead(pinCEV[i + 1]);
    tempo = millis();
    do {
      etatCev[i] = digitalRead(pinCEV[i]);
      delay(20);
      if (etatCev[i] == 0 ) {
        resultatAT++;
        genie.WriteStr(affCr[i + 24], "OK");
      }
    } while ((millis() - tempo <= 20000) && (etatCev[i] == 1));
    tempo = millis();
    do {
      etatCev[i + 1] = digitalRead(pinCEV[i + 1]);
      delay(20);
      if (etatCev[i + 1] == 0 ) {
        resultatAT++;
        genie.WriteStr(affCr[i + 25], "OK");
      }
    } while ((millis() - tempo <= 20000) && (etatCev[i + 1] == 1));
    if ((etatCev[i] == 1) && (etatCev[i + 1] == 1) {
      resultatAT + 2;
      genie.WriteStr(affCr[i + 24], "NC");
      genie.WriteStr(affCr[i + 25], "NC");
    } else {
      genie.WriteStr(affCr[i + 24], "NOK");
      genie.WriteStr(affCr[i + 25], "NOK");
    }
  }

Comme je n'ai pas de moyen de faire comprendre à la machine que la télécommande est présente ou absente (c'est une prise 4 contacts, un +5V, une masse et 2 pin de mesure pour les 2 boutons de la télécommande)
Je me dis que si les 2 commandes d'une même télécommande sont NOK c'est que probablement la télécommande n'est pas connectée et du coup ca me compte l'autotest bon mais affiche un non connecté NC.

La question est pourquoi mes tempos ne sont pas respectées (2s au lieu de 20s) et puis-je faire comprendre à la machine que ma télécommande n'est pas branché avec les 4 fils que j'ai mentionné.
Pour moi, si je dis que la télécommande est à 0 c'est comme si le bouton était appuyé et du coup mon electrovanne va commuter tout le temps, et si je la met au 5V il verra un 1 et il ne fera pas la différence entre un bouton absent et un bouton HS... et mon résultat autotest ne s'incrémentera pas et sera considéré comme mauvais où cachera des pannes si je branche les 4 télécommandes...