Aide : Gestion de 3 neopixels rings via une télécommande ir.

Bonjour tout le monde!

Je me présente Perecastor, 35 ans et toutes ses dents.
Fier de mes 2 réalisations perso animés par des arduino, je me suis lancé dans un nouveau projet.

Mettre au gout du jour un vieux lustre de salon des années 70-80 avec 3 jolis Neopixels rings de 24 leds rgb chacun en guise place des 3 ampoules a incandescence d époque.

Jusque la tout va bien! Montage, installation et programation de l arduino mini avec un example fournis avec la librairie Adafruit Neopixel que j ai un peu modifie et que voici:

// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
// You should wire a momentary push button to connect from ground to a digital IO pin.  When you
// press the button it will change to a new pixel animation.  Note that you need to press the
// button once to start the first animation!

#include <Adafruit_NeoPixel.h>

#define BUTTON_PIN   2    // Digital IO pin connected to the button.  This will be
                          // driven with a pull-up resistor so the switch should
                          // pull the pin to ground momentarily.  On a high -> low
                          // transition the button press logic will execute.

#define PIXEL_PIN    6    // Digital IO pin connected to the NeoPixels.

#define PIXEL_COUNT 72

// Parameter 1 = number of pixels in strip,  neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream
//   NEO_GRB     Pixels are wired for GRB bitstream, correct for neopixel stick
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_RGB + NEO_KHZ800);

bool oldState = HIGH;
int showType = 0;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Get current button state.
  bool newState = digitalRead(BUTTON_PIN);

  // Check if state changed from high to low (button press).
  if (newState == LOW && oldState == HIGH) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 9)
        showType=0;
      startShow(showType);
    }
  }

  // Set the last button state to the old state.
  oldState = newState;
}

void startShow(int i) {
  switch(i){
    case 0: colorWipe(strip.Color(0, 0, 0), 50);    // Black/off
            break;
    case 1: colorWipe(strip.Color(255, 255, 255), 50);  // blanc 
            break;
    case 2: colorWipe(strip.Color(0, 255, 0), 50);  // rouge 
            break;
    case 3: colorWipe(strip.Color(0, 0, 255), 50);  // bleu 
            break;
    case 4: colorWipe(strip.Color(0, 255, 255), 50); // violet 
            break;
    case 5: rainbowCycle(50);
            break;
    case 6: theaterChaseRainbow(50);
            break;
  }
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Deux jours a peine après avoir installé tout ceci, le feignant qui dort en moi se demande si avec une diode ir réceptrice récupéré sur un appareil audio hs et une télécommande ir je ne pourrai pas faire quelque chose.

Et c est la que je bloque! J ai, grâce a la librairie IR remote et un tuto, récupéré les trames que je veux pour pouvoir piloter ma lampe. Mais je ne sais pas quoi en faire... Je ne sais pas comment faire réagir mon programme via les trames que je lui envoie via la télécommande.
Voici les trames ( en hexa) que je veux utiliser:

on/off = FF00609F //trame pour allumer et eteindre la lampe
r+ = FF0010EF // augmente de 5 la valeur Red  
r- = FF00C837 // baisse de 5 la valeur Red
g+ = FF0048B7 // augmente de 5 la valeur Green
g- = FF0038C7 // baisse de 5 la valeur Green
b+ = FF007887 // augmente de 5 la valeur Blue
b- = FF00B847 // baisse de 5 la valeur Blue
dim+ = FF0022DD // augmenter la luminosité 
dim- = FF00629D // baisser la luminosité
mode = FF00A857 // basculer de case0 a case5

Et c est la que votre aide précieuse me serait très utile... je ne sais pas comment gérer ces valeurs hexa dans mon programme de base.
Je suis ouvert a toute critique donc allez y!

J espère être au bon endroit pour poster et que la forme y est.

D avance, merci pour l aide ^^

Bonjour,

Il suffit de tester la valeur reçue et faire l'action correspondante:

switch (results.value)
{
 case 0XFF00609F:
   // traiter ici le on/off
   break;
 case 0XFF0010EF:
  // augmente de 5 la valeur Red
 break;

 ...
}

Merci beaucoup pour ta réponse ^^

Le soucis c est que justement je ne sais pas comment faire pour tester ces valeurs.
Pour le moment je vais me limiter a deux touches : on/off et le bouton pour switcher les modes.

#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() 
{
  irrecv.decode(&results);
   switch (results.value)
{
 case 0XFF00609F:
   Serial.print("on/off");// traiter ici le on/off
   break;
 case 0XFF00A857:
  Serial.print("mode change");// change de mode
 break;

}

}

Avec ca j arrive a faire afficher "on/off" ou "mode change" avec le moniteur série mais l info se répète sans arrêt. Alors que ce qui m intéresse c est d avoir une seule fois l info sinon quand je vais switcher sur change mode, ca va tourner en boucle ou sinon s allumer/ s éteindre sans arrêt.

Je viens de sortir ca:

#include <Adafruit_NeoPixel.h>
#include <IRremote.h>

int RECV_PIN = 11;
#define PIXEL_PIN    6
#define PIXEL_COUNT 72

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_RGB + NEO_KHZ800);
IRrecv irrecv(RECV_PIN);
decode_results results;

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

void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }}
  void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }}
  uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}


void loop() 
{
  irrecv.decode(&results);
   switch (results.value)
{
 case 0XFF00609F:
   Serial.print("on/off");// traiter ici le on/off
   colorWipe(strip.Color(0, 0, 0), 50);
   break;
 case 0XFF0010EF:
  Serial.print("blanc");// blanc
  colorWipe(strip.Color(255, 255, 255), 50);
 break; 
 case 0XFF00C837:
  Serial.print("rouge");// rouge
  colorWipe(strip.Color(0, 255, 0), 50);
 break; 
 case 0XFF0048B7:
  Serial.print("bleu");// bleu
  colorWipe(strip.Color(0, 0, 255), 50);
 break; 
 case 0XFF0038C7:
  Serial.print("violet");// violet
  colorWipe(strip.Color(0, 250, 255), 50);
 break; 
 case 0XFF007887:
 rainbowCycle(50);
  Serial.print("arc-en-ciel");// arc-en-ciel
 break;

}}

Une fois envoyé ça, ça mouline beaucoup moins vite :confused: l arduino choppe une info et me renvoie ce qu il a récupéré sur la console mais j ai l impression qu une fois qu il a pris l info il est bloqué et n arrive plus a recevoir d autre infos.
Je ne peux pas essayer (avec les diodes rgb branchés) pour le moment car il faut démonter la lampe pour avoir accès a l arduino mini. Et madame utilise actuellement la lampe ^^.
Que penses tu de mon bout de code?

Je pense qu'une fois que tu as traité la réception il faut que tu fasses

    irrecv.resume();

je confirme que des qu il choppe une info, il reste en boucle. Je n arrive pas a lui faire changer d état.
J ai bien essaye avec

irrecv.resume();

mais je ne sais pas trop ou le mettre.... j ai essaye a la fin de chaque case exemple:

 case 0XFF20DF:
  Serial.print("blanc");// blanc
  colorWipe(strip.Color(255, 255, 255), 50);
  irrecv.resume();

toujours le même résultat, ça tourne en boucle.
J ai essayer en fin de programme , pareil et juste après

irrecv.decode(&results);

et rebelote :confused:

En tout cas, merci a toi de te pencher sur mon soucis a la noix!

Je pense que c est bon ^^ tout du moins, avec le moniteur série ça l air de passer!
Maintenant reste plus qu a souder la diode ir sur le mini et le reprogrammer pour tester ^^
Merci encore a toi pour ton aide!
Voici le code qui a l air de fonctionner:

#include <Adafruit_NeoPixel.h>
#include <IRremote.h>

int RECV_PIN = 11;
#define PIXEL_PIN    6
#define PIXEL_COUNT 72

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_RGB + NEO_KHZ800);
IRrecv irrecv(RECV_PIN);
decode_results results;

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

void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }}
  
  void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }}
  uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}


void loop() 

{
  if (irrecv.decode(&results)) {
    if (results.value == 0XFF00FF) { 
      Serial.print("on/off");// traiter ici le on/off
   colorWipe(strip.Color(0, 0, 0), 50);
    } 
    else if (results.value == 0XFF20DF) { 
      Serial.print("blanc");// blanc
  colorWipe(strip.Color(255, 255, 255), 50);
     }   
    else if (results.value == 0XFF609F) { 
      Serial.print("rouge");// rouge
  colorWipe(strip.Color(0, 255, 0), 50);
    }   
    else if (results.value == 0XFF50AF) { 
      Serial.print("bleu");// bleu
  colorWipe(strip.Color(0, 0, 255), 50);
    }   
    else if (results.value == 0XFF708F) { 
      Serial.print("violet");// violet
  colorWipe(strip.Color(0, 250, 255), 50);
    }   
    else if (results.value == 0XFF6897) { 
      Serial.print("arc-en-ciel");// arc-en-ciel
  rainbowCycle(50);
    }   
    irrecv.resume(); // Receive the next value
  }
}

Bon! Madame est partie bosser, j ai donc le salon a ma guise....
J ai donc tout démonté, sortis mon arduino mini de la, vire le bouton poussoir de l ancien prog et installer la diode IR.
Jusque la, tout va bien!
A la seule exception que quand je met tout le monde sous tension, j ai direct une lumière verte qui est envoyé de façon je dirai totalement aléatoire ( j ai 3 anneaux avec 24 led/anneau) sur chaque anneau je dois avoir 5 ou 6 led allume en vert et de façon complètement aléatoire.
A savoir que le moniteur serie me renvoie bien les bonnes info en rapport a ma télécommande!
Donc mon branchement diode IR <-> arduino est bon. Liaison RGB <-> arduino fonctionne car j ai de la lumière même si pas demandé ( connexion aux anneaux : DataIn, Vcc, Gnd et DataOut donc pas d erreur possible).
Je bloque complètement! Donc je vais me faire un café histoire de se changer les idées....

Je suis un gros crétin a moitié aveugle!

C était devant moi.... il me manquait juste un petit

strip.begin();
  strip.show(); // Initialize all pixels to 'off'

dans mon void setup() .......
J avoue je tourne en rond depuis ce matin alors que j ai juste oublié d initialiser les leds.....
J essaye de faire une vidéo du résultat fini dans l aprem et je me penche maintenant sur la possibilité de modifier une couleurs en jouant sur les valeur Red,Green et Blue par incrémentation/décrémentation par palier de 5 (valeurs qui va de 0 a 255 pour chaque led)

Encore merci a toi kamill pour ton aide ^^

Voila la vidéo:

Désolé pour la qualité... Je n ai pas réussi a avoir mieux pour le moment...