[Résolu] Problème entrée dans un if

Bonjour à tous !

Je suis actuellement sur un petit projet : faire un boitier permettant de commander un bandeau de led RGB (on est pas dans l'originalité :wink: ).

J'aurais sur mon boitier un interrupteur à levier pour basculer mon boitier de "Mode Automatique" (les effets s'enchainent seul) à "Mode Manuel" (je choisis la couleur et l'effet que je veux via un écran de contrôle).

Pour détecter le basculement, j'utilise une interruption, qui fait passer une variable globale "RESET_LOOP" de false à true. Dans mon code, j'ai placé à plusieurs endroits stratégiques un bout de code permettant de vérifier la valeur de ce booléan : s'il est à true, cela permet d'interrompre instantanément l'exécution de "loop" pour passer à l'itération suivante (cela permet une commutation quasi instantanée du mode auto au mode manuel et inversement).

Peut-être qu'il y a une autre méthode pour gérer cette commutation auto-manuel, mais après recherche, je suis parti sur le choix de l'interruption. Mais le problème n'est pas là :slight_smile:

Le problème se situe dans le morceau de code suivant :

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

    Serial.println(RESET_LOOP);

    if(RESET_LOOP) {Serial.println("B");return;}

    if(color_R != -1) {
      if(counter_R>0.99) {
        color_red++;
        counter_R--;
      }
      analogWrite(led_R, color_red);
      counter_R+=color_R_ratio;
    }
    ...

Dans cette configuration, tout va bien, s'il y a l'interruption, on rentre dans le "if", on a le "return" qui stop la fonction en cours, comme voulu.

En revanche, si j'enlève cette ligne :

Serial.println(RESET_LOOP);

Et ben.... on ne rentre plus dans le "if"....

Je n'arrive pas à comprendre pourquoi c'est le Serial.println() qui fait que le code fonctionne ou pas....

Si quelqu'un à une explication, parce que la je suis à sec :sweat_smile:

Merci !

Salut

Je suppose que RESET_LOOP est une variable volatile ?
Car c'est indispensable dans ton cas.

@+

C'est une variable globale déclarée au tout début de mon code, initialisée à false, qui passe à true dans le code de la fonction d'interruption, et qui repasse à false à la fin de "loop". Et ça repart pour une nouvelle itération de loop.

Ce principe marche très bien, partout dans le reste du code, sauf à cet endroit précis.... Est-ce que ça vient du fait que je suis dans une boucle for ? Mystère pour le moment...

Non.

C'est une variable globale déclarée au tout début de mon code

Bien, mais elle doit être déclarée "volatile".

@+

Dahwar:
C'est une variable globale déclarée au tout début de mon code

Comme le dit hbachetti, ce n'est pas suffisant. Il faut que la variable soit déclarée volatile sinon elle n'est pas relue en mémoire à chaque itération de la boucle.
Typiquement dans ton cas la variable n'est pas manipulé dans la boucle for donc pendant la phase d'optimisation le compilateur a du la placer dans un registre et sa valeur en mémoire n'est jamais relue.
Toutes les variables que l'on modifie dans une routine d'interruption doivent être déclarées volatile.

OK, merci hbachetti et fdufnews pour vos réponses, je ne connaissais pas ce concept de variable volatile :slight_smile: j'apprends quelque chose là !

Je viens de tester, effectivement ça marche beaucoup mieux :smiley:

Merci beaucoup, j'aurais pu chercher encore longtemps là :sweat_smile:

A+