NEO-Pixel

Hallo agmue,

Außerdem lade ich mir ungern eine zip-Datei auf meinen Rechner

Beim Laden kann doch noch nichts passieren. Öffnen tue ich solche Dateien mit dem "Speed Commander".
Da kann ich in das Paket rein sehen, ohne es zu entpacken. Dann hole ich mir die Dateien raus, die ich haben möchte. Aber, es führen viele Wege nach Rom . . .

Die Datei ungepackt: regenbogen.ino

Die zip hat den Vorteil, dass man gleich das entsprechende Verzeichnis mit senden kann.

M.f.G.

Hans-Ulrich

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

So ist es noch einfacher, dann erhältst Du auch Hilfe von den Smart-Nutzern:

#include <Adafruit_NeoPixel.h>

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

long f00 = strip.Color(0, 0, 0); long f01 = strip.Color (255, 0, 0); long f02 = strip.Color(218, 37, 0); long f03 = strip.Color (187, 68, 0); long f04 = strip.Color(157, 98, 0);
long f05 = strip.Color(128, 128, 0); long f06 = strip.Color(98, 156, 0); long f07 = strip.Color(0, 255, 0); long f08 = strip.Color(0, 197, 56); long f09 = strip.Color(0, 58, 196);
long f10 = strip.Color(38, 29, 196); long f11 = strip.Color(72, 0, 183); long f12 = strip.Color(96, 0, 159); long f13 = strip.Color(120, 0, 135); long fw0 = strip.Color(255, 255, 255);
int zw1 = 0; int zw2 = 0; int zw3 = 0; int zw4 = 0;
long farbe01 = 0; long farbe02 = 0;

long regen [7][13] = {
  {f00, f00, f00, f00, f00, f00, f07 , f00, f00, f00, f00, f00, f00},
  {f00, f00, f00, f00, f00, f01, f07 , f13, f00, f00, f00, f00, f00},
  {f00, f00, f00, f00, f01, f02, f07 , f12, f13, f00, f00, f00, f00},
  {f00, f00, f00, f01, f02, f03, f07 , f11, f12, f13, f00, f00, f00},
  {f00, f00, f01, f02, f03, f04, f07 , f10, f11, f12, f13, f00, f00},
  {f00, f01, f02, f03, f04, f05, f07 , f09, f10, f11, f12, f13, f00},
  {f01, f02, f03, f04, f05, f06, f07 , f08, f09, f10, f11, f12, f13}
};

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  //strip.setBrightness(125); strip.show();
  
}
void loop() {
  delay(2000);
  zwei_farben (); verschieben_l ();delay(1000); regenbogen2 (); verschieben_l (); loeschen (); delay(1000); punkt (); regen_auf ();
  regen_zu ()  ; punkt_zu (); regen_auf (); verschieben_l (); regen_nach_r (); loeschen (); delay(1000);
  drei_punkte ();  verschieben_l (); loeschen (); delay(1000);

}
//-------------------------------------------------------------
void regenbogen2 () {
  zw1 = 0; zw3 = 0;
  do {
    zw2 = 0; zw4 = 0;
    do {
      strip.setPixelColor (zw1, regen [6][zw2]);//strip.show();
      zw1++; zw2++; zw4++;
    } while (zw4 != 13);
    //strip.show();
    zw1 = zw1 + 11; zw3++;
  } while (zw3 != 3);

  zw1 = 13; zw3 = 0;
  do {
    zw2 = 11; zw4 = 0;
    do {
      strip.setPixelColor (zw1, regen [6][zw2]);//strip.show();
      zw1++; zw2--; zw4++;
    } while (zw4 != 11);
    //strip.show();
    zw1 = zw1 + 13; zw3++; delay(1000);
  } while (zw3 != 2);
  strip.show();
  delay(1000);
}

//--------------------------------------------------------------
void drei_punkte () {
  zw3 = 0;
  do {
    zw1 = 4; zw2 = 0;
    do {
      strip.setPixelColor (zw1, zw3, 0, 0); strip.setPixelColor (zw1 + 1, 0, zw3, 0); strip.setPixelColor (zw1 + 2, 0, 0, zw3);
      zw1 = zw1 + 10; zw2++;
    } while (zw2 != 6);
    strip.show(); zw3++; delay(10);
  } while (zw3 != 255);
}

//-------------------------------------------------------------
void zwei_farben () {
  zw4 = 0;
  do {
    zw1 = 0; zw2 = 59; zw3 = 05;
    do {
      strip.setPixelColor (zw1, zw3, 0, 0); strip.setPixelColor (zw2, 0, zw3, 0); strip.show(); delay(200);
      zw1++; zw2--; zw3 = zw3 + 4;
    } while (zw1 != 60);
    zw4++;
  } while (zw4 != 2);
}
//------------------------------------------------------------

void loeschen () {
  zw1 = 0;
  do {
    strip.setPixelColor (zw1, f00); zw1++;
  } while (zw1 != 60);
}
//------------------------------------------------------------
void regen_nach_r () {
  zw1 = 0;
  do {
    zw2 = 0;
    do {
      strip.setPixelColor (zw2, regen [6][zw1]); zw2++; strip.show(); delay(20);
    } while (zw2 != 60);
    delay(1000);
    zw1++;
  } while ( zw1 != 13);
}
//------------------------------------------------------------
void verschieben_l() {
  farbe01 = strip.getPixelColor(59); delay(1000);
  zw2 = 60;
  do {
    zw1 = 58;
    farbe01 = strip.getPixelColor(59);
    do {
      farbe02 = strip.getPixelColor(zw1);
      strip.setPixelColor (zw1 + 1, farbe02);
      zw1--;
      strip.show();
    } while (zw1 != -1);
    strip.setPixelColor (0, farbe01);
    strip.show(); delay(100);
    zw2--;
  } while (zw2 != 0);
  delay(1000);
  zw1 = 0;
  do {
    strip.setPixelColor (zw1, f00);
    zw1++;
  }
  while (zw1 != 60);
}
//-----------------------------------------------------------
void punkt () {
  zw1 = 0;
  do {
    strip.setPixelColor (7, zw1, zw1, zw1); strip.setPixelColor (22, zw1, zw1, zw1);
    strip.setPixelColor (37, zw1, zw1, zw1); strip.setPixelColor (52, zw1, zw1, zw1);
    strip.show(); delay(20);
    zw1++;
  }
  while (zw1 != 255);
}
//-----------------------------------------------------------
void regen_auf () {
  zw2 = 0;
  do {
    zw1 = 0;
    do {
      strip.setPixelColor (zw1 + 1, regen [zw2][zw1]); strip.setPixelColor (zw1 + 16, regen [zw2][zw1]);
      strip.setPixelColor (zw1 + 31, regen [zw2][zw1]); strip.setPixelColor (zw1 + 46, regen [zw2][zw1]);
      strip.show();
      zw1++;
    } while (zw1 != 13);
    zw2++; delay(500);
  } while (zw2 != 7);
  delay(1000);
}

//---------------------------------------------------------
void regen_zu () {
  zw2 = 7;
  do {
    zw1 = 0;
    do {
      strip.setPixelColor (zw1 + 1, regen [zw2 - 1][zw1]); strip.setPixelColor (zw1 + 16, regen [zw2 - 1][zw1]);
      strip.setPixelColor (zw1 + 31, regen [zw2 - 1][zw1]); strip.setPixelColor (zw1 + 46, regen [zw2 - 1][zw1]);
      strip.show();
      zw1++;
    } while (zw1 != 13);
    zw2--; delay(500);
  } while (zw2 != 0);
  delay(1000);
}

//----------------------------------------------------------
void punkt_zu () {

  zw1 = 255;
  do {
    strip.setPixelColor (7, zw1, zw1, zw1); strip.setPixelColor (22, zw1, zw1, zw1);
    strip.setPixelColor (37, zw1, zw1, zw1); strip.setPixelColor (52, zw1, zw1, zw1);
    strip.show(); delay(10);
    zw1--;
  }
  while (zw1 != -1); delay(1000);
}

Sorry Tommy, da waren wir parallel aktiv :slight_smile:

Da war einer schneller als ich . . .

Ich sehe aber gerade, da ist noch eine überflüssige Kommentarzeilen drinnen: "//strip.setBrightness(125); strip.show();".

Die hatte ich geschrieben, da mich die Pixel geblendet haben. Wenn man sie aktiv lässt, kommen einige Farben nicht richtig.

So ist es noch einfacher, dann erhältst Du auch Hilfe von den Smart-Nutzern

Was sind Smart-Nutzer?

M.f.G.

Hans-Ulrich

Die mit mobilen Geräten.

Gruß Tommy

Wenn Du Dich mit Animationen beschäftigen möchtest, solltest Du einen Blick auf die Bibliothek FastLED werfen. Die kann auch HSV Farben, womit Regenbogenfarben ganz einfach werden, in dem Du hue von 0 bis 255 veränderst.

Vielen Dank für die beiden Links. Da ich aber im vorigen Jahrtausend keinen Englischunterricht hatte, wird das wohl eine Weile dauern, bis ich mich da durchgearbeitet habe.

M.f.G.

Hans-Ulrich

Nicht fehlerfrei aber deutlich besser als der Google-Translator ist deepl.

Gruß Tommy

Ich habe das Programm mal für APA102C geändert und während ich dies schreibe, läuft es neben mir.

Frei nach Kermit: APPLAUS, APPLAUS!

Auch mit Englischunterricht ist FastLED nicht ohne Tücken, Falltüren und Stolperfallen. Aber Bibliotheken mit vielen Möglichkeiten sind nie einfach zu handhaben. Wenn man sich aber an den Beispielen orientiert, kommt man voran. Bei LEDs kann ja außer einer falschen Farbe nichts passieren :wink:

Die blockierende Eigenschaft von delay und do/while ist Dir sicher bewußt. Solange Du nur die Animation laufen lassen willst, stört das aber nicht.

agmue:
Wenn Du Dich mit Animationen beschäftigen möchtest, solltest Du einen Blick auf die Bibliothek FastLED werfen. Die kann auch HSV Farben, womit Regenbogenfarben ganz einfach werden, in dem Du hue von 0 bis 255 veränderst.

Geht die Farbe nicht von 0 bis 359?
Helligkeit und sättigung von 0 bis 255.
Grüße Uwe

Genaue Betrachtung des Stromes und Spannungsabfalls bei einseitig versorgter WS2812-Stripe.

Mal angenommen daß an den Kabeln vom Netzteil bis zur Einspeisung kein Verlust auftritt und somit genau 5,00V eingespeist werden.
Auch noch angenommen die WS2812 werden gleich angesteuert zB 100% weis und verbrauchen darum alle I = 60mA.
Der Widerstand zwischen 2 benachbarten WS2812 sei R und zwischen Einspeisepunkt und erster WS2812 0,5*R;
R sein die Summe des Widerstand des 5V und des GND Leiters auf dem Strip zwischen 2 benachbarten WS2812.
n sei die Anzahl der Ws2812 auf dem Strip.
x sei eine xbeliebige WS2812 die betrachtet wird.

Die Spannung am erste WS2812 ist die Versorgungsspannung minus dem Spannungsabfall zwischen Einspeisepunkt und erster WS2812. Da die Entfernung ca die Hälfte ist wie zwischen 2 WS2812.
Der Widerstand Zwischen 2 Ws2812 sei R und zwischen Einspeisepunkt und erster WS2812 0,5*R

Der Strom bis zur ersten LED sei die Summe aller Ströme

Spannung an der ersten Ws2812:
UWS1 = 5,00V - 0,5RI*n

Spannung an der x-ten LED für diese Formel x > 4):
UWSx = 5,00V - (0,5RIn) - ( (R1 * In-1) + (R2In-2) + (R3In-3) + ... +(RxIn-x))

Abschließend:
Der Gesamtstrom nimmt von WS2812 zu WS2812 ab.
Der Leitungswiderstand des Spannungsversorgungsleiters nimmt von Einspeisepunkt bis zum WS2812 je Ws2812 zu und ist die Summe der Widerstände vom Einspeisepunkt zur betrachteten WS2812.
Da der Strom von WS zu WS abnimmt wird der Spannungsabfall zwischen 2 benachbarten WS entlang der Länge des Streifens immer kleiner, obwohl der Widerstand pro Längeneinhet sprich zwischen 2 benachbarten WS immer gleich bleibt.
Absolut gesehen wird die Versorgungsspannung entlang der Länge des Streifens an jedem WS immer kleiner

Grüße Uwe

Hallo Uwe,

ich glaube die Sache ist noch etwas komplizierter. Mit abnehmender Spannung an dem WS2812 nimmt ab einem bestimmten Punkt auch die Stromaufnahme ab und somit verringert sich der Spannungsabfall wieder etwas.
Ansonsten kann ich deine Rechnung nachvollziehen.

In dem Zusammenhang habe ich die Stromaufnahme eines WS2812 gemessen. Sie beträgt (zu mindestens bei meinem Streifen) 35 mA bei voller Ansteuerung.

@ agmue

Frei nach Kermit: APPLAUS, APPLAUS!

Danke.

Die blockierende Eigenschaft von delay und do/while ist Dir sicher bewußt

Das sagt mir im Moment erst mal nichts. Wie ist das gemeint?

M.f.G.

Hans-Ulrich

uwefed:
Geht die Farbe nicht von 0 bis 359?

Hallo Uwe,
es handelt sich um einen Winkel, den man üblicherweise so angeben würde. Bei FastLED wollte man aber wohl ein Byte sparen:

Often in other HSV color spaces, hue is represented as an angle from 0-360 degrees. But for compactness, efficiency, and speed, this library represents hue as a single-byte number from 0-255.

Hans_Ulrich:

Die blockierende Eigenschaft von delay und do/while ist Dir sicher bewußt

Das sagt mir im Moment erst mal nichts. Wie ist das gemeint?

Während delay oder do/while ist der µC genau mit dieser Aufgabe beschäftigt und kann keine anderen Aufgaben übernehmen. Sollen die Animationen brav nacheinander ablaufen, ist das OK.

Bei meiner LED-Uhr kann ich mittels IR-Fernbedienung die Helligkeit einstellen oder von Uhr zu Animation umschalten. Eine blockierende Programmierung läßt solche Erweiterungen nicht zu.

Darüberhinaus harmonieren IR-Fernbedienung und WS2812 nicht, weshalb ich APA102C verwendet habe.

Hans_Ulrich:
Hallo Uwe,

ich glaube die Sache ist noch etwas komplizierter. Mit abnehmender Spannung an dem WS2812 nimmt ab einem bestimmten Punkt auch die Stromaufnahme ab und somit verringert sich der Spannungsabfall wieder etwas.
Ansonsten kann ich deine Rechnung nachvollziehen.
...
Hans-Ulrich

Ja, Du hast Recht das habe ich nicht bedacht.
Wenn diese Punkt erreicht ist dann hat es aber auch sichtbare Auswirkungen, weil die 3 Grundfarben nacheinander schwächer werden bzw gar nicht mehr leuchten. Ab einem gewissen anderen Punkt funktioniert dann die Elektronik des Kontrollers auch nicht mehr richtig.

Solange die Spannung hoch genug ist, daß sie über der Durchflußspannung, summiert mit dem Spannungsabfall der Konstantstromquelle/senke ist, hat der Strom die angegebene Wert. Sinkt die Versorgungspannung unter diesem Wert sinkt auch der Strom. Dies tritt leider für die 3 Farben nicht bei der gleichen Spannung auf und der effektive Konstantstrom ist auch nicht linear mit der Versorgungsspannung.

Grüße Uwe

Danke agmue das wußte ich nicht.
Grüße Uwe

Bitte gerne und komme gut ins nächste Jahr :smiley:

Hi

Während eines delay() macht der Arduino ... Nichts.
Innerhalb einer While-Schleife, wo z.B. auf das Ende einer Datenübertragung gewartet wird, wird SONST NICHTS gemacht.
Kein Tastendruck, keine Aktualisierung des LCD.

Diese beiden NICHTS gilt Es, zu verhindern.

Statt delay() kann man sich mit millis() behelfen - millis() ist die 'Uhr' des Arduino und schaltet alle ms um 1 hoch - nach 49,batsch Tagen läuft der Zähler über, weshalb man vergangene Zeiten via

if (millis()-startzeit>wartezeit){

abfragen MUSS - Das klappt auch während und um des Überlauf.

While-Schleifen werden gerne von Anfängern benutzt, um seriell irgend etwas einzulesen - die serielle Datenübertragung ist für den Arduino aber schnarch-langsam.
In dieser Zeit könnte neben der Wäsche auch schon das Mittagessen auf dem Tisch stehen - aber nein, der Arduino starrt nur die Spülmaschine an, ob Die wohl fertig wird ...

While-Schleifen sind nicht zu verteufeln - bei sich ändernden Massen (z.B. Anzahl an leuchtenden LED auf einem Stripe) kann man so die Bearbeitung noch vor dem Ende des Stripe abbrechen - da sich dort eh Nichts mehr tut.

Eine Auflistung von combie findest Du z.B. hier im Forum.

MfG

PS: Meine WS2812B Derivate stellen das Leuchten bei 1,5V komplett ein - zuvor sind Sie ab ca. 3V nur noch Rot.
Alles in Allem: Weit von den 5V darf man sich nicht entfernen, damit keine Verfälschung nach Rot kommt.

Ich muss noch mal nach haken, ist damit gemeint das während delay() und innerhalb einer While-Schleife,

kein Interupt möglich ist?

M.f.G.

Hans-Ulrich

Hans_Ulrich:
Ich muss noch mal nach haken, ist damit gemeint das während delay() und innerhalb einer While-Schleife,
kein Interupt möglich ist?

Doch, ist möglich. Daher ist der Satz "Während eines delay() macht der Arduino ... Nichts." nicht ganz richtig. Serial liest beispielsweise mittels Interrupt weiter Daten bis zum Pufferüberlauf ein.

Wenn Du loop() als Schleife nutzt und millis() für Zeiten, findest Du den Weg aus dem Dilemma, ohne den Interrupt zu strapazieren.