Besoin d'aide pour créer différents mode de jeux de couleur selon le bouton sur lequel on appuie

Mon premier réflexe a était "machine d'état", d'autres l'ont dit avant.

Par contre, votre mode "démo" n'étant pas une boucle en lui même, dans votre premiére version de sketch, dans votre succession de "if", il n'est effectué qu'une fois, et pas "tant que" une autre touche est appuyée...

L'avantage de la machine à états est que vous êtes +/_ obligé de dessiner un chronogramme pour représenter graphiquement ce que vous voulez faire, au moins ça permet de se poser les bonnes questions.

Merci pour votre aide,
Je n'étais pas encore arrivé à "while " dans mon apprentissage si c'est bien de cela que vous parliez avec "tant que".
Mais le fait qu'il y ait le "delay" dans le "while", ça ne va pas geler la boucle ?

Comme je l'ai dit dans mon premier message je débute vraiment.

Je viens de tomber en accident de travail et je tourne en rond à la maison donc j'ai décidé d'en profiter pour apprendre le codage avec Arduino et je me suis offert il y a peu des cours avec Udemi que j'essaie d'approfondir moi même.

Raison de plus pour essayer d'intégrer la compréhension de la machine d'état a5vitre apprentissage.
C'est un excellent exercise pour faire du code, et sans vouloir jetter des compliments à qui se soit, le sujet est très bien expliqué par JLM.

Perso, je suis un bordélique de naissance, et je ne sais pas coder sans mettre su minimum sur papier ce que je veux coder.

Par exemple (c'est ma norme perso).

Ça m'aide.

c'est une fonction qui retourne un nombre aléatoire donc quand je fais

    analogWrite(pinRouge, random(256));
    analogWrite(pinVerte, random(256));
    analogWrite(pinBleue, random(256));

je choisis un PWM entre 0 et 255 pour chacune des 3 pins de la LED RGB, et donc ce faisant une couleur aléatoire.

votre animation est la suivante

il faut vous inspirer de mon approche pour que tous les ∆t vous franchissiez une étape dans vos choix de couleur au lieu de le faire aléatoirement.

Bonjour,
comment est ce possible de modifier la partie de la gestion de la télécommande? J'en ai une différente, une elegoo 21 touches et donc pas les mêmes valeurs ....
ex.:
"power" = 0xBA45FF00
"num 0" = 0xE916FF00
"num 1" = 0xF30CFF00
"num 2" = 0xE718FF00
"num 3" = 0xA15EFF00

faites afficher la valeur de recepteurIR.decodedIRData.command avec un petit sketch

#include <IRremote.h>
const byte irPin = 2;
IRrecv recepteurIR(irPin);

void setup() {
  Serial.begin(115200);
  recepteurIR.enableIRIn();
}

void loop() {
  if (recepteurIR.decode()) {
    Serial.println(recepteurIR.decodedIRData.command);
    recepteurIR.resume();
  }
}

ensuite dans mon code vous remplacez le premier chiffre du tableau


IRKey lesTouches[] = {
  {162, "POWER",  ETEINDRE},
  {226, "MENU",   AUCUNE},
  { 34, "TEST",   AUCUNE},
  {  2, "PLUS",   AUCUNE},
  {194, "BACK",   AUCUNE},
  {224, "PREV.",  AUCUNE},
  {168, "PLAY",   AUCUNE},
  {144, "NEXT",   AUCUNE},
  {104, "num: 0", ROUGE},
  {152, "MINUS",  AUCUNE},
  {176, "key: C", AUCUNE},
  { 48, "num: 1", VERT},
  { 24, "num: 2", BLEU},
  {122, "num: 3", ANIMATION},
  { 16, "num: 4", AUCUNE},
  { 56, "num: 5", AUCUNE},
  { 90, "num: 6", AUCUNE},
  { 66, "num: 7", AUCUNE},
  { 74, "num: 8", AUCUNE},
  { 82, "num: 9", AUCUNE},
};

par les valeurs que vous avez obtenues pour les différentes touches. La troisième entrée de ce tableau décrit l'état vers lequel on veut aller lors de l'appui sur la touche

Merci à tout le monde, grâce à vous j'ai réussi à faire ceci et ça fonctionne bien.

#include <IRremote.h>
const byte irPin = 7;
IRrecv recepteurIR(irPin);
// la LED RGB, cathode commune. on utilise des pins PWM
// la bibliothèque utilise le timer2 ce qui fait qu'on ne peu pas utilser le PWM sur les pins 3 et 11
const byte pinRouge = 6;
const byte pinVerte =  5;
const byte pinBleue =  9;

enum Commande {AUCUNE, ETEINDRE, ROUGE, JAUNE, POMME, TURQUOISE, BLEU, MAGENTA, ANIMATION} commandeRecue = AUCUNE;
enum Etat {STATIQUE, DYNAMIQUE} etat = STATIQUE;

const unsigned long tempo = 500; // animation à 2Hz (500ms)
unsigned long dernierChangementCouleur;
int chrono=15;

struct IRKey {
  uint8_t codeTouche;
  const char * etiquette;
  Commande commande;
};

IRKey lesTouches[] = {
  { 69, "POWER", ETEINDRE},
  { 70, "VOL plus", AUCUNE},
  { 71, "FUNC/STOP", AUCUNE},
  { 68, "PREV",   AUCUNE},
  { 64, "PLAY/PAUSE", ANIMATION},
  { 67, "NEXT",    AUCUNE},
  {  7, "DOWN",    AUCUNE},
  { 21, "VOL min", AUCUNE},
  {  9, "UP",      AUCUNE},
  { 22, "num: 0", ROUGE},
  { 25, "EQ",    AUCUNE},
  { 13, "ST/REPT", AUCUNE},
  { 12, "num: 1", JAUNE},
  { 24, "num: 2", POMME},
  { 94, "num: 3", TURQUOISE},
  {  8, "num: 4", BLEU},
  { 28, "num: 5", MAGENTA},
  { 90, "num: 6", AUCUNE},
  { 66, "num: 7", AUCUNE},
  { 82, "num: 8", AUCUNE},
  { 74, "num: 9", AUCUNE},
};


void gestionCommande() {
  commandeRecue = AUCUNE;
  if (recepteurIR.decode()) {
    for (auto& touche : lesTouches) {
      if (touche.codeTouche == recepteurIR.decodedIRData.command) {
        commandeRecue = touche.commande;
        break;
      }
    }
  }
  recepteurIR.resume();
}

void gestionAnimation() {
  switch (commandeRecue) {
    case AUCUNE: break;

    case ETEINDRE:
      digitalWrite(pinRouge, LOW);
      digitalWrite(pinVerte, LOW);
      digitalWrite(pinBleue, LOW);
      etat = STATIQUE;
      break;

    case ROUGE:
      digitalWrite(pinRouge, HIGH);
      digitalWrite(pinVerte, LOW);
      digitalWrite(pinBleue, LOW);
      etat = STATIQUE;
      break;

    case JAUNE:
      digitalWrite(pinRouge, HIGH);
      digitalWrite(pinVerte, HIGH);
      digitalWrite(pinBleue, 0);
      etat = STATIQUE;
      break;

    case POMME:
      digitalWrite(pinRouge, LOW);
      digitalWrite(pinVerte, HIGH);
      digitalWrite(pinBleue, LOW);
      etat = STATIQUE;
      break;

    case TURQUOISE:
      digitalWrite(pinRouge, LOW);
      digitalWrite(pinVerte, HIGH);
      digitalWrite(pinBleue, HIGH);
      etat = STATIQUE;
      break;

    case BLEU:
      digitalWrite(pinRouge, LOW);
      digitalWrite(pinVerte, LOW);
      digitalWrite(pinBleue, HIGH);
      etat = STATIQUE;
      break;

    case MAGENTA:
      digitalWrite(pinRouge, HIGH);
      digitalWrite(pinVerte, LOW);
      digitalWrite(pinBleue, HIGH);
      etat = STATIQUE;
      break;

    case ANIMATION:
      dernierChangementCouleur = millis() - tempo;
      etat = DYNAMIQUE;
      break;
  }

  if ((etat == DYNAMIQUE) && (millis() - dernierChangementCouleur >= tempo)) {
    // on passe à la couleur suivante, ici aléatoirement
            for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, r);
      delay(chrono);
      }
      for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, r);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, 255);
      delay(chrono);
      }
      for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, r);
      analogWrite(pinBleue, 255);
      delay(chrono);
      }
      for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, 255);
      analogWrite(pinBleue, r);
      delay(chrono);
      }
      for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, r);
      analogWrite(pinVerte, 255);
      analogWrite(pinBleue, 0);
      delay(chrono);
      }
      for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, r);
      analogWrite(pinBleue, 0);
      delay(chrono);
      }
      for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, r);
      delay(chrono);
      break;
      }    
  }       
}


void setup() {
  pinMode(pinRouge, OUTPUT);
  pinMode(pinVerte, OUTPUT);
  pinMode(pinBleue, OUTPUT);

  Serial.begin(9600);
  recepteurIR.enableIRIn();
}

void loop() {
  gestionCommande();
  gestionAnimation();
}

Afin de ne pas trop venir vous embeter j'ai essayer de créer une gestion de la luminosité des couleurs à l'état STATIQUE par moi meme mais ça ne fonctionne pas comme je veux.
Aucun messages d'erreurs, ça fonctionne à l'identique du sketch précédant mais la variation manuelle via les touches 70 pour + et 21 pour - ne fonctionne pas.

#include <IRremote.h>
const byte irPin = 7;
IRrecv recepteurIR(irPin);
// la LED RGB, cathode commune. on utilise des pins PWM
// la bibliothèque utilise le timer2 ce qui fait qu'on ne peu pas utilser le PWM sur les pins 3 et 11
const byte pinRouge = 6;
const byte pinVerte =  5;
const byte pinBleue =  9;

int luminosity = 255;

enum Commande {AUCUNE, ETEINDRE, ROUGE, JAUNE, POMME, TURQUOISE, BLEU, MAGENTA, ANIMATION} commandeRecue = AUCUNE;
enum Etat {STATIQUE, DYNAMIQUE} etat = STATIQUE;

const unsigned long tempo = 500; // animation à 2Hz (500ms)
unsigned long dernierChangementCouleur;
int chrono=15;

struct IRKey {
  uint8_t codeTouche;
  const char * etiquette;
  Commande commande;
};

IRKey lesTouches[] = {
  { 69, "POWER", ETEINDRE},
  { 70, "VOL plus", AUCUNE},
  { 71, "FUNC/STOP", AUCUNE},
  { 68, "PREV",   AUCUNE},
  { 64, "PLAY/PAUSE", ANIMATION},
  { 67, "NEXT",    AUCUNE},
  {  7, "DOWN",    AUCUNE},
  { 21, "VOL min", AUCUNE},
  {  9, "UP",      AUCUNE},
  { 22, "num: 0", ROUGE},
  { 25, "EQ",    AUCUNE},
  { 13, "ST/REPT", AUCUNE},
  { 12, "num: 1", JAUNE},
  { 24, "num: 2", POMME},
  { 94, "num: 3", TURQUOISE},
  {  8, "num: 4", BLEU},
  { 28, "num: 5", MAGENTA},
  { 90, "num: 6", AUCUNE},
  { 66, "num: 7", AUCUNE},
  { 82, "num: 8", AUCUNE},
  { 74, "num: 9", AUCUNE},
};


void gestionCommande() {
  commandeRecue = AUCUNE;
  if (recepteurIR.decode()) {
    for (auto& touche : lesTouches) {
      if (touche.codeTouche == recepteurIR.decodedIRData.command) {
        commandeRecue = touche.commande;
        if (touche.codeTouche == 70){
          setLuminosity(25);
        }
        if (touche.codeTouche == 21){
          setLuminosity(-25);
        }
        break;
      }
    }
  }
  recepteurIR.resume();
}

void gestionAnimation() {
  switch (commandeRecue) {
    case AUCUNE: break;

    case ETEINDRE:
      digitalWrite(pinRouge, 0);
      digitalWrite(pinVerte, 0);
      digitalWrite(pinBleue, 0);
      etat = STATIQUE;
      break;

    case ROUGE:
      analogWrite(pinRouge, luminosity);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, 0);
      etat = STATIQUE;
      break;

    case JAUNE:
      analogWrite(pinRouge, luminosity);
      analogWrite(pinVerte, luminosity);
      analogWrite(pinBleue, 0);
      etat = STATIQUE;
      break;

    case POMME:
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, luminosity);
      analogWrite(pinBleue, 0);
      etat = STATIQUE;
      break;

    case TURQUOISE:
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, luminosity);
      analogWrite(pinBleue, luminosity);
      etat = STATIQUE;
      break;

    case BLEU:
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, luminosity);
      etat = STATIQUE;
      break;

    case MAGENTA:
      analogWrite(pinRouge, luminosity);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, luminosity);
      etat = STATIQUE;
      break;

    case ANIMATION:
      dernierChangementCouleur = millis() - tempo;
      etat = DYNAMIQUE;
      break;
  }

  if ((etat == DYNAMIQUE) && (millis() - dernierChangementCouleur >= tempo)) {
    // on passe à la couleur suivante, ici aléatoirement
            for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, r);
      delay(chrono);
      }
      for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, r);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, 255);
      delay(chrono);
      }
      for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, r);
      analogWrite(pinBleue, 255);
      delay(chrono);
      }
      for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, 255);
      analogWrite(pinBleue, r);
      delay(chrono);
      }
      for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, r);
      analogWrite(pinVerte, 255);
      analogWrite(pinBleue, 0);
      delay(chrono);
      }
      for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, r);
      analogWrite(pinBleue, 0);
      delay(chrono);
      }
      for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, r);
      delay(chrono);
      break;
      }    
  }       
}

void setLuminosity(int diff) {
  if (luminosity + diff < 255 && luminosity + diff > 0) {
    luminosity = luminosity + diff;
    Commande(commandeRecue);
  }
}

void setup() {
  pinMode(pinRouge, OUTPUT);
  pinMode(pinVerte, OUTPUT);
  pinMode(pinBleue, OUTPUT);

  Serial.begin(9600);
  recepteurIR.enableIRIn();
}

void loop() {
  gestionCommande();
  gestionAnimation();
}

Une bonne âme pour m'indiquer mes erreurs?

il faut mettre cette commande

au niveau au dessus dans le if, vous ne faites le resume que si vous avez traité la commande reçue

void gestionCommande() {
  commandeRecue = AUCUNE;
  if (recepteurIR.decode()) {
    for (auto& touche : lesTouches) {
      if (touche.codeTouche == recepteurIR.decodedIRData.command) {
        commandeRecue = touche.commande;
        break;
      }
    }
    recepteurIR.resume();
  }
}

➜ dans la définition des états suivants, rien ne se passe si vous recevez 70 ou 21

il faut mettre cette commande

au niveau au dessus dans le if, vous ne faites le resume que si vous avez traité la commande reçue

De cette manière?

void gestionCommande() {
  commandeRecue = AUCUNE;
  if (recepteurIR.decode()) {
    for (auto& touche : lesTouches) {
      if (touche.codeTouche == recepteurIR.decodedIRData.command) {
        commandeRecue = touche.commande;
         recepteurIR.resume();

        if (touche.codeTouche == 70){
          setLuminosity(25);
        }
        if (touche.codeTouche == 21){
          setLuminosity(-25);
        }
        break;
      }
    }
  }
}

➜ dans la définition des états suivants, rien ne se passe si vous recevez 70 ou 21

Je peux mettre une définition identique tel que

  { 70, "VOL plus", INTENSITE},
  { 21, "VOL min", INTENSITE},

ainsi que dans

enum Commande {AUCUNE, ETEINDRE, ROUGE, JAUNE, POMME, TURQUOISE, BLEU, MAGENTA, INTENSITE,  ANIMATION} commandeRecue = AUCUNE;
enum Etat {STATIQUE, DYNAMIQUE} etat = STATIQUE;

???

@J-M-L
Je vient de remarquer qu'avec la manière que je vous ai proposer, je dois d'abord faire varier l'intensité et ensuite sélectionner la couleur.
J'aimerais pouvoir arriver à faire l'inverse, pouvoir d'abord choisir la couleur et ensuite faire varier son intensité.

une idée à me suggérer pour y remédier?

il faut dessiner la machine à états :slight_smile:

Arg, sacrée machine à état :sweat_smile:
Je sais exactement comment je voudrais que ça fonctionne mais j'ai toujours du mal à la mettre sur papier.
Je vais essayer de m'appliquer.
Merci de votre aide en tout cas.
Grâce à vous et aux aides que vous avez fournie à d'autres j'ai pu créer un dé électronique avec un bp et un afficheur à segment. C'est moins bruyant quand on veut jouer le soir.

Essayez de l’expliquer en détail

J'ai un Arduino Uno, une télécommande elegoo, une Led RGB et un récepteur IR vs1838b.

Je voudrais faire une veilleuse télécommandée avec plusieurs fonctions.

Par exemple :
le bouton "power" pour tout éteindre.
le bouton "0" pour sélectionner la couleur rouge
le bouton "1" pour sélectionner la couleur bleue
le bouton "2" pour sélectionner la couleur verte
Mais aussi pouvoir varier l'intensité de la couleur sélectionnée plus ou moins fort avec les boutons "VOL+" et "VOL-"
Et enfin, faire une animation de couleurs sur le bouton "PLAY" qui tournerait indéfiniment jusqu'à ce qu'on appuie sur "POWER" pour éteindre ou sur un bouton de sélection de couleur.

Je sais que ça existe déjà tout fait, mais j'ai envie d'apprendre et de créer.

Jusqu'ici, vous m'avez fortement aidé et la sélection des différentes couleurs état STATISTIQUE et l'animation état DYNAMIQUE fonctionne très bien, mais j'ai voulu pousser plus loin en voulant varier l'intensité ou la température de la couleur STATISTIQUE avec les boutons VOL+ et VOL- mais ça ne fonctionne pas correctement.

Merci infiniment à tout le monde pour l'aide apportée à la réalisation de mon projet.
J'ai trouvé la solution en jumelant et en adaptant deux projets qui fonctionnaient bien.
Cela donne le sketch suivant.

#include <IRremote.h>
const byte irPin = 7;
IRrecv recepteurIR(irPin);
// la LED RGB, cathode commune. on utilise des pins PWM
// la bibliothèque utilise le timer2 ce qui fait qu'on ne peu pas utilser le PWM sur les pins 3 et 11
const byte pinRouge = 6;
const byte pinVerte =  5;
const byte pinBleue =  9;

int luminosity = 255;
String currentColor = "blue";

enum Commande {AUCUNE, ETEINDRE, ROUGE, JAUNE, POMME, TURQUOISE, BLEU, MAGENTA, LUMINOSITYUP, LUMINOSITYDOWN, ANIMATION} commandeRecue = AUCUNE;
enum Etat {STATIQUE, DYNAMIQUE} etat = STATIQUE;

const unsigned long tempo = 500; // animation à 2Hz (500ms)
unsigned long dernierChangementCouleur;
int chrono=15;

struct IRKey {
  uint8_t codeTouche;
  const char * etiquette;
  Commande commande;
};

IRKey lesTouches[] = {
  { 69, "POWER", ETEINDRE},
  { 70, "VOL plus", LUMINOSITYUP},
  { 71, "FUNC/STOP", AUCUNE},
  { 68, "PREV",   AUCUNE},
  { 64, "PLAY/PAUSE", ANIMATION},
  { 67, "NEXT",    AUCUNE},
  {  7, "DOWN",    AUCUNE},
  { 21, "VOL min", LUMINOSITYDOWN},
  {  9, "UP",      AUCUNE},
  { 22, "num: 0", ROUGE},
  { 25, "EQ",    AUCUNE},
  { 13, "ST/REPT", AUCUNE},
  { 12, "num: 1", JAUNE},
  { 24, "num: 2", POMME},
  { 94, "num: 3", TURQUOISE},
  {  8, "num: 4", BLEU},
  { 28, "num: 5", MAGENTA},
  { 90, "num: 6", AUCUNE},
  { 66, "num: 7", AUCUNE},
  { 82, "num: 8", AUCUNE},
  { 74, "num: 9", AUCUNE},
};

void setColor(String color) {
  currentColor = color;
  if (color == "blue") {
    analogWrite(pinVerte, 0);
    analogWrite(pinRouge, 0);
    analogWrite(pinBleue, luminosity);
  }

  else if (color == "green") {
    analogWrite(pinBleue, 0);
    analogWrite(pinRouge, 0);
    analogWrite(pinVerte, luminosity);
  }

  else if (color == "red") {
    analogWrite(pinBleue, 0);
    analogWrite(pinVerte, 0);
    analogWrite(pinRouge, luminosity);
  }

  else if (color == "purple") {
    analogWrite(pinBleue, luminosity);
    analogWrite(pinVerte, 0);
    analogWrite(pinRouge, luminosity);
  }

  else if (color == "cyan") {
    analogWrite(pinBleue, luminosity);
    analogWrite(pinVerte, luminosity);
    analogWrite(pinRouge, 0);
  }

  else if (color == "yellow") {
    analogWrite(pinBleue, 0);
    analogWrite(pinVerte, luminosity);
    analogWrite(pinRouge, luminosity);
  }

  else {
    analogWrite(pinBleue, 0);
    analogWrite(pinVerte, 0);
    analogWrite(pinRouge, 0);
  }

}

void setLuminosity(int diff) {
  if (luminosity + diff < 255 && luminosity + diff > 0) {
    luminosity = luminosity + diff;
    setColor(currentColor);
  }
}

void gestionCommande() {
  commandeRecue = AUCUNE;
  if (recepteurIR.decode()) {
    for (auto& touche : lesTouches) {
      if (touche.codeTouche == recepteurIR.decodedIRData.command) {
        commandeRecue = touche.commande;
        break;
      }
    }
    recepteurIR.resume();
  }
  
}

void gestionAnimation() {
  switch (commandeRecue) {
    case AUCUNE: break;

    case ETEINDRE:
      digitalWrite(pinRouge, LOW);
      digitalWrite(pinVerte, LOW);
      digitalWrite(pinBleue, LOW);
      etat = STATIQUE;
      break;

    case ROUGE:
      setColor("red");
      etat = STATIQUE;
      break;

    case JAUNE:
      setColor("yellow");
      etat = STATIQUE;
      break;

    case POMME:
      setColor("green");
      etat = STATIQUE;
      break;

    case TURQUOISE:
      setColor("cyan");
      etat = STATIQUE;
      break;

    case BLEU:
      setColor("blue");
      etat = STATIQUE;
      break;

    case MAGENTA:
      setColor("purple");
      etat = STATIQUE;
      break;
    
    case LUMINOSITYUP:
      setLuminosity(5);
      etat = STATIQUE;
      break;

    case LUMINOSITYDOWN:
      setLuminosity(-5);
      etat = STATIQUE;
      break;

    case ANIMATION:
      dernierChangementCouleur = millis() - tempo;
      etat = DYNAMIQUE;
      break;
  }

  if ((etat == DYNAMIQUE) && (millis() - dernierChangementCouleur >= tempo)) {
    // on passe à la couleur suivante, ici aléatoirement
            for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, r);
      delay(chrono);
      }
      for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, r);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, 255);
      delay(chrono);
      }
      for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, r);
      analogWrite(pinBleue, 255);
      delay(chrono);
      }
      for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, 255);
      analogWrite(pinBleue, r);
      delay(chrono);
      }
      for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, r);
      analogWrite(pinVerte, 255);
      analogWrite(pinBleue, 0);
      delay(chrono);
      }
      for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, r);
      analogWrite(pinBleue, 0);
      delay(chrono);
      }
      for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, r);
      delay(chrono);
      break;
      }    
  }       
}


void setup() {
  pinMode(pinRouge, OUTPUT);
  pinMode(pinVerte, OUTPUT);
  pinMode(pinBleue, OUTPUT);

  Serial.begin(9600);
  recepteurIR.enableIRIn();
}

void loop() {
  gestionCommande();
  gestionAnimation();
}
 

si vous rentrez dans ce if

  if ((etat == DYNAMIQUE) && (millis() - dernierChangementCouleur >= tempo)) {

vous êtes bloqué dedans pendant assez longtemps (~27 secondes à la louche) et ne traitez plus la télécommande pendant ce temps là parce qu'il y a plein d'appels à delay().

il faudrait une machine à états pour passer les couleurs

C'est vrai que quand je lance l'animation, je ne sais pas en sortir directement.
À priori cela ne me dérange pas, mais tant qu'à faire bien les choses, je vais potasser un peu sur le conseil que vous m'avez donné.
Je reviendrai vers vous si je ne m'en sors pas ou pour vous montrer le projet fini.

Dans le code d’origine que j’avais partagé lorsque l’on avait une animation dynamique le programme vérifiait si c’était le moment de changer la couleur de la led , si oui il le faisait et sinon il retournait écouter la télécommande.

Il faut faire la même chose mais comme il ne s’agit pas juste de changer une couleur par une autre aléatoire il faut du code un peu plus intelligent :
Vous avez plusieurs boucle for chacune peut correspondre à un état. Dans cet état vous avez une variable qui varie de 0 à 255 de temps en temps, c’est ce délai qui vous dit quand faire une action. Quand la variable atteint 256 alors vous passer à l’état suivant

bonjour,
bon ben visiblement, je n'ai pas dû bien comprendre car je patauge.
J'ai une autre version de code mais j'ai toujours du mal à sortir directement de l'animation...

#include <IRremote.h>
const byte irPin = 7;
IRrecv recepteurIR(irPin);
// la LED RGB, cathode commune. on utilise des pins PWM
// la bibliothèque utilise le timer2 ce qui fait qu'on ne peu pas utilser le PWM sur les pins 3 et 11
const byte pinRouge = 6;
const byte pinVerte =  5;
const byte pinBleue =  9;

int luminosity = 255;
String currentColor = "blue";
String currentVaria = "redTOpurple";
enum Commande {AUCUNE, ETEINDRE, ROUGE, JAUNE, POMME, TURQUOISE, BLEU, MAGENTA, LUMINOSITYUP, LUMINOSITYDOWN, ANIMATION} commandeRecue = AUCUNE;
enum Etat {STATIQUE, DYNAMIQUE} etat = STATIQUE;
enum Variation { VARIAPURPLE, VARIABLUE, VARIACYAN, VARIRAGREEN, VARIAYELLOW, VARIARED} variaColor = VARIAPURPLE;
const unsigned long tempo = 500; // animation à 2Hz (500ms)
unsigned long dernierChangementCouleur;
int chrono=15;

struct IRKey {
  uint8_t codeTouche;
  const char * etiquette;
  Commande commande;
};

IRKey lesTouches[] = {
  { 69, "POWER", ETEINDRE},
  { 70, "VOL plus", LUMINOSITYUP},
  { 71, "FUNC/STOP", AUCUNE},
  { 68, "PREV",   AUCUNE},
  { 64, "PLAY/PAUSE", ANIMATION},
  { 67, "NEXT",    AUCUNE},
  {  7, "DOWN",    AUCUNE},
  { 21, "VOL min", LUMINOSITYDOWN},
  {  9, "UP",      AUCUNE},
  { 22, "num: 0", ROUGE},
  { 25, "EQ",    AUCUNE},
  { 13, "ST/REPT", AUCUNE},
  { 12, "num: 1", JAUNE},
  { 24, "num: 2", POMME},
  { 94, "num: 3", TURQUOISE},
  {  8, "num: 4", BLEU},
  { 28, "num: 5", MAGENTA},
  { 90, "num: 6", AUCUNE},
  { 66, "num: 7", AUCUNE},
  { 82, "num: 8", AUCUNE},
  { 74, "num: 9", AUCUNE},
};

void setVaria(String varia){
  currentVaria = varia;
  if (varia == "redTOpurple") {
    for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, r);
      delay(chrono);
      }
  }

  else if (varia == "purpleTOblue") {
    for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, r);
      analogWrite(pinVerte, 0);
      analogWrite(pinBleue, 255);
      delay(chrono);
      }
  }

  else if (varia == "blueTOcyan") {
    for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, r);
      analogWrite(pinBleue, 255);
      delay(chrono);
      }
  }

  else if (varia == "cyanTOgreen") {
    for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, 0);
      analogWrite(pinVerte, 255);
      analogWrite(pinBleue, r);
      delay(chrono);
      }
  }

  else if (varia == "greenTOyellow") {
    for (int r = 0; r < 255; r++) {
      analogWrite(pinRouge, r);
      analogWrite(pinVerte, 255);
      analogWrite(pinBleue, 0);
      delay(chrono);
      }
  }

  else if (varia == "yellowTOred") {
    for (int r = 255; r > 0; r--) {
      analogWrite(pinRouge, 255);
      analogWrite(pinVerte, r);
      analogWrite(pinBleue, 0);
      delay(chrono);
      }
  }

  else {
    analogWrite(pinBleue, 0);
    analogWrite(pinVerte, 0);
    analogWrite(pinRouge, 0);
  }
}

void setColor(String color) {
  currentColor = color;
  if (color == "blue") {
    analogWrite(pinVerte, 0);
    analogWrite(pinRouge, 0);
    analogWrite(pinBleue, luminosity);
  }

  else if (color == "green") {
    analogWrite(pinBleue, 0);
    analogWrite(pinRouge, 0);
    analogWrite(pinVerte, luminosity);
  }

  else if (color == "red") {
    analogWrite(pinBleue, 0);
    analogWrite(pinVerte, 0);
    analogWrite(pinRouge, luminosity);
  }

  else if (color == "purple") {
    analogWrite(pinBleue, luminosity);
    analogWrite(pinVerte, 0);
    analogWrite(pinRouge, luminosity);
  }

  else if (color == "cyan") {
    analogWrite(pinBleue, luminosity);
    analogWrite(pinVerte, luminosity);
    analogWrite(pinRouge, 0);
  }

  else if (color == "yellow") {
    analogWrite(pinBleue, 0);
    analogWrite(pinVerte, luminosity);
    analogWrite(pinRouge, luminosity);
  }

  else {
    analogWrite(pinBleue, 0);
    analogWrite(pinVerte, 0);
    analogWrite(pinRouge, 0);
  }

}

void setLuminosity(int diff) {
  if (luminosity + diff < 255 && luminosity + diff > 0) {
    luminosity = luminosity + diff;
    setColor(currentColor);
  }
}

void gestionCommande() {
  commandeRecue = AUCUNE;
  if (recepteurIR.decode()) {
    for (auto& touche : lesTouches) {
      if (touche.codeTouche == recepteurIR.decodedIRData.command) {
        commandeRecue = touche.commande;
        break;
      }
    }
    recepteurIR.resume();
  }
  
}

void gestionAnimation() {
  switch (commandeRecue) {
    case AUCUNE: break;

    case ETEINDRE:
      digitalWrite(pinRouge, LOW);
      digitalWrite(pinVerte, LOW);
      digitalWrite(pinBleue, LOW);
      etat = STATIQUE;
      break;

    case ROUGE:
      setColor("red");
      etat = STATIQUE;
      break;

    case JAUNE:
      setColor("yellow");
      etat = STATIQUE;
      break;

    case POMME:
      setColor("green");
      etat = STATIQUE;
      break;

    case TURQUOISE:
      setColor("cyan");
      etat = STATIQUE;
      break;

    case BLEU:
      setColor("blue");
      etat = STATIQUE;
      break;

    case MAGENTA:
      setColor("purple");
      etat = STATIQUE;
      break;
    
    case LUMINOSITYUP:
      setLuminosity(5);
      etat = STATIQUE;
      break;

    case LUMINOSITYDOWN:
      setLuminosity(-5);
      etat = STATIQUE;
      break;

    case ANIMATION:
      dernierChangementCouleur = millis() - tempo;
      etat = DYNAMIQUE;
      break;
  }

  if ((etat == DYNAMIQUE) && (millis() - dernierChangementCouleur >= tempo)) {
    // on passe à la couleur suivante, ici aléatoirement
            setVaria("redTOpurple");
            variaColor = VARIAPURPLE;
            dernierChangementCouleur = millis() - tempo;
  }

  else if ((variaColor == VARIAPURPLE) && (millis() - dernierChangementCouleur >= tempo)) {
            setVaria("purpleTOblue");
            variaColor = VARIABLUE;
            dernierChangementCouleur = millis() - tempo;
  }    
}


void setup() {
  pinMode(pinRouge, OUTPUT);
  pinMode(pinVerte, OUTPUT);
  pinMode(pinBleue, OUTPUT);

  Serial.begin(9600);
  recepteurIR.enableIRIn();
}

void loop() {
  gestionCommande();
  gestionAnimation();
}

si je retire les delay, aucune animation ne se passe...

ben un truc comme cela vous bloque 255*15ms = ~4 secondes

il ne faut pas de boucle for, pas de delay

vous utilisez millis pour savoir quand c'est le moment de faire une seule étape de cette boucle (pour voir quand les 15ms sont écoulées) et un compteur qui reste mémorisé pour aller de 255 à 0.

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