Stopper la boucle while

Bonjour,
Bien que je pence ne pas avoir de réponce, je vous fait pare de mon problème.
Voila. j'ai fabriquer un jeu de lumière. Du stype lumière sur les scène de festival. j'ai trois lampes
et je veux pourvoir selectionner les différents mode sur mon pc a partir d'une forme visual studio.
Mais c'est pas la mon problème. Le soucis bien que je sais que l'on ne peut pas bloquer une boucle c'est que je doit arréter une boucle while.

voici le code:

void loop(){
if(Serial.available()>0){
data = Serial.read();

if(data == 'a'){
while(true){
digitalWrite(lampe1,HIGH);
digitalWrite(lampe2,HIGH);
digitalWrite(lampe3,HIGH);
delay(250);
digitalWrite(lampe1,LOW);
digitalWrite(lampe2,LOW);
digitalWrite(lampàe3,LOW);
delay(250);
}

if(data == 'b'){
digitalWrite(lampe1,LOW);
digitalWrite(lampe2,LOW);
digitalWrite(lampe3,LOW);
}
}
}

j'ai déja retourner internet dans tout les sens mais je ne trouve pas la réponce.
pour info mon arduino est un nano "old bootloader"
j'éspère pouvoir avoir une réponce. de mon coté je cherche encore.
Merci

Un break doit permettre de sortir d'une boucle while. A vérifier...

Mais la solution plus élégante serait de ré-écrire ton code en tenant compte que la loop est elle même une boucle while...

Ton projet me semble bien adapté à un codage par machine d'états. Il y a des tutos sur le forum, dans la section... tutos

Bien que je pence ne pas avoir de réponse, je vous fait pare de mon problème.

Dans l'absolu la majorité des messages ici ont des réponses, surtout si l'auteur de la question montre un peu de respect pour les autres membres du forum et a pris le temps de lire les règles d'usage épinglée en haut du forum. Manifestement ce n'est pas votre cas.

corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)


Pour vous aider à avancer:

regardez l'exemple 'blink without delay', ça vous donnera une idée de comment utiliser milllis() pour ne pas avoir à lancer vous même une boucle infinie.

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

si vous n'avez pas envie de faire tout cela, vous pourriez remplacer la boucle infinie par un while (Serial.available() == 0) {... comme cela vous sortez de la boucle quand un nouveau caractère arrive, ce qui permet de remonter au début de la loop() et de tester quel est donc ce nouveau caractère mais le test ne se fait que toutes les 500ms car vous avez deux delay(250) dans la boucle du cas 'a'.

void loop() {
  if (Serial.available() > 0) {
    switch (Serial.read()) {
      case 'a':
        while (Serial.available() == 0) {
          digitalWrite(lampe1, HIGH);
          digitalWrite(lampe2, HIGH);
          digitalWrite(lampe3, HIGH);
          delay(250);
          digitalWrite(lampe1, LOW);
          digitalWrite(lampe2, LOW);
          digitalWrite(lampàe3, LOW);
          delay(250);
        }
        break;
      case 'b':
        digitalWrite(lampe1, LOW);
        digitalWrite(lampe2, LOW);
        digitalWrite(lampe3, LOW);
        break;
      default: // que faire en cas d'autre caractère?
        break;
    }
  }
}

Assurez vous de ne pas envoyer de '\r' ou '\n' en même temps que 'a' ou 'b' sinon ça ne marchera pas.

Avant de lire la réponse de J-M-L j'ai imaginé comme moi j'aurais fait.

        while (Serial.available() == 0) {

Ca c'est pour moi génial car c'est d'une simplicité extrême et efficace.

Au souci prés que vous avez de l'attente active dans ce while et donc la réactivité entre l'entrée au clavier et le stop effectif ne sera pas bonne. et s'il voulez faire clignoter ses lampes plus lentement encore ce serait pire...

donc pour moi ce n'est pas une super approche.

Ce n'est pas l'approche que j'ai aimé, car j'ai compris le problème que peux engendrer mais j'ai aimé comme le problème à été réglé en gardant le même principe de Rossion. Apres c'est à lui de comprendre le problème et trouver une autre façon de faire (si pour lui le manque de réactivité est un problème). C'est comme ça qu'on progresse !