Was soll der Code machen?
Die Funktion setPWM() erwartet 4 Parameter.
Der erste ist die ID der RGB Leiste (1-18), die nächsten drei die
Helligkeit der einzelnen Farben von 0-9.
So kann in dem Array ein "komplexes" Lauflicht programmiert werden.
Was macht der Code?
Nix, der Compiler (ArduinoIDE) meckert schon bei dem Array:
too many initializers for 'const uint8_t [2] {aka const unsigned char
[2]}'
Dabei habe ich doch nur ein funktionierendes Array erweitert.
Könnte mir da jemand helfen?
So passt zumindest das Array :-)
Johannes S. schrieb:> und substrings auf ein uint8_t geht auch nicht so wie du möchtest.
Stimmt!
Verstehe ich jetzt auch.
Muss ich die Zahl jetzt erst in ein String wandeln,
oder kann ich die "010" auch als Integer zerlegen?
Modulo fällt ja wegen der führenden Nullen weg...
Danke schomal
Johannes S. schrieb:> Vorschlag: Array von Strukturelementen benutzen.
Das ist mir leider nicht anschaulich genug.
Aber prinzipiell verstehe ich , was du meinst.
Für das einfachere programmieren des Lichteffektes hätte ich gerne jeden
Frame in einer Zeile.
Sollte ja auch funktionieren, wenn ich nur die "010" in R=0, G=1, B=0
zerlegt bekommen würde.
Aber auch dir danke für die Idee!
So werden die 3 Ziffern auseinander gedröselt und einzeln übergeben. Das
ist allerdings ziemlich ineffizient, weil die meisten Prozessoren solche
Divisionen nicht direkt können. Effizienter wäre z.B. so:
Divisionen/Modulo mit 2-erPotenzen werden als Bits-Operationen
kompiliert und sind viel schneller. Dazu werden die Zahlen hexadezimal
definiert. Außerdem sollte man den Typ des Arrays als uint16_t
definieren, damit er nicht unnötig groß ist (int kann z.B. auch 32bit
groß sein, obwohl die Zahl nie größer 4095 wird), und um negative Zahlen
ganz auszuschließen. Du könntest due setPWM Funktion so umbauen dass sie
Zahlen von 0-15 nimmt; dann hast du gleich eine höhere Auflösung. Auf
Computern im 10er-System zu rechnen ist generell nicht so optimal.
Alternativ kann man die 3 Farbwerte in 3 einzelne uint8_t packen, das
braucht aber 50% mehr Speicher.
Warum speicherst du überhaupt zig mal die gleichen Werte im Array? Das
ist sinnlos...
Als Schleifenzähler (i, j) sollte man size_t nehmen, weil dies
vorzeichenlos ist und auf allen Plattformen groß genug für alle Arrays;
"int" kann z.B. auf AMD64 zu klein sein.
Kolja L. schrieb:> Das ist mir leider nicht anschaulich genug.> Aber prinzipiell verstehe ich , was du meinst.
Mit den Strukturelementen kann R,G, und B jeweils 0...255 sein. Man kann
das auch in einen Hexadezimalwert schreiben, dann wäre es z.B.
0xiirrggbb kodiert. Dann kann ii der Stripindex sein und der Rest die
Farbwerte. Kommt aufs gleiche raus, aber mit der Struktur ist der
Zugriff besser lesbar, aus dem uint32_t musst die Element maskieren und
schieben, für rr z.B. ((value & 0x00ff0000) >> 16;
Dr. Sommer schrieb:> uint16_t lauflicht[6][18] = {> {0x100, 0x100, 0x100 ...},> {0x010, 0x010, 0x010, ...},> ...> };
Das möchte ich, auch wenn es vielleicht albern ist,
der Übersichtlichkeit wegen nicht verwenden.
Dr. Sommer schrieb:> setPWM(j, lauflicht[i][j] / 100, (lauflicht[i][j] / 10) % 10,> lauflicht[i][j] % 10);
Wenn das funktionieren würde, ware ja super!
Leider gibt dieser Code:
Dr. Sommer schrieb:> Kolja L. schrieb:>> Modulo fällt ja wegen der führenden Nullen weg...>> Wieso, dann wird halt 0 übergeben:
Dann habe ich das falsch verstanden?
Dr. Sommer schrieb:> Könnte vielleicht daran liegen, dass die Indices des äußeren> Arrays 0-1> sind, und du 1-2 iterierst... Lies doch mal ein Buch über C.
Danke, Tippfehler, sorry.
Ändert aber auch nichts.