Verständnisfrage zu Neo-Pixel

Hallo allerseits,

in Programmen zur Neo-Ansteuerung sind mir drei verschiedene Schreibweisen über den Weg gelaufen:

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, 6, NEO_RGB + NEO_KHZ800);
strip.show();

Adafruit_NeoPixel px = Adafruit_NeoPixel(NUMPX, PIN, NEO_GRB + NEO_KHZ800);
px.show();

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(60, 6, NEO_RGB + NEO_KHZ800);
pixels.show();

Es geht mir hier um strip, px und pixels.

M.f.G.

Hans-Ulrich

Das ist eine Namensfestlegung, die du selbst bestimmen kannst.

Du musst nur innerhalb deines Programms auf den festgelegten Name zugreifen, wie z.B. "name.show()".

Hallo Dieter,

danke für die Info. Wieder was gelernt.

M.f.G.

Hans-Ulrich

NEO_RGB bzw NEO_GRB gibt dei Reihenfölge der Daten für die 3 Grundfarben an.
Nicht alle LEDs mit integrierten Kontroller haben die gleiche Reihenfolge der Daten für die 3 Farben, bzw es gibt welche mit 4 Farben (RGB und Weis)

Grüße Uwe

Ich finde erstaunlich dass fast überall diese geschwätzige Initialisierung benutzt wird,
die nur wegen Compiler Optimierung nicht zu einem Erzeugen / Kopieren / Zerstören der Kopiequelle führt.

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, 6, NEO_RGB + NEO_KHZ800);

warum nicht einfach

Adafruit_NeoPixel strip(60, 6, NEO_RGB + NEO_KHZ800);

?

Hallo Whandall,

Ich finde erstaunlich dass fast überall diese geschwätzige Initialisierung benutzt wird,
die nur wegen Compiler Optimierung nicht zu einem Erzeugen / Kopieren / Zerstören der Kopiequelle führt.

Könntest du das bitte etwas ausführlicher erklären?

M.f.G.

Hans-Ulrich

Whandall:
Ich finde erstaunlich dass fast überall diese geschwätzige Initialisierung benutzt wird,
die nur wegen Compiler Optimierung nicht zu einem Erzeugen / Kopieren / Zerstören der Kopiequelle führt.

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, 6, NEO_RGB + NEO_KHZ800);

warum nicht einfach

Adafruit_NeoPixel strip(60, 6, NEO_RGB + NEO_KHZ800);

?

Das ist doch extra für die anfänger so ? Damit sie es besser Lesen/zu-ordnen können ?

oder gibt es einen vorteil wen man es verkürzt schreibt? viel code zeilen sparrt man sich ja nicht :smiley:

Noch ausführlicher kann ich das nicht.

Der Unterschied in den beiden Initialisierungsmethoden ist doch offensichtlich.

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, 6, NEO_RGB + NEO_KHZ800);
Adafruit_NeoPixel strip(60, 6, NEO_RGB + NEO_KHZ800);

Warum ein " = Adafruit_NeoPixel" mehr tippen, damit der Kompiler diese Anweisungen* wegoptimieren kann?

*

  • Konstruktion eines anonymen Objekts
  • Kopieren diese Objekts in ein benanntes
  • Zerstören des anonymen Objekt
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, 6, NEO_RGB + NEO_KHZ800)

Wer findet das einfacher zu lesen? Ich nicht.

Der erzeugte Kode sollte in beiden Fällen gleich sein,
das hängt aber möglicherweise von den Optimierungseinstellungen des Kompilers ab.

Whandall:
Noch ausführlicher kann ich das nicht.

Der Unterschied in den beiden Initialisierungsmethoden ist doch offensichtlich.

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, 6, NEO_RGB + NEO_KHZ800);

Adafruit_NeoPixel strip(60, 6, NEO_RGB + NEO_KHZ800);



Warum ein " = Adafruit_NeoPixel" **mehr** tippen, damit der Kompiler diese Anweisungen<sup>__*__</sup> wegoptimieren kann?

Ok ja stimmt :slight_smile: So wie es dort steht.. Ich habe es noch auführlicher deklariert zum wieder weg compiliert werden :smiley: LOL

Also die Pin zu ordnung braucht es aber trozdem noch seperat oder ist das auch gleich geschehen mit der direkt zuweisung wie in deinem Beispiel?`

const int PIN_LED= 6; // LED =Pin 6
#define NUM_LEDS 16 //16 ws2812 LEDS conected
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(NUM_LEDS, PIN_LED, NEO_RGB + NEO_KHZ800);

würde ausreichen?ohne int und define?

Adafruit_NeoPixel strip1(16, 6, NEO_RGB + NEO_KHZ800);
const int PIN_LED= 6; // LED =Pin 6
#define NUM_LEDS 16 //16 ws2812 LEDS conected

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(NUM_LEDS, PIN_LED, NEO_RGB + NEO_KHZ800);

Warum kommentierst du das Offensichtliche?
Warum einen const int für ein klares const byte?
Warum benutzt du Namen aus nur Großbuchstaben und Unterstrichen für den konstanten Wert?
Üblicherweise ist das die Namenskonvention für #define Bezeichner.

Defines und benannte Konstanten bringen dir Vorteile (im Falle von Änderungen z.B.),
speziell wenn die Zahlen/Texte an mehreren Stellen benutzt werden.

const byte ledPin = 6;
const byte ledAnzahl = 16;

Adafruit_NeoPixel strip1(ledAnzahl, ledPin, NEO_RGB + NEO_KHZ800);

Ich empfinde meine Variante als besser lesbar.

Hallo allerseits,

auch wenn ich nicht in alle Punkten folgen konnte (war für jemanden der sich in dieses Gebiet einarbeiten will, nicht immer verständlich), habe ich jetzt in meinem Programm die Zeile :

Adafruit_NeoPixel strip = Adafruit_NeoPixel( 60, 6, NEO_RGB + NEO_KHZ800);

gegen

Adafruit_NeoPixel strip(60, 6, NEO_RGB + NEO_KHZ800);

ausgetauscht, mit dem Ergebnis, das es problemlos übersetzt wurde und auch lief.

Vielleicht erbarmt sich ja doch noch mal jemand . . .

M.f.G.

Hans-Ulrich

Whandall:

Ich empfinde meine Variante als besser lesbar.

ja das gebe ich dir recht, werde ich wohl auch so machen. Danke :slight_smile:

Warum aber ist vom Hersteller in der Adafruit überguide PDF immer so geschrieben?

Adafruit_NeoPixel strip_a = Adafruit_NeoPixel(16, 5);
Adafruit_NeoPixel strip_b = Adafruit_NeoPixel(16, 6);

anstatt gekürzt:

Adafruit_NeoPixel strip_a(16, 5);
Adafruit_NeoPixel strip_bl(16, 6);

Hat es wirklich keine Auswirkungen?
Negative...

werde es gleich mal Testen :slight_smile: Ich glaube dir natürlich das es so funktioniert, nur die Frage Warum der Hersteller nie so schreibt ?

Hans_Ulrich:
Hallo allerseits,

auch wenn ich nicht in alle Punkten folgen konnte (war für jemanden der sich in dieses Gebiet einarbeiten will, nicht immer verständlich), habe ich jetzt in meinem Programm die Zeile :

Adafruit_NeoPixel strip = Adafruit_NeoPixel( 5, 6, NEO_RGB + NEO_KHZ800);

gegen

Adafruit_NeoPixel strip(60, 6, NEO_RGB + NEO_KHZ800);

du kannst es schreiben wie es dir gefällt :wink:

es gibt mehrere Schreibweisen schöner oder un-schöner :smiley: funktionieren tun alle

in Programmen zur Neo-Ansteuerung sind mir drei verschiedene Schreibweisen über den Weg gelaufen:

Alle drei Varianten sind falsch.
Die richtige habe ich eben schon genannt!
Aber gerne nochmal:
Falsch: NEO_RGB
Falsch: NEO_GRB
Falsch: NEO_PTYPE
Richtig: NEO_RGBW
Angekommen?

Sorry. gerade den Thread verwechselt!

combie:
Alle drei Varianten sind falsch.

Die richtige habe ich eben schon genannt!

Aber gerne nochmal:
Falsch: NEO_RGB
Falsch: NEO_GRB
Falsch: NEO_PTYPE

Richtig: NEO_RGBW

Angekommen?

ja oder auch:
Richtig: NEO_GRBW

For RGBW LEDs use NEO_RGBW (some RGBW strips use NEO_GRBW, so try that if you're getting unexpected results!)

ja oder auch:
Richtig: NEO_GRBW

Durchaus!

Aber:
Sorry. gerade den Thread verwechselt!

combie:
Durchaus!

Aber:
Sorry. gerade den Thread verwechselt!

Ist mir vorhin auch passiert :stuck_out_tongue: wie bei dir :smiley:

Akropolis:
Warum aber ist vom Hersteller in der Adafruit überguide PDF immer so geschrieben?

Wie soll ich dir erklären, warum jemand etwas macht, das ich nicht nachvollziehen kann?

Denkbar wären:

  • die bekommen mehr Geld wenn sie häufiger Adafruit schreiben
  • irgendjemand hat damit angefangen und keiner traut sich es nun anders zu machen
  • die kochen auch nur mit Wasser
    Warum antwortest du auf meine Fragen nicht?

Whandall:
Warum kommentierst du das Offensichtliche?
Warum einen const int für ein klares const byte?
Warum benutzt du Namen aus nur Großbuchstaben und Unterstrichen für den konstanten Wert?

Whandall:
Warum antwortest du auf meine Fragen nicht?

"Warum kommentierst du das Offensichtliche?"

Hatte ich so mal übernommen aus einem code und weil bis jetzt mich noch nie jemand darauf aufmerksam gemacht hatte. :slight_smile: jetzt habe ich was dazu gelernt :wink: Danke.

"Warum einen const int für ein klares const byte? "

wusste ich nicht, es lief ohne probleme :smiley:

sehe jetzt das int falsch ist.

"Warum benutzt du Namen aus nur Großbuchstaben und Unterstrichen für den konstanten Wert?"

Ich dachte unterstriche sind erlaubt als abstandshalter? muss es zusammen gecshrieben werden? Sind Grossbuchstaben verboten oder schlecht für Compiler? Oder nur um übersichtlicher da zu stehen?

Ok ja klar liesst es sich so besser.

const byte ledPin = 6;
const byte ledAnzahl = 16;

Adafruit_NeoPixel strip1(ledAnzahl, ledPin, NEO_RGB + NEO_KHZ800);

und auf deine weise gekürzt...

[/code]

Adafruit_NeoPixel strip1(16, 6, NEO_RGB + NEO_KHZ800);

[/code]

aber wie sage ich dem Compiler Pin 6 als const byte?
wen ich alles in einer Zeile schreibe nimmt er sie als #Define?

das verstehe ich gerade nicht

so?

const byte Pin = 6;

Adafruit_NeoPixel strip1(16, 6, NEO_RGB + NEO_KHZ800);

in der adafruit überguide wird immer nur mit #define PIN 6 gearbeitet
auf andere sachen gehen die nicht ein. Sie schreiben aber, gerade gelesen Die schreibweise muss nicht wie ihre sein. es sei einfacher im späteren einen Pin Change vor zu nehmen ohne tiefer in den Code zu müssen. Das verstehe ich aber nicht wie die das meinen...

Zu Variablengröße:

Auf diesen kleinen Microcontrollern stehen nur sehr begrenzte Resourcen zur Verfügung,
da kann es auf Bytes ankommen, man sollte grundsätzlich keine Resourcen verschwenden.

Zu den Namen:

Dem Kompiler ist es völlig egal wie du deine Namen wählst,
es geht um Menschen die den Kode verstehen sollen/wollen, ohne in ihn eingearbeitet zu sein.
Zu denen gehörst auch du in ein paar Wochen. :wink:

Angenehm zu lesen ist Kode mit sprechenden Namen, die gleichmäßig aufgebaut sind*,
und mit Dokumentation an den Stellen wo etwas passiert das nicht offensichtlich ist.
Eine konsistente Formatierung des Kodes setzte ich mal selbstverständlich voraus.

*Beliebte Formate für Namen sind

GrossGross für Objekte
kleinGross für Variablen, Functionen, etc
NUR_GROSS_MIT_UNTERSTRICH für #defines

Es ist ein klein wenig Type Information, die einem das Verstehen erleichtert.
Unterstriche sind erlaubt und werden auch von vielen benutzt, ist Geschmacksache.

Welche Art von Benennungsschema man jetzt für sich aussucht ist auch Geschmacksache,
man tut aber sich einen Gefallen, wenn man das gleichmäßig macht.

Ich persönlich empfinde Worte nur aus Großbuchstaben als GESCHREI, bin also ganz froh,
daß man das immer seltener sieht.

Akropolis:
Ok ja klar liesst es sich so besser.

const byte ledPin = 6;

const byte ledAnzahl = 16;

Adafruit_NeoPixel strip1(ledAnzahl, ledPin, NEO_RGB + NEO_KHZ800);





und auf deine weise gekürzt...

[/code]

Adafruit_NeoPixel strip1(16, 6, NEO_RGB + NEO_KHZ800);

[/code]

aber wie sage ich dem Compiler Pin 6 als const byte? 
wen ich alles in einer Zeile schreibe nimmt er sie als #Define?

das verstehe ich gerade nicht

so?



const byte Pin = 6;

Adafruit_NeoPixel strip1(16, 6, NEO_RGB + NEO_KHZ800);

Das verstehst du miss.

'Auf meine Weise gekürzt' bezieht sich nicht auf die konstanten Parametern des Konstruktors,
sondern auf das Entfernen des " = Adafruit_NeoPixel" und kam in meinen Kode nicht vor.

Es befand sich in meiner Eingangsfrage, weil es Bestandteil der zitierten Kodezeile war.

in der adafruit überguide wird immer nur mit #define PIN 6 gearbeitet
auf andere sachen gehen die nicht ein. Sie schreiben aber, gerade gelesen Die schreibweise muss nicht wie ihre sein. es sei einfacher im späteren einen Pin Change vor zu nehmen ohne tiefer in den Code zu müssen. Das verstehe ich aber nicht wie die das meinen...

Wie du die Parameter der Funktion erzeugst, ist völlig egal.
Wenn der Wert nur an einer Stelle auftaucht ist es auch völlig egal.
Wenn du allerdings ein paar Stellen hast, an den du z.B. die Anzahl der Leds verwenden willst,
ist es schon praktischer nur das eine #define oder die Definition der Konstanten zu ändern.