IR und WS2812S

Guten Morgen Leute,

ich möchte eigentlich ein LED-Stripe mit 14 LEDs per IR schalten. Aber anscheinend stell ich mich einfach zu blöd an.

Ich wollte eigentlich den Adafruit strandtest als Grundlage hernehmen und die verschiedenen Zustände mittels IR schalten. Leider weiß ich nicht wo genau ich da ansetzen muss!

Vielleicht kann mir hier jemand unter die Arme greifen?

#include <Adafruit_NeoPixel.h>
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;


#define PIN 2


Adafruit_NeoPixel strip = Adafruit_NeoPixel(14, PIN, NEO_GRB + NEO_KHZ800);


void setup() {
  
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Ready to decode IR!");
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
  if (results.value == 16738455) {
  colorWipe(strip.Color(255, 0, 0), 50); // Red
 colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  }

//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue

  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// 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 (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t 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 (uint16_t 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 (uint16_t 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);
}

Kannst Du Dein Problem etwas genauer beschreiben? Liegt's am Lesen der IR Codes, oder an der Ausgabe der Muster, oder wo?

das auslesen ansich funktioniert, hab auch alle codes zu den Tasten.
Nur weiß ich nicht, wo oder wie ich die codes in das sketch setze, dass z.B. bei 1 die LEDs rot, bei 2 blau, ..., und bei 8 dann eben der Regenbogeneffekt abläuft.
Mein Problem ist, dass ich nicht verstehe, wie die einzelnen Teile von strandtest zusammen arbeiten. Ich denke, dass auch am Schluß des sketches viele Variablen noch "berechnet" werden.

Chris24xx:
Mein Problem ist, dass ich nicht verstehe, wie die einzelnen Teile von strandtest zusammen arbeiten. Ich denke, dass auch am Schluß des sketches viele Variablen noch "berechnet" werden.

Das ist leider oft so,bei kopierten Sketch.
Da muss man sich eben erst mit dem Sketch auseinandersetzen.

if (results.value == 16738455) {
  colorWipe(strip.Color(255, 0, 0), 50); // Red
 colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  }

Hier wird kontrolliert ob der empfangene Code einer bestimmten Taste entspricht und dementsprechend was gemacht.

Du mußt den Tastencode Deiner Fernsteuerung herausfinden zB indem Du results.value via seriel an den PC schickst.
grüße Uwe

Es reicht eine Abfrage
if (results.value == ... ) {
...
}
für jeden IR Code.

das mit den Tastencode habe ich schon gemacht. Mir gehts darum, dass ich die einzelnen Lichteffekte aufteilen möchte. Also mit jeder Taste ein anderer Effekt.

Und ja, ich hab versucht mich mit dem Sketch auseinander zu setzen, leider scheitert es halt an meinem Verständnis, deshalb suche ich ja Hilfe!

Wäre für jeden Tipp dankbar!

Entweder Du findest eine Gebrauchsanweisung zur Bibliothek, oder programmierst die Effekte selbst.
Vielleicht reicht es ja für's Verständnis, jede Zeile im Demo-Sketch einem anderen IR Code zuzuordnen, und dann ausprobieren.

Hallo Chris,
vergesse die "Adafruit_NeoPixel.h" Die ist richtig schwierig.
Nimm die "FastLED" die ist voll ausdokumentiert und alles ist erklärt.

Dort gibt es auch BeispielSketche die sich einem sofort erschliessen.
Probier die mal, Du wirst begeistert sein. Man kommt sofort zu einem
Ergebnis.

Auf dieser Seite findest Du alles was Du suchst.
Du mußt es aber durcharbeiten.
Gruß und Spaß dabei
Andreas

Hallo Andreas,

super, vielen Dank!!! Werd ich machen. So macht das Forum Spaß!!