sortir d'une boucle while

bonjour a tous

après plusieurs essaie infructueux , je viens vers vous .

j'essaye de sortir d'une boucle while.

voila l'idée du programme

j'ai un switch qui contient 2 case(commandée avec une réception IR pour contrôlée les case)

dans chaque case un while avec comme condition une valeurs booléen qui passe a vrai si le code de télécommande correspondant.

donc j'ai tenter de mettre un if dans la boucle qui dit que si valeur télécommande est differente de (ex:0xff56g) alors la valeurs booléen passe a false

mais le probleme c'est que ca reste bloqué dans le while

merci d'avance

void loop() {
  if (monRecepteurIR.decode(&messageRecu))
  {
    Serial.println(messageRecu.value, HEX);
    again = true;
    
    switch (messageRecu.value)
    {
      case 0xFF30CF: //// touche1
        Serial.println("touche1");
      
        while(again)
        {
          
            
             if (messageRecu.value =!0xFF30CF)
  {
    Serial.println(messageRecu.value, HEX);
    break;
    again = false;
    
  }
          
        temps = (millis() + (15 * 1000)) / 1000;
      temps_2 = (millis() + (11 * 60000)) / 60000;
      if (millis() > 5000)
      {
        temps %= 60;
        temps_2 %= 60;
      }

      digitBuffer[3] = temps_2 / 10;
      digitBuffer[2] = temps_2 % 10;
      digitBuffer[1] = temps / 10;
      digitBuffer[0] = temps % 10;
      affichage();


      delay(2);
      
    
    
        }
        break;
      case   0xFF18E7:
        Serial.println("touche 2");
        
         while (again)
    {
      Serial.println(again);
             if (messageRecu.value =! 0xFF18E7)
  {
    Serial.println(messageRecu.value, HEX);
     Serial.println(again);
   again = false;
    
    
    
  }

      
            temps = (millis()  / 60000);
      temps_2 = (millis() / 3600000);
      if (millis() > 5000)
      {
        temps %= 60;
        temps_2 %= 60;
      }
      digitBuffer[3] = temps_2 / 10;
      digitBuffer[2] = temps_2 % 10;
      digitBuffer[1] = temps / 10;
      digitBuffer[0] = temps % 10;
      affichage();

      delay(2);

      
  
    }
    
    break;
    }
        
      
      
    monRecepteurIR.resume();

  }

}

voila mon code

Bonjour,

Dans tes while, messageRecu n'est pas modifié, donc sa valeur est toujours celle de l'entrée et again ne passe jamais à false.

Donc si je comprends il faut permettre au while de recevoir une nouvelle donnée afin de modifier message reçu donc il suffit d'ajouter monRecepteurIR.resume() afin de recevoir une nouvelle donne

Oui, mais la structure de ton programme (avec les while dans le switch) est étrange.
Je n'ai pas bien compris ce que tu veux faire.

je récupère des donne qui sont afficher en suite sur un four Seven digital a l'aide de ma fonction affichage()
Dans le cas 1 des minute et des seconde
Et le cas 2 des heure et minute

Oui ça j'avais bien compris, ce que je n'ai pas compris c'est ce que tu veux faire dans la bouche while.

Sans le while quand je clique sur
La télécommande ca affiche XXX9 des que je re-clique ca affiche XX5X

Mais des que j'ai mît le while ca a résolue le problème et ca ma afficher les 4 chiffre après c'est peut être pas la meilleur methode

bonjour,
tu ne lis pas la réception de la télécommande dans tes while, donc les valeurs ne changent pas.
il faut mettre une lecture "if (monRecepteurIR.decode(&messageRecu)) " dans les while.
comme ca, lorsque tu es dans le while et qu'il y a une réception, tu lis la valeur et la compare après et donc tu peux sortir de la boucle dans ce cas en mettant un break

if(monRecepteurIR.decode(&messageRecu))
           {
           
             if (messageRecu.value =! 0xFF30CF )
  {
    Serial.println("non");
    monRecepteurIR.resume();
  
  }
  else
  {
     Serial.println("oui ");
     monRecepteurIR.resume();
  }
   monRecepteurIR.resume();
           }

j'ai essayer comme ça donc des que je clique sur la télécommande
ça va dans le switch donc affichage normal sur 4-seven , sur le moniteur ça m'affiche oui et à partir de la plus aucune réception

ca ne serait pas

if (messageRecu.value != 0xFF30CF )

fais un print de messageRecu.value histoire de voir ce que tu recois, ca sera beaucoup plus simple de comprendre l'erreur.

ça m'affiche un nombre

c'est la réception du deuxième signal qui doit poser problème

dans ce cas, tu affiche et note chaque touche avec la valeur recue et tu modifie le code en fonction :wink:
sinon, si je ne me trompe pas, il faut convertir en HEX la valeur.

ça marche pas, je vais reprendre le code du début et voir ou commence le problème

maxou59200:
ça marche pas, je vais reprendre le code du début et voir ou commence le problème

j'adore quand quelqu'un répond "ca marche pas" :slight_smile:

tu dis que ca affiche un nombre, donc si tu appuie sur une touche de la télécommande, est ce que ce nombre change ou non?

fais un simple code pour afficher les valeurs recues, après tu pourras continuer ton codage normalement.

si je comprends un peut le truc
j'appuie sur le 1 de la télécommande

ça rentre dans le switch case 1
ça vérifie directement le if de reception IR
et le if de condition (message.Recu.value != xxxxxxx)
ça m'affiche ce qui est dans le else vu que ces la même touche
et à partir de la plus aucune réception venant de la télécommande

ps: le nombre correspond bien la valeur HEX
j'ai fait un Serial.println(messageRecu.value, HEX);
pour voir

fais un truc simple pour vérifier certaines choses

void loop() {
  if (monRecepteurIR.decode(&messageRecu))
  {
    Serial.println(messageRecu.value, HEX);
}else{
Serial.println("attente");
}
monRecepteurIR.resume();
}

mets le résultat dans ton prochain message avec les touches correspondantes

voila ce que j'ai sur le moniteur "attente" les touche sont bien réceptionner vu que la led 13 clignote mais rien s'affiche dans le moniteur bizarre

mets ton code entièrement ici

prends cette lib

et ce code

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}