APA102 & WS2811 - LED einzeln ansteuern

Hallo,
ich habe mich mal ein wenig schlau gelesen und einige Sketche studiert.
Das ist schon eine nicht einfache Geschichte.

Ich habe die Beispiele aus der Lib "Apa102" und aus der Lib "FastLED" mal
versucht zu verstehen- und mich beschleicht hier ein böses Gefühl…

Wie steuert man denn eine einzelne LED an? Ist das überhaupt möglich?
Ein Beispiel dafür habe ich nicht finden können.

Ich habe ein Band mit 10 LED´s. Nun soll nur die dritte zu 75% leuchten.
Gleiches Band, nur die dritte (75%) und die siebte (50%) soll leuchten.
Hat da mal jemand ein Beispiel für?

Ist es überhaupt möglich die Leuchstärke für jede LED einzeln zu setzen?
Also 10-Band, Leuchstärke (10, 25, 50, 70, 30, 5, 80, 10, 35, 15)
Gruß und Dank
Andreas

hi,

klar ist das möglich, aber es sind mehr werte, weil Du ja eigentlich 30 LEDs hast.

es gibt ein array, in dem Du die werte füe jede LED setzen kannst, mit show wird das dann rausgeschossen. wenn Du den wert für eine einzelne LED im array nicht änderst, wird eben der unveränderte wert wieder rausgeschickt.

gruß stefan

EDIT: ich nehme mal an, Du hast RGB-LEDs.

Das array ist ein zweidimensionales, also ein array[3] für jede RGB-LED in einem array, das so groß ist, wie Du RGB-LEDs hast.

bei FastLED gibt es das beispiel Blink, da wird nur eine LED verändert. die variablen RED und BLACK sind vordefinierte werte. RED (255, 0, 0). BLACK (0, 0, 0).

Hallo,
mal ganz langsam, ich habe Array gerade vor kurzem "begriffen"

Du sagst es ist ein zweidimensionales Array.
Die Sketche fragen alle die Anzahl der LED´s ab. Sagen wir 10 Stck

D.h. es wird ein Array mit Index 10 erzeugt?
Also Index 2 wäre dann die 3. LED?
Hinter diesem Index stehen dann die Werte für die 3. LED?

Könnte Sinn machen, so würde man jede LED zufassen bekommen.
Wenn dem so ist, dann bekomme ich das selbst hin.

Das würde aber auch bedeuten, das die Anzahl der LED´s vom Speicher des
Arduino abhängt? Nur so am Rande.
Gruß und Dank
Andreas

hi,

von der FastLED wird automatisch ein array CRGB[3] typisiert (nicht erstellt, nur als "variablentyp" definiert).

wenn Du jetzt ein solches array erstellst, mit:

CRGB eineLED;

könntest Du sagen:

eineLED = (255, 255, 0);

eine einzelne LED macht natürlich wenig sinn, deshalb erstellt man ein array aus CRGBs mit

CRGB leds[NUM_LEDS];

wobei NUM_LEDS die anzahl Deiner RGB-LEDs ist. das array hat (bei 10) dann 10 RGB-LEDs mit je einem CRGB für drei farben. braucht also 30 byte. und ja, die anzahl der möglichen LEDs ist durch die speichergröße (RAM) beschränkt.

für die erste LED schreibst Du dann:

leds[0] = (255, 134, 56);

für die fünfte

leds[4] = (0, 234, 67); usw.

rausgeschrieben wird dann für alle LEDs auf einmal mit show().

gruß stefan

Hallo Stefan,
das ist ja mal ne´ Hausnummer…
Da kann ich richtig was mit anfangen, dann ist das überhaupt kein Hexenwerk.
Ist im Grunde also ganz "einfach".

Dann wird leds[4] = (0, 234, 67); das erste mal geschrieben und alle LED´s
machen was.
Dann wird leds[4] = (0, 100, 67); das zweite mal geschrieben und alle LED´s
machen was- und NUR LED 5 macht jetzt etwas anderes.
Ha!!
Danke schön! Ein Fettes!
Gruß und Spaß
Andreas

Dir auch viel spaß und frag' bei unklarheiten einfach nach.

bei den WS2812 zwischen arduino und DATA einen 100er widerstand nicht vergessen, sonst ist die erste LED bald tot.

falls Du noch welche kaufst: APA sind besser und schneller zu kontrollieren und manche sagen, die farben sind schöner. aber weil sie neuer sind, halt auch teurer.

gruß stefan

Hallo,
wie hole ich mir denn einen "FarbWert" mit lcd.print(FarbWert) auf das
Display zurück?

FastLED kann HTMLColorCode. Wenn ich jetzt eine Farbe setze:

leds = CRGB::WhiteSmoke;
Dann leuchtet die LED in der selben.
Hier ist der "FarbWert" jetzt "WhiteSmoke"
Jetzt möchte ich mit lcd.print(FarbWert) dieses "WhiteSmoke" ausgeben, aber
für "Farbwert" finde ich keinen Ausdruck.
Für RGB gibt es z.B. etwas: lcd.print(leds[0].r)
Gruß und Dank
Andreas

Grundsätzlich repräsentiert ein CRGB einen 24 Bit Farbwert (8 Bit pro Grundfarbe).

Die Sache mit der Farbtabelle ermöglicht es einem, einfach "WhiteSmoke" zu schreiben, wenn man eigentlich 0xF5F5F5 meint.

Wenn Du den Inhalt eines CRGBs "interpretieren" (also Zahlen in Worte übersetzen) möchtest, musst Du dass selbst schreiben, z.B. wenn die 3 RGB Werte identisch sind, ist es ein grau. Je kleiner, desto dunkler/schwarz. Je höher, umso heller/weiß.

Grüße,

Helmuth

Hallo Helmuth,
das ist mir schon klar.
Mit dem Syntax "leds[0] = CRGB::Red;" oder leds[0] = CRGB (255, 0, 0) setze
ich die Farbe der LED auf "Rot"

Mit dem Syntax "leds[0].r oder leds[0].g oder leds[0].b" kann ich den Wert
abfragen.
Also mit dem Syntax ".r oder .g oder .b" wird mir der RGB-Wert zurück gegeben.
lcd.print(leds[0].r)
lcd.print(leds[0].g)
lcd.print(leds[0].b)

gibt auf dem Display:
255
0
0

Es ist ja gut möglich , das es einen Syntax ".x" gibt, der "Red" zurück gibt.
Gruß und Dank
Andreas

Also mit dem Syntax ".r oder .g oder .b" wird mir der RGB-Wert zurück gegeben.

Damit bekommst Du die uint8_t (byte) Werte der Rot-, Grün- und Blauanteile geliefert (bzw. kannst sie genau so auch einzeln zuweisen).

lcd.print(leds[0].r)
lcd.print(leds[0].r)
lcd.print(leds[0].r)

gibt auf dem Display:
255
0
0

Wenn Du 3 mal leds[0].r ausgibst, sollte 3 mal der gleiche Wert angezeigt werden...

Es ist ja gut möglich , das es einen Syntax ".x" gibt, der "Red" zurück gibt.

Nee, gibt es nicht. Du müsstest das wirklich basierend auf der verlinkten Tabelle selbst schreiben.

...switch...case...0xF5F5F5: colorname = "WhiteSmoke"... usw.

Grüße,

Helmuth

hi,

RED ist ja ein variablenname, und ich wüßte nicht, wie man einen variablennamen in ein print bekommt. und eine tabelle anzulegen, mit der man vergleicht, naja...

gruß, stefan

Auch hi,

und eine tabelle anzulegen, mit der man vergleicht, naja...

ist natürlich nicht schön, aber mir fällt nix anderes ein.

Immer noch einfacher, als eine Analyse des Mischungsverhältnisses, wo dann z.B. sowas wie "bright blueish desaturated cyan" raukommen würde, wenn viel blau, weniger grün und ein bisschen rot drin wäre...

Grüße!

Hallo,
"Wenn Du 3 mal leds[0].r ausgibst, sollte 3 mal der gleiche Wert"

Jaa, habe ich geändert.

"variablennamen in ein print bekommt"
Da gibt es mit Sicherheit etwas, ich bin aber noch nicht dahinter…

Die Namen sind ja in der Lib hinterlegt.
"WhiteSmoke" ist für mich ja kein Variablename, es ist ein Wert- dem ich einer
Variable (x) zuteile.
Ist x = WhiteSmoke, dann leuchte in WhiteSmoke
Ist x = WhiteSmole, dann leuchte nicht, gib Fehler aus

dann müßte möglich sein-
welchen Wert hat x ? Gib mir x zurück

denke ich mir so… hätte ja sein können.
Gruß und Dank
Andreas

ist natürlich nicht schön, aber mir fällt nix anderes ein.

mir ja auch nicht. war keine kritik, ich hab', wie ich das geschrieben habe, Deinen post noch garnicht gelesen.

"WhiteSmoke" ist für mich ja kein Variablename, es ist ein Wert- dem ich einer
Variable (x) zuteile.
Ist x = WhiteSmoke, dann leuchte in WhiteSmoke
Ist x = WhiteSmole, dann leuchte nicht, gib Fehler aus

dann müßte möglich sein-
welchen Wert hat x ? Gib mir x zurück

WhiteSmoke IST kein wert, sondern eine variable mit dem namen WhiteSmoke und sie HAT den wert 0x654321.

diesen wert kannst Du Dir auch ausgeben lassen. mit print(CRGB::WhiteSmoke); liefert er Dir den wert 0x654321.

mit leds[0] = CRGB::WhiteSmoke; bekommt das CRGB leds[0] den wert vom CRBG WhiteSmoke. einfacheres beispiel:

a = 5;
b = 7;
c = 5;

d = a;

dann ist d nicht a, sondern 5, und Du wirst aus d nicht rausbekommen, daß es a ist. das geht nur mit vergleichen, im obigen fall könnte es aber auch

d = c;

gewesen sein, das wirst Du nie wieder rauskriegen...

gruß stefan

WhiteSmoke IST kein wert, sondern eine variable mit dem namen WhiteSmoke und sie HAT den wert 0x654321.

Ich würde eher sagen, es ist eine Konstante.
(ohne in die Lib gesehen zu haben)

Aber auch wie bei Variablen geht die Auflösung nur in eine Richtung:
Über den Bezeichner kommt man zum Wert.
Aber nicht anders rum.
Vom Wert gibts keinen Weg zum Bezeichner.

Wenn du das willst, sind Klimmzüge angesagt.

hi,

Ich würde eher sagen, es ist eine Konstante.

klar, da hast Du schon recht. aber bei mir kommt der ausdruck variable aus der mathematik ins hirn. und bei:

c = a + b

sind a, b, und c klarerweise variable. wenn man dann aber gesagt hat a = 5, hat man nicht plötzlich von konstanten gesprochen, sondern "die variable a ist 5".

drum sind "bei mir" konstanten nur sonderfälle von variablen.

wenn Du zwei leuten sagst: ein quadrat ist ein parallelogramm, wird einer sagen "klar" und der andere "blödsinn"...

gruß, stefan

Hallo,
ich habe mich noch einmal "schlau gelesen"…
Die Farben sind in einem "enum" hinterlegt. Also keine "Struktur"-
wohl nicht ran zu kommen.
Gruß und Dank
Andreas

Ja, ich bin da vielleicht ein wenig pingelig....

Aber einen Trost habe ich ja:
:wink: Der Compiler ist da noch pingeliger! :wink:

Die Farben sind in einem "enum" hinterlegt. Also keine "Struktur"-

Das fällt in den Bereich: Konstant(en)