Capteur IR avec Bande led adressable

Bonjour, j'ai pour projet de pouvoir faire varier les patterns lumineux d'une bande led adressable à l'aide d'un capteur infrarouge et d'une télécommande infrarouge. Pour le montage j'ai fait differents branchement en utilisant en alimentation un module 5v 10A compatible avec ma bande led afin de pas griller la bande. J'utilise une carte arduino nano. Mais mon problème est au niveau code. Mon programme se televerse sans erreur. Je veux pouvoir changer à tout instant le pattern de la bande led en appuyant sur un bouton de la télécommande.

Mon code:

#include <FastLED.h>
#include "IRremote.h"

int receiverPin = 6;
IRrecv irrecv(receiverPin);
decode_results results;
#define LED_PIN     5
#define NUM_LEDS    144
#define BRIGHTNESS  64
#define LOWNESS 0
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define UPDATES_PER_SECOND 100

CRGBPalette16 currentPalette;
TBlendType    currentBlending;

extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;


void setup() {
  Serial.begin(9600);
  Serial.println(F("IR Receiver Decoder"));
  irrecv.enableIRIn(); // Start the receiver
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );

  currentPalette = RainbowColors_p;
  currentBlending = LINEARBLEND;
}


void loop()
{
  if (irrecv.decode(&results)) { // IR signal received?
    if (results.value != 0xFFFFFFFF) {
      switch (results.value) {
        case 0xFF6897:
          FastLED.show();
          FastLED.delay(1000 / UPDATES_PER_SECOND);
          RGBLoop();
          break;
        case 0xFF30CF:
          FastLED.show();
          FastLED.delay(1000 / UPDATES_PER_SECOND);
          rainbowCycle(20);
          break;
        case 0xFF18E7:
          FadeInOut(0xff, 0x77, 0x00);
          break;
        case 0xFF7A85:
          CylonBounce(0xff, 0, 0, 4, 10, 50);
        case 0xFF10EF:
          TwinkleRandom(20, 100, false);
          break;
        case 0xFF38C7:
          irrecv.resume();
          Sparkle(0xff, 0xff, 0xff, 0);
          break;
      }
    }
    irrecv.resume();
  }
}

void pattern() {
  while (results.value == 0xFF6897)
  {
    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
    showStrip();
    RGBLoop();
  }
  while (results.value == 0xFF30CF)
  {
    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
    showStrip();
    rainbowCycle(20);
  }
  while (results.value == 0xFF18E7)
  {
    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
    showStrip();
    FadeInOut(0xff, 0x77, 0x00);
  }
  while (results.value == 0xFF7A85)
  {
    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
    showStrip();
    CylonBounce(0xff, 0, 0, 4, 10, 50);
  }





}



void telecommande() {
  Serial.print(results.value);
  delay (500);
}



void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
#endif
}

void setAll(byte red, byte green, byte blue) {
  for (int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}

void RGBLoop() {
  for (int j = 0; j < 3; j++ ) {
    // Fade IN
    for (int k = 0; k < 256; k++) {
      switch (j) {
        case 0: setAll(k, 0, 0); break;
        case 1: setAll(0, k, 0); break;
        case 2: setAll(0, 0, k); break;
      }
      showStrip();
      delay(3);
    }
    // Fade OUT
    for (int k = 255; k >= 0; k--) {
      switch (j) {
        case 0: setAll(k, 0, 0); break;
        case 1: setAll(0, k, 0); break;
        case 2: setAll(0, 0, k); break;
      }
      showStrip();
      delay(3);
    }
  }
}
void FadeInOut(byte red, byte green, byte blue) {
  float r, g, b;

  for (int k = 0; k < 256; k = k + 1) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r, g, b);
    showStrip();
  }

  for (int k = 255; k >= 0; k = k - 2) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r, g, b);
    showStrip();
  }
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause) {
  for (int j = 0; j < StrobeCount; j++) {
    setAll(red, green, blue);
    showStrip();
    delay(FlashDelay);
    setAll(0, 0, 0);
    showStrip();
    delay(FlashDelay);
  }

  delay(EndPause);
}

void CylonBounce(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {

  for (int i = 0; i < NUM_LEDS - EyeSize - 2; i++) {
    setAll(0, 0, 0);
    setPixel(i, red / 10, green / 10, blue / 10);
    for (int j = 1; j <= EyeSize; j++) {
      setPixel(i + j, red, green, blue);
    }
    setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10);
    showStrip();
    delay(SpeedDelay);
  }

  delay(ReturnDelay);

  for (int i = NUM_LEDS - EyeSize - 2; i > 0; i--) {
    setAll(0, 0, 0);
    setPixel(i, red / 10, green / 10, blue / 10);
    for (int j = 1; j <= EyeSize; j++) {
      setPixel(i + j, red, green, blue);
    }
    setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10);
    showStrip();
    delay(SpeedDelay);
  }

  delay(ReturnDelay);
}

void TwinkleRandom(int Count, int SpeedDelay, boolean OnlyOne) {
  setAll(0, 0, 0);

  for (int i = 0; i < Count; i++) {
    setPixel(random(NUM_LEDS), random(0, 255), random(0, 255), random(0, 255));
    showStrip();
    delay(SpeedDelay);
    if (OnlyOne) {
      setAll(0, 0, 0);
    }
  }

  delay(SpeedDelay);
}

void Sparkle(byte red, byte green, byte blue, int SpeedDelay) {
  int Pixel = random(NUM_LEDS);
  setPixel(Pixel, red, green, blue);
  showStrip();
  delay(SpeedDelay);
  setPixel(Pixel, 0, 0, 0);
}

void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {
  setAll(red, green, blue);

  int Pixel = random(NUM_LEDS);
  setPixel(Pixel, 0xff, 0xff, 0xff);
  showStrip();
  delay(SparkleDelay);
  setPixel(Pixel, red, green, blue);
  showStrip();
  delay(SpeedDelay);
}

void RunningLights(byte red, byte green, byte blue, int WaveDelay) {
  int Position = 0;

  for (int j = 0; j < NUM_LEDS * 2; j++)
  {
    Position++; // = 0; //Position + Rate;
    for (int i = 0; i < NUM_LEDS; i++) {
      // sine wave, 3 offset waves make a rainbow!
      //float level = sin(i+Position) * 127 + 128;
      //setPixel(i,level,0,0);
      //float level = sin(i+Position) * 127 + 128;
      setPixel(i, ((sin(i + Position) * 127 + 128) / 255)*red,
               ((sin(i + Position) * 127 + 128) / 255)*green,
               ((sin(i + Position) * 127 + 128) / 255)*blue);
    }

    showStrip();
    delay(WaveDelay);
  }
}

void rainbowCycle(int SpeedDelay) {
  byte *c;
  uint16_t i, j;

  for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
    for (i = 0; i < NUM_LEDS; i++) {
      c = Wheel(((i * 256 / NUM_LEDS) + j) & 255);
      setPixel(i, *c, *(c + 1), *(c + 2));
    }
    showStrip();
    delay(SpeedDelay);
  }
}

byte * Wheel(byte WheelPos) {
  static byte c[3];

#include <FastLED.h>
#include "IRremote.h"

int receiverPin = 6;
IRrecv irrecv(receiverPin);
decode_results results;
#define LED_PIN     5
#define NUM_LEDS    144
#define BRIGHTNESS  64
#define LOWNESS 0
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define UPDATES_PER_SECOND 100

CRGBPalette16 currentPalette;
TBlendType    currentBlending;

extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;


void setup() {
  Serial.begin(9600);
  Serial.println(F("IR Receiver Decoder"));
  irrecv.enableIRIn(); // Start the receiver
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );

  currentPalette = RainbowColors_p;
  currentBlending = LINEARBLEND;
}


void loop()
{
  if (irrecv.decode(&results)) { // IR signal received?
    if (results.value != 0xFFFFFFFF) {
      switch (results.value) {
        case 0xFF6897:
          FastLED.show();
          FastLED.delay(1000 / UPDATES_PER_SECOND);
          RGBLoop();
          break;
        case 0xFF30CF:
          FastLED.show();
          FastLED.delay(1000 / UPDATES_PER_SECOND);
          rainbowCycle(20);
          break;
        case 0xFF18E7:
          FadeInOut(0xff, 0x77, 0x00);
          break;
        case 0xFF7A85:
          CylonBounce(0xff, 0, 0, 4, 10, 50);
        case 0xFF10EF:
          TwinkleRandom(20, 100, false);
          break;
        case 0xFF38C7:
          irrecv.resume();
          Sparkle(0xff, 0xff, 0xff, 0);
          break;
      }
    }
    irrecv.resume();
  }
}

void pattern() {
  while (results.value == 0xFF6897)
  {
    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
    showStrip();
    RGBLoop();
  }
  while (results.value == 0xFF30CF)
  {
    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
    showStrip();
    rainbowCycle(20);
  }
  while (results.value == 0xFF18E7)
  {
    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
    showStrip();
    FadeInOut(0xff, 0x77, 0x00);
  }
  while (results.value == 0xFF7A85)
  {
    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
    showStrip();
    CylonBounce(0xff, 0, 0, 4, 10, 50);
  }





}



void telecommande() {
  Serial.print(results.value);
  delay (500);
}



void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
#endif
}

void setAll(byte red, byte green, byte blue) {
  for (int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}

void RGBLoop() {
  for (int j = 0; j < 3; j++ ) {
    // Fade IN
    for (int k = 0; k < 256; k++) {
      switch (j) {
        case 0: setAll(k, 0, 0); break;
        case 1: setAll(0, k, 0); break;
        case 2: setAll(0, 0, k); break;
      }
      showStrip();
      delay(3);
    }
    // Fade OUT
    for (int k = 255; k >= 0; k--) {
      switch (j) {
        case 0: setAll(k, 0, 0); break;
        case 1: setAll(0, k, 0); break;
        case 2: setAll(0, 0, k); break;
      }
      showStrip();
      delay(3);
    }
  }
}
void FadeInOut(byte red, byte green, byte blue) {
  float r, g, b;

  for (int k = 0; k < 256; k = k + 1) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r, g, b);
    showStrip();
  }

  for (int k = 255; k >= 0; k = k - 2) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r, g, b);
    showStrip();
  }
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause) {
  for (int j = 0; j < StrobeCount; j++) {
    setAll(red, green, blue);
    showStrip();
    delay(FlashDelay);
    setAll(0, 0, 0);
    showStrip();
    delay(FlashDelay);
  }

  delay(EndPause);
}

void CylonBounce(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {

  for (int i = 0; i < NUM_LEDS - EyeSize - 2; i++) {
    setAll(0, 0, 0);
    setPixel(i, red / 10, green / 10, blue / 10);
    for (int j = 1; j <= EyeSize; j++) {
      setPixel(i + j, red, green, blue);
    }
    setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10);
    showStrip();
    delay(SpeedDelay);
  }

  delay(ReturnDelay);

  for (int i = NUM_LEDS - EyeSize - 2; i > 0; i--) {
    setAll(0, 0, 0);
    setPixel(i, red / 10, green / 10, blue / 10);
    for (int j = 1; j <= EyeSize; j++) {
      setPixel(i + j, red, green, blue);
    }
    setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10);
    showStrip();
    delay(SpeedDelay);
  }

  delay(ReturnDelay);
}

void TwinkleRandom(int Count, int SpeedDelay, boolean OnlyOne) {
  setAll(0, 0, 0);

  for (int i = 0; i < Count; i++) {
    setPixel(random(NUM_LEDS), random(0, 255), random(0, 255), random(0, 255));
    showStrip();
    delay(SpeedDelay);
    if (OnlyOne) {
      setAll(0, 0, 0);
    }
  }

  delay(SpeedDelay);
}

void Sparkle(byte red, byte green, byte blue, int SpeedDelay) {
  int Pixel = random(NUM_LEDS);
  setPixel(Pixel, red, green, blue);
  showStrip();
  delay(SpeedDelay);
  setPixel(Pixel, 0, 0, 0);
}

void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {
  setAll(red, green, blue);

  int Pixel = random(NUM_LEDS);
  setPixel(Pixel, 0xff, 0xff, 0xff);
  showStrip();
  delay(SparkleDelay);
  setPixel(Pixel, red, green, blue);
  showStrip();
  delay(SpeedDelay);
}

void RunningLights(byte red, byte green, byte blue, int WaveDelay) {
  int Position = 0;

  for (int j = 0; j < NUM_LEDS * 2; j++)
  {
    Position++; // = 0; //Position + Rate;
    for (int i = 0; i < NUM_LEDS; i++) {
      // sine wave, 3 offset waves make a rainbow!
      //float level = sin(i+Position) * 127 + 128;
      //setPixel(i,level,0,0);
      //float level = sin(i+Position) * 127 + 128;
      setPixel(i, ((sin(i + Position) * 127 + 128) / 255)*red,
               ((sin(i + Position) * 127 + 128) / 255)*green,
               ((sin(i + Position) * 127 + 128) / 255)*blue);
    }

    showStrip();
    delay(WaveDelay);
  }
}

void rainbowCycle(int SpeedDelay) {
  byte *c;
  uint16_t i, j;

  for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
    for (i = 0; i < NUM_LEDS; i++) {
      c = Wheel(((i * 256 / NUM_LEDS) + j) & 255);
      setPixel(i, *c, *(c + 1), *(c + 2));
    }
    showStrip();
    delay(SpeedDelay);
  }
}

byte * Wheel(byte WheelPos) {
  static byte c[3];

  if (WheelPos < 85) {
    c[0] = WheelPos * 3;
    c[1] = 255 - WheelPos * 3;
    c[2] = 0;
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    c[0] = 255 - WheelPos * 3;
    c[1] = 0;
    c[2] = WheelPos * 3;
  } else {
    WheelPos -= 170;
    c[0] = 0;
    c[1] = WheelPos * 3;
     c[2]=255 - WheelPos * 3;
  }

  return c;
}

branchement module

Mais Je pense que le problème est que j'utilise mal la boucle loop. C'est-à-dire que mon problème est que quand j'appuye sur un bouton de la télécommande je veux que le pattern change instantanément ce qui n'estr pas le cas actuellement. Je dois attendre que la bande led s'éteigne pour allumer un autre pattern.

Merci de votre aide. Si vous avez besoins de plus de précision n'hésiter pas

Bonsoir

Oui vous avez bien vu le souci
Il faut récrire chaque animation sous forme d’une fonction appelée par le loop qui utilise millis() pour décider quand faire une seule prochaine étape de l’animation de façon à être non bloquante
La fonction pourrait retourner vrai quand elle est terminée par exemple et prendre un paramètre pour l’initialiser

La loop écouterait la commande IR qui initialiserait la bonne fonction si une commande est reçue et séparément la loop appellerait la fonction courante jusqu’à ce qu’elle réponde vrai

Une variable de type pointeur sur fonction sera pratique pour mémoriser la fonction en cours

Bonsoir, merci pour votre réponse.

Je vais me renseigner sur la fonction millis().
Mais est-ce dure à implémenter ? (parce que je débute)?

Il faut repenser le code pour qu’il ne soit pas bloquant. Il y a un exemple qui s’appelle “blink without delay” qui explique le principe

Vous pouvez aussi lire ce tuto (et les autres de ce site d’ailleurs)

Bonjour,

JML a raison, la méthode "orthodoxe" serait de réorganiser complètement ton programme en utilisant millis() pour qu'il ne soit pas bloquant.
Cependant dans le cas des animations cela conduit rapidement à un programme indémerda très compliqué. Personnellement je te déconseillerais de te lancer là-dedans.

Un autre problème est qu'il est impossible (en tout cas je n'y suis jamais arrivé) de recevoir correctement une télécommande en même temps que l'affichage neopixels.

Je te présente plutôt une autre solution qui consiste à tester la réception de télécommande pendant les delay() et de faire un longjmp (fonction rarement utilisée) pour changer d'animation.
Cependant le problème de réception télécommande persiste et tu seras obligé d'appuyer 2 fois sur le bouton de la télécommande pour changer d'animation.

#include <FastLED.h>
#include "IRremote.h"
#include <setjmp.h>

int receiverPin = 6;
IRrecv irrecv(receiverPin);
decode_results results;
#define LED_PIN     5
#define NUM_LEDS    144
#define BRIGHTNESS  64
#define LOWNESS 0
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define UPDATES_PER_SECOND 100

CRGBPalette16 currentPalette;
TBlendType    currentBlending;

extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;


void setup() {
  Serial.begin(115200);
  Serial.println(F("IR Receiver Decoder"));
  irrecv.enableIRIn(); // Start the receiver
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );

  currentPalette = RainbowColors_p;
  currentBlending = LINEARBLEND;
}

jmp_buf env;

void loop()
{
  int n = setjmp(env);
  if (n > 0)
  {
    while (true)
      switch (n)
      {
        case 1:
          RGBLoop();
          break;
        case 2:
          rainbowCycle(20);
          break;
        case 3:
          FadeInOut(0xff, 0x77, 0x00);
          break;
        case 4:
          CylonBounce(0xff, 0, 0, 4, 10, 50);
          break;
        case 5:
          TwinkleRandom(20, 100, false);
          break;
        case 6:
          Sparkle(0xff, 0xff, 0xff, 1);
          break;
      }
  }
  delay(10000);
}

// appelé pendant les delay()
void yield()
{
  if (irrecv.decode(&results)) // IR signal received?
  {
    int nEffet = 0;
    if (results.value != 0xFFFFFFFF)
    {
      Serial.println(results.value, HEX);

      switch (results.value) {
        case 0xFF6897:
          nEffet = 1;
          break;
        case 0xFF30CF:
          nEffet = 2;
          break;
        case 0xFF18E7:
          nEffet = 3;
          break;
        case 0xFF7A85:
          nEffet = 4;
          break;
        case 0xFF10EF:
          nEffet = 5;
          break;
        case 0xFF38C7:
          nEffet = 6;
          break;
        default:
          nEffet = -1;
          break;
      }
    }
    irrecv.resume();

    if (nEffet != 0)
    {
      setAll(0,0,0);
      longjmp(env, nEffet);
    }
  }
}

void pattern() {
  RGBLoop();

  rainbowCycle(20);

  FadeInOut(0xff, 0x77, 0x00);

  CylonBounce(0xff, 0, 0, 4, 10, 50);
}


void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
#endif
}

void setAll(byte red, byte green, byte blue) {
  for (int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}

void RGBLoop() {
  for (int j = 0; j < 3; j++ ) {
    // Fade IN
    for (int k = 0; k < 256; k++) {
      switch (j) {
        case 0: setAll(k, 0, 0); break;
        case 1: setAll(0, k, 0); break;
        case 2: setAll(0, 0, k); break;
      }
      showStrip();
      delay(3);
    }
    // Fade OUT
    for (int k = 255; k >= 0; k--) {
      switch (j) {
        case 0: setAll(k, 0, 0); break;
        case 1: setAll(0, k, 0); break;
        case 2: setAll(0, 0, k); break;
      }
      showStrip();
      delay(3);
    }
  }
}

void FadeInOut(byte red, byte green, byte blue) {
  float r, g, b;

  for (int k = 0; k < 256; k = k + 1) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r, g, b);
    showStrip();
    delay(1);
  }

  for (int k = 255; k >= 0; k = k - 2) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r, g, b);
    showStrip();
    delay(1);
  }
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause) {
  for (int j = 0; j < StrobeCount; j++) {
    setAll(red, green, blue);
    showStrip();
    delay(FlashDelay);
    setAll(0, 0, 0);
    showStrip();
    delay(FlashDelay);
  }

  delay(EndPause);
}

void CylonBounce(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {

  for (int i = 0; i < NUM_LEDS - EyeSize - 2; i++) {
    setAll(0, 0, 0);
    setPixel(i, red / 10, green / 10, blue / 10);
    for (int j = 1; j <= EyeSize; j++) {
      setPixel(i + j, red, green, blue);
    }
    setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10);
    showStrip();
    delay(SpeedDelay);
  }

  delay(ReturnDelay);

  for (int i = NUM_LEDS - EyeSize - 2; i > 0; i--) {
    setAll(0, 0, 0);
    setPixel(i, red / 10, green / 10, blue / 10);
    for (int j = 1; j <= EyeSize; j++) {
      setPixel(i + j, red, green, blue);
    }
    setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10);
    showStrip();
    delay(SpeedDelay);
  }

  delay(ReturnDelay);
}

void TwinkleRandom(int Count, int SpeedDelay, boolean OnlyOne) {
  setAll(0, 0, 0);

  for (int i = 0; i < Count; i++) {
    setPixel(random(NUM_LEDS), random(0, 255), random(0, 255), random(0, 255));
    showStrip();
    delay(SpeedDelay);
    if (OnlyOne) {
      setAll(0, 0, 0);
    }
  }

  delay(SpeedDelay);
}

void Sparkle(byte red, byte green, byte blue, int SpeedDelay) {
  int Pixel = random(NUM_LEDS);
  setPixel(Pixel, red, green, blue);
  showStrip();
  delay(SpeedDelay);
  setPixel(Pixel, 0, 0, 0);
}

void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {
  setAll(red, green, blue);

  int Pixel = random(NUM_LEDS);
  setPixel(Pixel, 0xff, 0xff, 0xff);
  showStrip();
  delay(SparkleDelay);
  setPixel(Pixel, red, green, blue);
  showStrip();
  delay(SpeedDelay);
}

void RunningLights(byte red, byte green, byte blue, int WaveDelay) {
  int Position = 0;

  for (int j = 0; j < NUM_LEDS * 2; j++)
  {
    Position++; // = 0; //Position + Rate;
    for (int i = 0; i < NUM_LEDS; i++) {
      // sine wave, 3 offset waves make a rainbow!
      //float level = sin(i+Position) * 127 + 128;
      //setPixel(i,level,0,0);
      //float level = sin(i+Position) * 127 + 128;
      setPixel(i, ((sin(i + Position) * 127 + 128) / 255)*red,
               ((sin(i + Position) * 127 + 128) / 255)*green,
               ((sin(i + Position) * 127 + 128) / 255)*blue);
    }

    showStrip();
    delay(WaveDelay);
  }
}

void rainbowCycle(int SpeedDelay) {
  byte *c;
  uint16_t i, j;

  for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
    for (i = 0; i < NUM_LEDS; i++) {
      c = Wheel(((i * 256 / NUM_LEDS) + j) & 255);
      setPixel(i, *c, *(c + 1), *(c + 2));
    }
    showStrip();
    delay(SpeedDelay);
  }
}

byte * Wheel(byte WheelPos) {
  static byte c[3];

  if (WheelPos < 85) {
    c[0] = WheelPos * 3;
    c[1] = 255 - WheelPos * 3;
    c[2] = 0;
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    c[0] = 255 - WheelPos * 3;
    c[1] = 0;
    c[2] = WheelPos * 3;
  } else {
    WheelPos -= 170;
    c[0] = 0;
    c[1] = WheelPos * 3;
    c[2] = 255 - WheelPos * 3;
  }

  return c;
}

Dans ton programme original, l'animation sélectionnée ne s'exécutait qu'une seule fois. Je l'ai modifié pour relancer l'animation tant qu'on n'en change pas. Si tu préfères le fonctionnement initial supprime le while (true) dans la loop()

Bonjour, merci pour vos suggestions.

J'ai regardé le tutoriel pour introduire le temps proposé par J-M-L mais cela semble compliqué pour moi d'implémenter tout ça pour mon code à moi.

J'ai ensuite téléversé le code de Kamill qui a parfaitement marché. Effectivement je suis obligé d'appuyer 2 fois sur le bouton de la télécommande pour que le pattern change (1er appui éteint la bande et le 2nd appui allume le pattern programmé sur cette touche). Merci pour votre code. Mais est-ce possible de centralisé l'arrêt de la bande led. Par exemple si j'appuie sur le bouton power de la télécommande, la bande s'éteint et ensuite si j'appuie sur un autre bouton que le pattern correspondant à ce bouton ce mette en place.

Ma télécommande:

PS: je rencontre un problème avec le pattern TwinkleRandom qui s'éteint au bout de 2 sec d'éxécution pour se relancer alors que je voudrais que le programme dure jusqu'a ce que toute les leds soient éclairées.
Voilà ce que fait le programme Twinkle : TwinkleRandom - YouTube

Merci

Quand tu appuies sur n'importe quelle touche ça arrête l'animation. Donc tu peux appuyer sur power.

Je regarde pour TwinkleRandom .

Tu appelles TwinkleRandom avec quels paramètres?
Augmente le paramètre count si tu veux que ça dure plus longtemps.

Parfait merci, j'ai augmenté count et ça dure plus longtemps !
Je vais finir de rajouter mes différents pattern et de les reliers à un bouton de la télécommande.

Merci pour votre aide. Je reviens vers vous si jamais je n'y arrive pas.

Pas de problème