problème avec la boucle while

Bonsoir,
Essayant de faire un programme contenant la boucle while,celle ci ne fait pas ce que je veux.
la variable est la lecture d'un bouton , 0 si enfoncé, 1 si appuyé .
Avec digitalRead, j'ai constaté que la valeur passait bien de 0 à1 , mais elle ne sort pas de la boucle infinie.
Alors que si j'appuie sur le bouton dès le départ , elle lit bien 1 et ne rentre pas dans la boucle; mais si je relâche, alors le 0 est lu, ça rentre dans la boucle, mais impossible d'en sortir ( malgré que j'enfonce le bouton , ça lit bien 1 , mais ça reste dans la boucle )
Où ai-je fait une erreur ?
Merci

// Constantes
// les relais
const int relais1 = 2;
const int relais2 = 4;
const int relais3 = 7;
const int relais4 = 8;
const int relais6 = 11;
const int relais5 = 12;
const int boutonBas = 9;
const int boutonHaut = 10;

// variable qui enregistre l'état du bouton
int etatBoutonBas;

int L = analogRead(A0);
int N = 100;
int J = 400;
unsigned long T = 1500;
int LN1 = 5;
int LN2 = 6;
int LN3 = 7;
int LJ1 = 915;
int LJ2 = 916;
int LJ3 = 917;

void setup() {
  Serial.begin(115200);

  //declaration des pins pour les relais en sortie=

  pinMode (relais1, OUTPUT);
  pinMode (relais2, OUTPUT);
  pinMode (relais3, OUTPUT);
  pinMode (relais4, OUTPUT);
  pinMode (relais5, OUTPUT);
  //declaration de la pin pour la photoresistance en entrée=
  pinMode (A0, INPUT);
  pinMode(boutonBas, INPUT_PULLUP);

  etatBoutonBas = HIGH; // on initialise l'état du bouton comme "relaché"
}

void loop() {
  digitalWrite(relais1, HIGH);
  digitalWrite(relais2,  HIGH);
  digitalWrite(relais3, HIGH);
  digitalWrite(relais4,  HIGH);
  digitalWrite(relais5,  LOW);

  Serial.println(" 111111111111111111111111111111111 DEBUT");
  L = analogRead(A0);
  Serial.println(L);

  if (L < N) {
    Serial.println("  N 1");
    L == LN1;
    delay (T);
    Serial.print("Analog reading = ");
  }
  L = analogRead(A0);
  Serial.println(L);

  if (L < N) {
    Serial.println("  N 2");
    L = LN2;
    delay (T);
    Serial.print("Analog reading = ");
  }
  L = analogRead(A0);
  Serial.println(L);

  if (L < N) {
    L == LN3;
    delay (T);
    L == LN3 ;
    digitalRead(9);
    Serial.println ( digitalRead(9));
    Serial.println("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
    digitalWrite(relais3,  HIGH);
    digitalWrite(relais4,  HIGH);
    digitalWrite(relais1,  LOW);
    digitalWrite(relais2,  LOW);
    delay (1500);
    digitalWrite(relais1,  HIGH);
    digitalWrite(relais2,  HIGH);
    digitalWrite(relais5,  HIGH);  // allumé
    delay (500);
    digitalWrite(relais5,  LOW);  // éteint
    
    etatBoutonBas = digitalRead(boutonBas); // Rappel : boutonBas = 9  PERMET DE SAVOIR SI OUI OU NON ON EST EN BAS
    digitalRead(boutonBas);
    Serial.println ( digitalRead(9));
    Serial.println("00000000000000000000000 ");
    while ( etatBoutonBas == 0 )  {
      Serial.println("ZZZZZZZZZZZZZZZ ");
      digitalWrite(relais3,  LOW);       // PORTE DESCENT         LOW  == ALLUMER
      digitalWrite(relais4,  LOW);        // PORTE DESCENT      LOW  == ALLUMER
      digitalRead(etatBoutonBas);
      Serial.println ( digitalRead(9));
      Serial.println(" BOUTON ETEINT");
    }
    digitalRead(boutonBas);
    Serial.println ( digitalRead(9));
    Serial.println ( "kkkkkkkkkkkkkkkkkkkkk");
  }
}

passage de 0 à 1 sans effet.PNG

bouton enfoncé dès la mise en route.PNG

passage de 0 à 1 sans effet.PNG

bouton enfoncé dès la mise en route.PNG

Cavok:
… lecture d’un bouton , 0 si enfoncé, 1 si appuyé …

je n’ai pas lu plus loin : rien que ça, c’est une contradiction !

Correction :
je voulais écrire à la ligne 2 : lecture d'un bouton 0 si relâché, 1 si appuyé

sinon (après lecture)
dans ta boucle : tu confonds boutonBas et etatBoutonBas.

boutonBas est un numéro de connexion : 9, dans ton cas
etatBoutonBas est une variable, qui prend seulement deux états : 0/LOW ou 1/HIGH
si tu lis l'état logique de la broche qui porte le numéro contenu dans etatBoutonBas, ce sera l'état de l'une des deux qui portent le numéro 0 ou 1, pas celui de celle numérotée 9.

pose-toi une question :

que se passe-t-il au moment de

while(condition)
{
boucle
}

?

si condition est égale à zéro, la boucle ne s'effectue pas, et on passe à la suite.
si condition est différente de zéro, alors la boucle est effectuée et recommence.

pourquoi ne testes tu pas directement ton entrée (la valeur 9 contenue dans ta constante boutonBas, ou carrément boutonBas) dans la condition du while ?

ça donnerait :
while(digitalRead(9))
ou
while(digitalRead(boutonBas))

mais en tenant compte du fait que l'état actif de ton BP est LOW, c'est-à-dire zéro ...

Merci de ton aide
Maintenant ça marche :slight_smile:

au plaisir