Problème pour arrêter un while

Bonjour je suis un débutant en arduino, j'ai un projet qui est de faire une sirène de pompier.

Mon problème est que je voudrait me servir d'un bouton poussoir comme un bouton on/off : j'arrive bien as déclencher la sirène mais je n'arrive pas a l’éteindre j'ai tous essayé mais je n'y arrive toujours pas

voici le programme que j'ai fais :

int switchstate = 0;
  #define LA 440
#define SI 494
void setup() {
   
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  
  
  pinMode(2, INPUT);
}
  
void loop() {
  
 
  
  switchstate = digitalRead(2);
  
 
  if (switchstate == LOW) {
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW); 
    digitalWrite(5, LOW); 
    noTone(6);
  }
  
  if(switchstate ==HIGH) {
      do{
       
    
    digitalWrite(4, HIGH); 
  tone(6, LA, 7000);
  delay(500);            
  digitalWrite(4, LOW);   
 noTone(6);
  delay(10);
   
   digitalWrite(5, HIGH); 
  tone(6,SI, 7000);
  delay(500);             
  digitalWrite(5, LOW);   
   
  delay(10);
     
    
    }while (switchstate ==1);
       
     
  }
  else{
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW); 
    digitalWrite(5, LOW); 
    noTone(6);
  }
  
   
}

ta variable switchstate est rafraichie au début de loop().

Quand tu entres dans la boucle do ... while tu ne la rafraichit plus.
Donc le test while (switchstate ==1) se fait toujours avec la même valeur de switchstate
IL faut refaire une lecture de switchstate dans ta boucle do... while

Bonjour j'ai totalement changé le code mais j'ai toujours un problème lorsque j appuie sur le bouton poussoir la sirène se lance bien mais lorsque j appuie pour l arrêté je suis obligé d appuyé plusieurs fois sur le bouton poussoir pour que sa fonctionne ( je crois que le problème vient des delay mais je vois pas comment régler le problème sans casser la sirène )

int state = 0;
int old = 0;
int btnQ = 0;
int initiale = 0;
#define LA 440
#define SI 494


void setup()
{
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(2, INPUT);
  
 digitalWrite(3, HIGH); 
 digitalWrite(4, LOW);  
 digitalWrite(5, LOW);  
  noTone(6);
}

void loop()
{
 btnQ = digitalRead(2);
  if(btnQ == 1){
    delay(50);
    btnQ = digitalRead(2);
    if(btnQ == 0){
      state = old + 1;
    }
  }
  else{
    delay(100);
  }
  
  switch (state) {
    case 1:
    	digitalWrite(4, HIGH);  
        tone(6, LA, 7000);
        delay(500);             
        digitalWrite(4, LOW);    
       noTone(6);
        delay(10);

         digitalWrite(5, HIGH);  
        tone(6,SI, 7000);
        delay(500);              
        digitalWrite(5, LOW);    
        delay(10);
    	old = state;
    break;
    
    
    
    default:
    	digitalWrite(3, HIGH); 
         digitalWrite(4, LOW);  
         digitalWrite(5, LOW);  
          noTone(6);
    	old = 0;
    break;
    
  }
    
}

Un problème de rebond certainement....

Comment régler ce problème de rebond ?

Si c'est un rebond, le plus simple est d'ajouter un delay (30) juste après la lecture du bouton

Bonjour,

Il faut que tu regardes si le bouton a changé d'état. Pour cela il faut que tu compares à l'état précédent
Comme ceci par exemple:

void loop()
{
  static int btnQPrec = 0;

  btnQ = digitalRead(2);
  if (btnQ != btnQPrec)
  {
    if (btnQ == 1)
      state = (state + 1) % 2;  // change d'état
    delay(20);                  // debounce
    btnQPrec = btnQ;
  }

  switch (state) {
    case 1:
      digitalWrite(4, HIGH);
      tone(6, LA, 7000);
      delay(500);
      digitalWrite(4, LOW);
      noTone(6);
      delay(10);

      digitalWrite(5, HIGH);
      tone(6, SI, 7000);
      delay(500);
      digitalWrite(5, LOW);
      delay(10);
      break;

    default:
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      noTone(6);
      break;
  }
}

Par contre comme tu utilises des delay(), pour arrêter la sirène il faudra rester appuyer au maximum une seconde le temps que les delay() se terminent.
Il faudrait revoir l'architecture de ton programme pour ne pas utiliser de delay().