[Gelöst] Probleme mit Neopixel und Schleifenprograrung in Funktionen

Hallo zusammen,

ich baue gerate einen neuen PC und möchte die Farbe zwischen Motherboard und dem Geäuse synchron haben. Im Gehäuse habe ich 2,5m WS2812 Strips und LEDs verbaut. Mein Motherboard bietet einen normalen 12V RGB Ausgang.

Deshalb möchte ich einen Arduino Uno zur Steuerung der Neopixel einsetzen. Leider liegen meine Programmierkenntinisse 15 Jahre zurück und sind etwas eingerostet, aber noch ein bischen vorhanden :slight_smile:

Nun zu meinem Problem, ich möchte eine Funktion schreiben (OUT_Alle_Farbe), welche alle 7 Strips auf eine durch die AD Eingänge definierte Farbe setzt. Nun komme ich aber bei dem Befehl stripe_x.setPixelColor nicht weiter. Wie ersetzte ich x durch eine Zahl von 1-7 ?

Über eure Hilfe würde ich mich sehr freuen. Für sonstige Anregungen bezüglich des Code bin ich natürlich auch dankbar.

Grüße

Marc

V0.2.ino (2.01 KB)

ulmerspatz:
... Nun komme ich aber bei dem Befehl stripe_x.setPixelColor nicht weiter. Wie ersetzte ich x durch eine Zahl von 1-7 ?

Welches x? In

void OUT_Alle_Farbe()

sehe ich zwar Fragezeichen, aber weit und breit kein x.

Gruß

Gregor

PS: Uh, ich glaube ich weiß jetzt, was Du meinst. Mein Senf dazu: Benutze eine Feldvariable (Array), deren Elemente vom Typ „Adafruit_NeoPixel“ sind. Wenn Du dieses Array hast, kannst Du die einzelnen Streifen über einen Index (Zählvariable) ansprechen.

Ungefähr so:

Adafruit_NeoPixel strips[8]=
{ Adafruit_NeoPixel(Anzahl_1, PIN_1, NEO_GRB + NEO_KHZ800),
  ...
  Adafruit_NeoPixel(Anzahl_8, PIN_8, NEO_GRB + NEO_KHZ800)
}

// In einer Schleife kannst Du dann z. B. so ...

strips[i].setPixelColor(...)

// ... jeden Streifen einzeln ansprechen.

Nachtrag: Bei Arrays musst Du beachten, dass Du beim Anlegen zwar angibst, wie viele Elemente es geben soll (acht), beim Ansprechen über einen Index aber bei 0 anfangen musst. Da gibt es dann nicht die Elemente von 1-8, sondern von 0-7

Schaue mal auf die Seite >KLICK< (FastLED) da gibt es sogar so etwas schon in den Beispielen wenn ich dich richtig verstanden.
Die FastLED Lib ist auch besser zu verstehen und dokumentiert als die NEOPixel Lib

Gruß
DerDani

Vielen Dank gregorss.

Habe es nochmal Formhalber in der (hoffentlich) funktinierenden Version angehängt. Werde morgen Testen ob es klappt.

Grüße

V0.5.ino (2.16 KB)

Die Anzahl der Pixel brauchst du nicht extra zu verwalten. Die kannst du einfach aus dem Objekt mit numPixels() auslesen.

Und wenn das nicht der Fall wäre, würde man besser die Anzahl und das Objekt in einem struct zusammenfassen

Das heißt, ich trage die Anzahl "hart" im stripe Array ein?

Die Anzahl der LEDs pro Strip ist doch der erste Parameter im Adafruit_NeoPixel Konstruktor. Danach steht das im Objekt drin und kann wieder ausgelesen werden

Danke an alle für die Hilfe. Funktioniert einwandfrei.

V0.6.ino (2.18 KB)

Es gibt einen einfachen Weg die Anzahl der Elemente in einem Array zu berechnen:

const int STRIP_ANZAHL = sizeof(strip) / sizeof(strip[0]);

Man dividiert die Größe des Arrays (in Bytes) durch die Größe eines Elements.

Wenn du dann die Größe nicht angibst, sondern vom Compiler anhand der Elemente bestimmen lässt:

Adafruit_NeoPixel strip[] = { ... };

…passt sich das automatisch an. Also erst so das Array festlegen. Das wird dann so groß wie es sein muss. Und danach die Größe ausrechnen lassen damit man den Wert für andere Programm-Teile hat.

Geht natürlich auch so wie du. Aber dann solltest du wenigstens das machen:

const int STRIP_ANZAHL = 8;

Adafruit_NeoPixel strip[STRIP_ANZAHL] = { .... };

ich komme schon noch auf V1.0 :slight_smile:

ich verstehe nicht für was ich: “Adafruit_NeoPixel strip = { … };” brauche.

Es funktioniert mit dem ersetzten von

int Strip_Anzahl = 8;

durch

const int Strip_Anzahl = sizeof(strip) / sizeof(strip[0]);

V0.7.ino (2.24 KB)

und noch die finale Version mit Lauflicht bei RGB Eingängen auf Rot, Blau, Grün oder Weiß mit der jeweils passenden Farbe.

Sobald alles fertig ist, verlinke ich ein Video

V1.2.ino (3.26 KB)

ulmerspatz:
ich verstehe nicht für was ich: "Adafruit_NeoPixel strip = { ... };" brauche.

Das ... ist natürlich Pseudo-Code. Irgendwo musst du das Array ja erstellen. Es geht hier darum dass du beim Verwenden der geschweiften Klammern die Größe nicht angeben musst. Beachte dass da keine Zahl in der Klammer steht. Der Compiler kann diese aus der Anzahl der Elemente ablesen.

Das ist vor allem praktisch wenn man Code ändert oder erweitert. Dann kann man die Anzahl der Elemente des Arrays ändern und der Rest passt sich automatisch an. So kann es nicht passieren dass man vergisst auch die Konstante für die Größe zu ändern.

ulmerspatz:
Sobald alles fertig ist, verlinke ich ein Video

Au ja! Tu das am besten im „Zeigt her eure geilen Projekte“-Thread. Siehe hier.

Gruß

Gregor