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

Bonjour,
Je débute dans le codage Arduino.
J'ai en ma possession un Arduino Uno, une télécommande Arduino, une Led RGB et un récepteur IR vs1838b.

J'arrive à contrôler les couleurs séparément
exemples bouton "power" pour éteindre la Led, bouton "1" pour l'allumer en bleu,...
Par contre en appuyant sur le bouton "function" j'aimerais qu'il fasse comme un chenillard de mes couleurs définies, mais en boucle jusqu'à ce que j'appuie sur le bouton "power" ou un autre bouton, or là cela n'effectue qu'une seule fois le balayage.
Pouvez vous m'aider?
voici le codage que j'ai effectué.

#include <IRremote.h>
#define IR_PIN 7
const int BLUELED = 9;
const int GREENLED = 5;
const int REDLED = 6;
int luminosity = 250;
String currentColor = "blue";

void setup() {

  Serial.begin(9600);

  IrReceiver.begin(IR_PIN, DISABLE_LED_FEEDBACK);

  pinMode(BLUELED, OUTPUT);
  pinMode(GREENLED, OUTPUT);
  pinMode(REDLED, OUTPUT); 

}

void setColor(String color) {
  currentColor = color;

  if (color == "blue") {
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, 0);
    analogWrite(BLUELED, luminosity);
  }

  else if (color == "green") {
    analogWrite(BLUELED, 0);
    analogWrite(REDLED, 0);
    analogWrite(GREENLED, luminosity);
  }

  else if (color == "red") {
    analogWrite(BLUELED, 0);
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, luminosity);
  }

  else if (color == "purple") {
    analogWrite(BLUELED, luminosity);
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, luminosity);
  }

  else if (color == "cyan") {
    analogWrite(BLUELED, luminosity);
    analogWrite(GREENLED, luminosity);
    analogWrite(REDLED, 0);
  }

  else if (color == "demo") {
    setColor("red");
    delay(500);
    setColor("green");
    delay(500);
    setColor("blue");
    delay(500);
    setColor("cyan");
    delay(500);
    setColor("purple");
    delay(500);
  }
 else  {
    analogWrite(BLUELED, 0);
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, 0);
  }

}

void loop() {
  
  if (IrReceiver.decode()) { 

      const uint32_t trame = IrReceiver.decodedIRData.decodedRawData;

      Serial.print("Trame = ");
      Serial.println(trame, HEX);
      
      IrReceiver.resume();

      switch(trame) {
        // Si le code bouton est 0xBA45FF00
        case0xBA45FF00:
          // C'est le bouton "power", on eteint les "LED".
          setColor("");
          break;
        // Si le code bouton est 0xF30CFF00
        case0xF30CFF00:
          // C'est le bouton "1", on allume la "LED" en bleu.
          setColor("blue");
          break;
        // Si le code bouton est 0xE718FF00
        case0xE718FF00:
          // C'est le bouton "2", on allume la "LED" en vert.
          setColor("green");
          break;
        // Si le code bouton est 0xA15EFF00
        case0xA15EFF00:
          // C'est le bouton "3", on allume la "LED" en rouge.
          setColor("red");
          break;
        // Si le code bouton est 0xF708FF00
        case0xF708FF00:
          // C'est le bouton "4", on allume la "LED" en violet.
          setColor("purple");
          break;
        // Si le code bouton est 0xE31CFF00
        case0xE31CFF00:
          // C'est le bouton "5", on allume la "LED" en cyan.
          setColor("cyan");
          break;
        // Si le code bouton est 0xB847FF00
        case0xB847FF00:
          // C'est le bouton "funcion", on allume la "LED" en chenillard de couleurs.
            setColor("demo");
            break;
            
      }

  }

}

Merci d'avance pour toutes aides. à terme l'idée sera de créer plusieurs jeux de lumières différents en utilisant des boutons différents de la télécommande, un peu comme sur une guirlande de noël

Quand vous faites cela

vous bloquez le code et en pouvez plus recevoir de commandes pendant 2.5 secondes

vous ne pouvez pas bloquer le code, il faut que ça reste asynchrone.

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

merci de votre réponse j'ai survolé vite fait votre tuto et le lirai à mon aise plus tard ,
par quoi je pourrais remplacé

setColor("red");
    delay(500);
    setColor("green");
    delay(500);
    setColor("blue");
    delay(500);
    setColor("cyan");
    delay(500);
    setColor("purple");
    delay(500);

pour que lorsque j'appuie sur le bouton "function", je passe du red au green au blue au cyan au purple ainsi de suite en continue?

je dois ajouter un chrono = millis ?

je ne comprend pas bien le code à ajouter

une fois que ce sera fait vous comprendrez

Je n'y arrive vraiment pas, quelqu'un peut me donner une idée de code svp que je puisse voir mes erreurs

Tu dois créer une machine à états qui gère les couleurs de ta led.
Tu déclares une variable qui stocke l'état courant, par exemple : 0 pour éteint, 1 pour rouge, 2 pour bleu, etc.
Dans ta boucle, tu lis tes différents capteurs (IR, boutons, etc) et tu mets à jour cette variable si une action est détectée. Tu dois aussi mesurer le temps qui passe depuis le dernier changement de couleur : s'il dépasse 500 ms (la durée de ton delay), tu changes la valeur de ta variable d'état et tu mets à jour ta led en fonction.
C'est une manière différente de concevoir l'exécution de ton code : il n'est plus centré sur la led mais sur le reste (gestion du temps et des capteurs)

Mon tuto montre une machine à état où le temps qui passe est pris en compte pour éteindre automatiquement des LEDs (ie une action un peu plus tard).

Le principe est le même, quand vous êtes dans un état où il y a une animation à effectuer, vous devez suivre le temps qui passe qui est un événement significatif car une fois un certain temps écoulé, c'est là où vous faites la prochaine étape de votre chenillard, notez le temps de dernière modification et recommencez à attendre soit que le temps soit à nouveau écoulé, soit que vous ayez reçu une autre commande.

prenez le temps d'explorer le tuto et dessinez le graphe de vos états et postez le ici. Ce sera un début pour ensuite coder.

Votre tuto est super intéressant, j'ai d'ailleurs pu les réaliser et les faire fonctionner.
J'ai donc essayer de résoudre mon problème mais ça ne va pas mieux, je vous l'explique dans le sketch joint.

#include <IRremote.h>

#define IR_PIN 7

const int BLUELED = 9;
const int GREENLED = 5;
const int REDLED = 6;

unsigned long passtime;

String currentColor = "blue";

void setup() {
  
  Serial.begin(9600);

  IrReceiver.begin(IR_PIN, DISABLE_LED_FEEDBACK);

  pinMode(BLUELED, OUTPUT);
  pinMode(GREENLED, OUTPUT);
  pinMode(REDLED, OUTPUT);

}

// l'idée est de créer un panel de couleurs fixes pour les boutons 1 a 5
void setColor(String color) {
   currentColor = color;
  if (color == "blue") {
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, 0);
    analogWrite(BLUELED, 255);
  }

  else if (color == "green") {
    analogWrite(BLUELED, 0);
    analogWrite(REDLED, 0);
    analogWrite(GREENLED, 255);
  }

  else if (color == "red") {
    analogWrite(BLUELED, 0);
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, 255);
  }

  else if (color == "purple") {
    analogWrite(BLUELED, 255);
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, 255);
  }

  else if (color == "cyan") {
    analogWrite(BLUELED, 255);
    analogWrite(GREENLED, 255);
    analogWrite(REDLED, 0);
  }

  else {
    analogWrite(BLUELED, 0);
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, 0);
  }

}

// C'est là que je m'embrouille
// Je tente de créer une variation de couleur progressive qui repartirai en
// boucle indéfiniment jusqu'à la selecetion d'une autre couleur fixe sur
// les bouton 1 à 5 et 0 pour tout éteindre.

void Demo(){
  unsigned long passtime;

  passtime = ( millis() % 1536 );

  // Là je voudrais faire monter progressivement REDLED et arrivé à 255,
  // marquer une courte pause avant la prochaine progression.
  if ( passtime < 256 ) {
    for (int r = 255; r < 256; r++) {
     analogWrite(REDLED, r);
     analogWrite(GREENLED, 0);
     analogWrite(BLUELED, 0);
     }
  }

  // Là je voulais repartir après la pause de "REDLED, 255" et faire monter
  // progressivement BLUELED et arrivé à 255, marquer une nouvelle pause avant
  // la progression suivante. 
  else if ( passtime < 512 ) {
    for (int r = 0; r < 256; r++) {
     analogWrite(REDLED, 255);
     analogWrite(GREENLED, 0);
     analogWrite(BLUELED, r);
     }
  }

  else if ( passtime < 768 ) {
    for (int r = 256; r > 0; r--) {
     analogWrite(REDLED, r);
     analogWrite(GREENLED, 0);
     analogWrite(BLUELED, 255);
     }
  }

  else if ( passtime < 1024 ) {
    for (int r = 0; r < 256; r++) {
     analogWrite(REDLED, 0);
     analogWrite(GREENLED, r);
     analogWrite(BLUELED, 255);
     }
  }

  else if ( passtime < 1280 ) {
    for (int r = 256; r > 0; r--) {
     analogWrite(REDLED, 0);
     analogWrite(GREENLED, 255);
     analogWrite(BLUELED, r);
     }
  }

  else if ( passtime < 1536 ) {
    for (int r = 0; r < 256; r++) {
     analogWrite(REDLED, r);
     analogWrite(GREENLED, 255);
     analogWrite(BLUELED, 0);
     }
  }

  else {
    for (int r = 256; r > 0; r--) {
     analogWrite(REDLED, 255);
     analogWrite(GREENLED, r);
     analogWrite(BLUELED, 0);
     }
  }
}


void loop() {

  if (IrReceiver.decode()) {

    const uint32_t trame = IrReceiver.decodedIRData.decodedRawData;

    Serial.print("Trame = ");
    Serial.println(trame, HEX);

    IrReceiver.resume();

    switch(trame) {

      case 0xE916FF00:
      setColor("");
      break;

      case 0xF30CFF00:
      setColor("blue");
      break;

      case 0xE718FF00:
      setColor("green");
      break;

      case 0xA15EFF00:
      setColor("red");
      break;

      case 0xF708FF00:
      setColor("purple");
      break;

      case 0xE31CFF00:
      setColor("cyan");
      break;

      // Jusqu'ici tout fonctionne comme prévu sauf qu'en sélectionnant le 
      // "mode Demo" rien ne se passe.
      // Je l'ai tenté avec un delay et la ça fonctionne mais arrivé à la fin,
      // il reste figé sans repartir. On m'expliqué que c'était la fonction
      // delay qui figeait la boucle. 
      case 0xF609FF00:
      Demo();
    }
  }
}

vous pouvez m'orienter??

Vous n’appliquez pas le tuto dans votre code …
Où sont les états possibles, etc…

Dessinez la machine à états sous forme de graphique comme dans mon tuto

J'essaie mais je me perd encore plus

#include <IRremote.h>

#define IR_PIN 7

const int BLUELED = 9;
const int GREENLED = 5;
const int REDLED = 6;

unsigned long chrono;
const unsigned long passtime = 2000ul;

enum {etatRed, etatPurple, etatBlue, etatCyan, etatGreen, etatYellow}etatColor;
String currentColor = "blue";
String currentEtat = "EtatRed";

void setup() {
  
  Serial.begin(9600);

  IrReceiver.begin(IR_PIN, DISABLE_LED_FEEDBACK);

  pinMode(BLUELED, OUTPUT);
  pinMode(GREENLED, OUTPUT);
  pinMode(REDLED, OUTPUT);

}

// l'idée est de créer un panel de couleurs fixes pour les boutons 1 a 5
void setColor(String color) {
   currentColor = color;
  if (color == "blue") {
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, 0);
    analogWrite(BLUELED, 255);
  }

  else if (color == "green") {
    analogWrite(BLUELED, 0);
    analogWrite(REDLED, 0);
    analogWrite(GREENLED, 255);
  }

  else if (color == "red") {
    analogWrite(BLUELED, 0);
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, 255);
  }

  else if (color == "purple") {
    analogWrite(BLUELED, 255);
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, 255);
  }

  else if (color == "cyan") {
    analogWrite(BLUELED, 255);
    analogWrite(GREENLED, 255);
    analogWrite(REDLED, 0);
  }

  else {
    analogWrite(BLUELED, 0);
    analogWrite(GREENLED, 0);
    analogWrite(REDLED, 0);
  }
}

// C'est là que je m'embrouille
// Je me noie dans tout et voici ce que ça me met quand je veux vérifier, c'est pire qu'avant
// C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino: In function 'void loop()':
// C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:171:22: error: 'etatPurple' cannot be used as a function
//           etatPurple();
//                      ^
// C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:176:7: error: expected '}' before 'else'
//       else if(millis()-chrono>=passtime);{
//       ^~~~
// C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:176:7: error: expected '}' before 'else'
// C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:179:20: error: 'etatBlue' cannot be used as a function
//           etatBlue();
//                    ^
//C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:184:7: error: 'else' without a previous 'if'
//       else if(millis()-chrono>=passtime);{
//       ^~~~
//C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:187:20: error: 'etatCyan' cannot be used as a function
//           etatCyan();
//                    ^
//C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:192:7: error: 'else' without a previous 'if'
//       else if(millis()-chrono>=passtime);{
//       ^~~~
//C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:195:21: error: 'etatGreen' cannot be used as a function
//           etatGreen();
//                     ^
//C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:200:7: error: 'else' without a previous 'if'
//       else if(millis()-chrono>=passtime);{
//       ^~~~
//C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:203:22: error: 'etatYellow' cannot be used as a function
//           etatYellow();
//                      ^
//C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:208:7: error: 'else' without a previous 'if'
//       else(millis()-chrono>=passtime);{
//       ^~~~
//C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:211:19: error: 'etatRed' cannot be used as a function
//           etatRed();
//                   ^
//C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino: At global scope:
//C:\Users\nicol\AppData\Local\Temp\.arduinoIDE-unsaved2024025-17800-1ejsk3l.4t34\sketch_jan25a\sketch_jan25a.ino:217:5: error: expected declaration before '}' token
//     }
//     ^
//
//exit status 1
//
//Compilation error: 'etatPurple' cannot be used as a function

void setEtat(String etat) {
   currentEtat = etat;
   if (etat == "etatRed") {
    for (int r = 256; r > 0; r--) {
     analogWrite(REDLED, 255);
     analogWrite(GREENLED, r);
     analogWrite(BLUELED, 0);
     }
  }
  else if (etat == "etatPurple") {
    for (int r = 0; r < 256; r++) {
     analogWrite(REDLED, 255);
     analogWrite(GREENLED, 0);
     analogWrite(BLUELED, r);
     }
  }
  else if (etat == "etatBlue") {
    for (int r = 256; r > 0; r--) {
     analogWrite(REDLED, r);
     analogWrite(GREENLED, 0);
     analogWrite(BLUELED, 255);
     }
  }
  else if (etat == "etatCyan") {
    for (int r = 0; r < 256; r++) {
     analogWrite(REDLED, 0);
     analogWrite(GREENLED, r);
     analogWrite(BLUELED, 255);
     }
  }
  else if (etat == "etatGreen") {
    for (int r = 256; r > 0; r--) {
     analogWrite(REDLED, 0);
     analogWrite(GREENLED, 255);
     analogWrite(BLUELED, r);
     }
  }
  else if (etat == "etatYellow") {
    for (int r = 0; r < 256; r++) {
     analogWrite(REDLED, r);
     analogWrite(GREENLED, 255);
     analogWrite(BLUELED, 0);
     }
  }
  else{
    
  }
}  
    
    
  

void loop() {

  if (IrReceiver.decode()) {

    const uint32_t trame = IrReceiver.decodedIRData.decodedRawData;

    Serial.print("Trame = ");
    Serial.println(trame, HEX);

    IrReceiver.resume();

    switch(trame) {

      case 0xE916FF00:
      setColor("");
      break;

      case 0xF30CFF00:
      setColor("blue");
      break;

      case 0xE718FF00:
      setColor("green");
      break;

      case 0xA15EFF00:
      setColor("red");
      break;

      case 0xF708FF00:
      setColor("purple");
      break;

      case 0xE31CFF00:
      setColor("cyan");
      break;

      
      case 0xF609FF00:
      if(millis()-chrono>=passtime){
        switch(etatColor){
          case etatRed:
          etatPurple();
          break;
          }
          chrono = millis;
          }
      else if(millis()-chrono>=passtime){
        switch(etatColor){
          case etatPurple:
          etatBlue();
          break;
        }
        chrono = millis;
        }
      else if(millis()-chrono>=passtime){
        switch(etatColor){
          case etatBlue:
          etatCyan();
          break;
        }
        chrono = millis;
        }
      else if(millis()-chrono>=passtime){
        switch(etatColor){
          case etatCyan:
          etatGreen();
          break;
        }
        chrono = millis;
        }
      else if(millis()-chrono>=passtime){
        switch(etatColor){
          case etatGreen:
          etatYellow();
          break;
        }
        chrono = millis;
        }
      else(millis()-chrono>=passtime){
        switch(etatColor){
          case etatYellow:
          etatRed();
          break;
        }
        chrono = millis;
        }
      }
    }
  }


Je suis complètement perdu, je veux juste créer une veilleuse commandée par une télécommande avec différents mode statique et un mode de variation pour mon garçon

@bricoleau, une idée ou une aide ou une autre manière de procéder à me conseiller?

ça vous permettra d'exprimer ce que vous voulez obtenir


PS:

@bricoleau n'est plus passé sur le forum depuis 2 ans... pas sûr qu'il vous réponde...

je veux obtenir ça :

for (int r = 0; r < 256; r++) {
  analogWrite(REDLED, 255);
  analogWrite(GREENLED, 0);
  analogWrite(BLUELED, r);
  delay(10);
  }
  for (int r = 256; r > 0; r--) {
  analogWrite(REDLED, r);
  analogWrite(GREENLED, 0);
  analogWrite(BLUELED, 255);
  delay(10);
  }
  for (int r = 0; r < 256; r++) {
  analogWrite(REDLED, 0);
  analogWrite(GREENLED, r);
  analogWrite(BLUELED, 255);
  delay(10);
  }
  for (int r = 256; r > 0; r--) {
  analogWrite(REDLED, 0);
  analogWrite(GREENLED, 255);
  analogWrite(BLUELED, r);
  delay(10);
  }
  for (int r = 0; r < 256; r++) {
  analogWrite(REDLED, r);
  analogWrite(GREENLED, 255);
  analogWrite(BLUELED, 0);
  delay(10);
  }
  for (int r = 256; r > 0; r--) {
  analogWrite(REDLED, 255);
  analogWrite(GREENLED, r);
  analogWrite(BLUELED, 0);
  delay(20);
  }

}
```````````````
en appuyant sur un des boutons de la télécommande sans que ça reste figé à la fin du process.
c'est à dire:
    -->de l'etatRed à l'etatPurple
   I     de l'etatPurple à l'etatBlue
   I     de l'etatBlue à l'etatCyan
   I     de l'etatCyan à l'etatGreen
   I     de l'etatGreen à l'etatYellow
   I _ _ _ _ _ _ _ _ _ I

Ce n'est toujours pas sous forme de graphe :frowning:

Ce que tu donne est uniquement une animation.
De plus dans le post #10 tu ne fais pas de machine à état.

As tu au moins essayer de faire une animation via une machine à état, sans te soucier pour l'instant de l'interception de la télécommande ?
Je me trompe peut être, mais j'ai comme l'impression que tu n'a pas assimiler ce qu'était une machine à état ?

Tu as certainement raison, je n'ai certainement pas assimilé ce qu'était une machine à état.
Peut etre pourrais tu me montrer en utilisant mon exemple?

Oui je peux essayer de trouver un moment pour te faire un mini exemple sur un wokwi.
Mais je ne suis pas pour coder à la place, car je trouve que cela ne te profitera pas.

Non, je n'attends pas qu'on code à ma place, je trouve aussi que ce serait contre productif.
Mais si on peut déjà pointer où se trouvent les erreurs dans mes essais et m'indiquer la meilleure marche à suivre pour éviter que l'animation reste figée à cause de delay, ça serait sympa.
Merci beaucoup

Je l'ai fait mais fatalement je n'ai pas de fonction simpleclick ni doubleclick ni mise au repos

bon allez, c'est presque encore Noël, voici un exemple avec une double machine à états

  • la première gère la réception de commandes de la part de la télécommande et enregistre la command reçue
  • la seconde gère la LED et son éventuelle animation en fonction de la commande reçue

seules quelques touches ont une commande associée

  • POWER ➜ éteindre
  • 0 ➜ led en rouge
  • 1 ➜ led en vert
  • 2 ➜ led en bleu
  • 3 ➜ led en animation aleatoire à 2Hz

vous pouvez tester ici

➜ A vous de jouer pour changer la partie animation et faire l'animation que vous souhaitez

Le code
#include <IRremote.h>
const byte irPin = 2;
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 = 10;
const byte pinVerte =  9;
const byte pinBleue =  6;

enum Commande {AUCUNE, ETEINDRE, ROUGE, VERT, BLEU, ANIMATION} commandeRecue = AUCUNE;
enum Etat {STATIQUE, DYNAMIQUE} etat = STATIQUE;

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

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

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},
};


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 VERT:
      digitalWrite(pinRouge, LOW);
      digitalWrite(pinVerte, HIGH);
      digitalWrite(pinBleue, LOW);
      etat = STATIQUE;
      break;

    case BLEU:
      digitalWrite(pinRouge, LOW);
      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
    analogWrite(pinRouge, random(256));
    analogWrite(pinVerte, random(256));
    analogWrite(pinBleue, random(256));
    dernierChangementCouleur = millis();
  }
}


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

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

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

Super,
Merci infiniment.
Je teste ça ce soir et vous envoie ce que j'ai fait.

Ramdom, c'est pour une variable aléatoire dans l'animation, c'est ça ?
À moi de la modifier pour mon animation perso ?

Et pour IR Key qu'es ce qui a défini les valeurs juste avant le nom des touches?

Merci encore