Probleme beim Ansprechen von WS2812 LEDs per Byte

Hallo,

ich hätte eine Frage bezüglich meines Codes: ich wollte die Leds in Gruppen in Form von Bytes anlegen, um die Ansprache einfacher zu gestalten. Momentan habe ich allerdings das Problem, dass Zwar die Leds leuchten, die ich im Byte festgelegt habe, Aber beim Byte 1 leuchtet zusätzlich die LED 0 und Beim Byte 2 die LED 1.
Evtl kann mir jemand den Code korrigieren:

#include <Adafruit_NeoPixel.h>
#define PIN 3
Adafruit_NeoPixel strip = Adafruit_NeoPixel(48, PIN, NEO_GRB + NEO_KHZ800);


const byte Eins[3] = {1, 2, 3};
const byte Zwei[4] = {6, 7, 8, 9};
void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
 

for (int i=0; i <= 3; i++){
      strip.setPixelColor(Eins[i], 0,255,0);
     delay(50);
     strip.show();
   }

for (int t=0; t <= 4; t++){
      strip.setPixelColor(Zwei[t], 255,0,0);
     delay(50);
    
   }

  strip.show();

}

Vielen Dank für die Mühe
Gruß
Simon

Ah, Okay.
Danke jetzt läuft es einwandfrei, Ich hoffe ich bekomme mit den Delays keine Schwierigkeiten, da der Code mit einer Uhr kombiniert wird...

Gruß

Simon

Auch wenn Du vieleicht keine Probleme hast, hast Du den gleichen Fehler bei
for (int t=0; t <= 4; t++){

Das Array hat 4 Elemente Zwei[4] von 0 bis 3
und die Schleife läuft 5 mal durch ( von 0 bis 4). So überschreibst Du die auf die Veriable folgende Speicherstelle.

richtig ist:
for (int t=0; t < 4; t++){

Grüße Uwe

Hi

... oder, um die Array flexibler zu gestalten:
for (byte t=0;t<sizeof(Zwei)/sizeof(Zwei[0]);t++){
Dabei berechnet der Compiler, wie viele Elemente sich in dem Array Zwei[] befinden.
(sizeof gibt den Speicherplatz in Byte des zu Prüfenden Element zurück, SPeicherplatz des gesamten Array durch Speicherplatz eines einzelnen Element ergibt die Anzahl der Elemente)

Wenn Dein Code später noch Mal MEHR machen soll, gewöhne Dir delay() gar nicht erst an, in der IDE gibt's ein Beispiel 'Blink_without_delay' und hier im Forum die 'Nachtwächter-Erklärung' - einen Blick ist Das auf jeden Fall wert.

Dein Sketch ist momentan so gedacht, daß die benannten LEDs auf die entsprechende Farbe schalten und dann 'für immer und ewig' an bleiben?
Wenn JA, dann kannst Du Das auch nur 1x ausführen - wenn sich an den LEDs nichts ändert, musst Du auch keine Daten an die LEDs schicken - somit wären hier die delay() fast schon kein Problem mehr.

... befürchte aber, daß die LEDs später schon noch etwas aktiver werden sollen ... sonst bräuchte man ja auch keine RGB-LEDs :wink:

MfG

postmaster, das haben uns doch combie und doc gerade eben gezeigt, dass das noch eleganter geht.
Ich probiere mal.
Strip hab ich keinen drann, aber die Serial.Ausgabe schaut gut aus:

#include <Adafruit_NeoPixel.h>
#define PIN 3
Adafruit_NeoPixel strip = Adafruit_NeoPixel(48, PIN, NEO_GRB + NEO_KHZ800);


const byte Eins[3] = {1, 2, 3};
const byte Zwei[4] = {6, 7, 8, 9};
void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  Serial.begin(115200);
}

void loop() {
  for (auto &currentLed : Eins) {               // for each auf c++ ... gem. https://forum.arduino.cc/index.php?topic=553441.30
    Serial.println(currentLed);                 // currentLed zeigt nun direkt auf den jeweiligen Array-Index
    strip.setPixelColor(currentLed, 0, 255, 0);
    delay(50);
    strip.show();
  }
  for (byte t = 0; t < 4; t++) {
    Serial.print(t); Serial.print(F(": ")); Serial.println (Zwei[t]);
    strip.setPixelColor(Zwei[t], 255, 0, 0);
    delay(50);
  }
  strip.show();
}