Verständnis frage bzw. Kurzhilfe

Hallo Programierprofis

da ich mich nun auch in die Welt von ARDUINO eingearbeitet habe und mein erstes Projekt erstellt hab, brauche ich euere Hilfe.

Soweit steht alles und ich konnte so einigermasen meine Vorstellungen umsetzen
Nun geht nur darum eine erweiterung für später mal offen zu halten.

im Programm gehen Neopixel der Reihe nach an. Bis der Streifen voll ist. (PIN 11 0-300)

Wenn irgendwann Später mal das erweitert werden soll ist es möglich über PIN 10 nach einer delayzeit XY einen weiteren Streifen anzuschalten?

Quasi erst Streifen 1 0-300 dann 30ms Pause und dann Streifen 2 wieder 0-300. dieser ist dann aber an einem 2ten Ausgang. sollte den Effekt geben das die LED´s 0-600 einzelnd an gehen.
Die DATEN Ader fortlaufend zu Verlegen ist nicht wirklich einfach Realisier bar. Die benötigten Einspeisungen des LED Streifens ist kein Problem.

Hier mal das was ich zusammengebaut habe falls dies benötigt wird.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define Stripe_1 11 // an welchem Pin der Streifen hängt
#define LED_1 300// Anzahl der angeschlossenen WS2812 LEDs 

Adafruit_NeoPixel Band_1 = Adafruit_NeoPixel(LED_1, Stripe_1, NEO_GRBW + NEO_KHZ800);
int pause=30;  // Millisekunden Pause bis zur Ansteuerung der nächsten LED.
int a=0; //Start LED Pixel Band 1
int b=LED_1;
int KLED=13; // Kontroll LED
const int S1 = 2; //Lichtschalter Pin
int LS = 0; //Lichtschalterstatus
boolean AN = false; //Merker Licht an/aus

void setup() 
{
Serial.begin(9600); // zum evtl. auslesen(fehlersuche)
pinMode(S1, INPUT); //Lichtschalter 
pinMode(KLED, OUTPUT);// Ausgang Kontroll LED
Band_1.begin();
Band_1.show();
}

void loop(){

LS = digitalRead(S1);// Schalter auslesen
if (LS == HIGH){
if (AN == false){  
digitalWrite(KLED,HIGH);
Band_1.setPixelColor(a, Band_1.Color(0,0,0,255)); // Band anschalten  
Band_1.show(); // Durchführen der Pixel-Ansteuerung
a=a+1; // vortlaufenden des Stripes
delay (pause); // ansprechzeit zur nächsten LED
if (a==LED_1)a=0,AN=true; //Stripe Ende zurücksetzten
  }
} 
else 
{
LS = digitalRead(S1);// Schalter auslesen
if (AN == true){
if (LS == LOW){
digitalWrite(KLED, LOW); // Schalter auslesen
Band_1.setPixelColor(b, Band_1.Color(0,0,0,0)); // Band ausschalten rückwärts
Band_1.setPixelColor(0, Band_1.Color(0,0,0,0)); // Band ausschalten nur Letzer Pixel 
Band_1.show(); // Durchführen der Pixel-Ansteuerung
b=b-1; // vortlaufenden des Stripes
delay (pause); // ansprechzeit zur nächsten LED
if (b==0) b=LED_1, AN = false; //Stripe Ende Zurücksetzten 
}
}
{
LS = digitalRead(S1);// Schalter auslesen
}
}

}

Welchen Arduino hast Du?
600 WS2812 brauchen ca 1800Byte RAM. Da bleibt zB beim UNO zu wenig für den Sketch.

Hallo uwefed,

doch ist der Arduino Uno

mein Program oben nutzt 11% des Programmspeicherplatzes. Daher dachte ich man kann locker einen 2ten streifen mit angehen lassen. Wenn der erste nur 11% benötigt so bin ich auf die erweiterbarkeit gekommen.
Nur ist es Baulich nicht so einfach machbar die Datenleitung vom ende des Streifen 1 zu einem neuen Streifen zu verlegen. da ist es einfacher wieder vom Arduino mit dem 2ten Streifen zu beginnen.

Der Speicher wird dynamisch zur Laufzeit angelegt. Das kann dir der Compiler nicht anzeigen

Programmspeicher und RAM sin 2 verschidene Dinge.
Beim Speichrverbrauch ist es egal ob Du 2 Striefen zu 300 oder einen zu 600 LED hast.

aha ok.

also müsste ich im erweiterungsfall auch den Arduino tauschen.
Dann ist es aber machbar.

Pfuscher:
aha ok.

also müsste ich im erweiterungsfall auch den Arduino tauschen.
Dann ist es aber machbar.

Ja, Du brauchst dann einen MEGA.

Cool Danke.

um dann bei einem Anderen Ausgabepin weiter zu machen, nutze ich dann die IF Funktion?

z.b.
if (300 an)

Hier kommt jezt wieder der code vom ersten Sreifen nur als neuer 2ter Streifen an neuen PIN definiert.

hab ichs Verstanden?

Hi

Für den 2.ten Streifen brauchst Du eine eigene Instanz, Ob und wie/wann Du Daten an den 2.ten Streifen schickst, entscheidest Du in Deinem Code.
Der Einfachheit halber würde ich wohl ein Array aus den zwei NeoPixel-Streifen machen - zumindest gerade so meine Gedanken - dann kannst Du nur durch Ändern des Index streifen[0] → streifen[1] eben den anderen Streifen ansprechen.

Der Strombedarf ist Dir bewusst?
600 Pixel a 60mA = ca. 36A - Das gibt ein beängstigendes Netzteil und die Drähte, Die Da weggehen, sollten auf gar keinen Fall <4mm² sein, wohl wäre mit bei 6mm².
Hier kommt es nicht auf den Strom an, der ‘im Normalfall’ fließt, sondern in dem unglücklichem Fehlerfall, wenn Du z.B. mit dem Schraubendreher diese 5V kurzschließt und Dein Netzteil ‘Alles was geht’ durch die von Dir verlegten Drähte prügelt - Diese können binnen Sekundenbruchteilen verdampfen!
Wenn Du dort ‘Deine Finger im Spiel’ hast, gibt Das wenigstens Verbrennungen - die Alternative: Metall im Körper, soll wesentlich unangenehmer sein und die Restlebenserwartung deutlich reduzieren.
Ganz nebenbei sind glühende Drähte auch für die Bausubstanz ungeeignet.

Bedenke, was Du machst - auch 5V sind hier ‘kein Kinderspiel’!

Zum Speicherbedarf: Jeder Pixel wird mit 3 Byte (R+G+B) gespeichert.
Macht bei 600 Pixel 1800 Byte nur für die zum Stripe auszugebende Farbinformation.
Der Rest, an welchem Pin der 2.te Streifen hängt, ist aber in der Lib geregelt, Du musst nur den LEDs Deren Farbe zuweisen und, wenn Du mit dem ‘Frame’ fertig bist, per .show() an Diesen schicken.
Bei zwei Stripes musst Du auch Beide aktualisieren - halt, wenn sich was an dem jeweiligem Stripe verändert hat.
Wenn Du immer .show() aufrufst, ändert Das Nichts an den ausgegebenen Farben, macht das Programm aber wesentlich träger.
Jeder Pixel braucht eine gewisse Zeit, nach dem 300stel muß eine Pause eingehalten werden, Näheres im Datenblatt oder von Einem hier, Der die Werte gerade im Kopf hat.
WICHTIG: millis() wird durch NeoPixel zum Teil stark ausgebremst!!
Während dem Senden der Farben an den Stripe sind Interrupts abgeschaltet - auch der Timer-Interrupt, Der millis() hochzählt.
Somit ist die interne Millisekunden-Uhr nur noch ein hoch laufender Wert ohne wirklichen Bezug auf die Zeit.
Bei meiner NeoPixel-Uhr (wer hätte Das gedacht, 60 Pixel), komme ich auf eine Sekundenzeit von 700 millis() (bei aufwändiger Animation).
Hier nutze ich millis() (bzw. die gemessenen Anzahl an millis()) zur Bestimmung, wann meine Animation beendet sein soll, damit die nächste Sekunde nicht ‘zu früh’ anfängt.

So, genug der heutigen Lesung :slight_smile:

MfG

Pfuscher:
… sollte den Effekt geben das die LED´s 0-600 einzelnd an gehen.

Wonach Du suchst, findest Du wahrscheinlich im Beispiel MultipleStripsInOneArray.ino der Bibliothek FastLED.

“… each strip will be referring to a different part of the single led array”

Hallo postmaster-ino,

Danke für deine aus allen Richtungen betrachteten Hilfestellungen.
Respekt das du auch auf die Gefahren der Hardware hinweist.

Bei dem Speicherbedarf ist dir vermutlich ein kleiner Fehler unterlaufen.Eingesetzt sind RGBWW Strips und das ist, wenn ich dich richtig verstanden hab dann 4 Byte je pixel. Da liegt auch einer meiner Fehler im ersten Projekt, ich nutze nur WW. Ein anderer Streifen hätte es wohlmöglich auch getan.

Leider bin ich aber bei deiner Zeiterklärung dann ausgestiegen ?? Naja wird evtl. ja noch.

Nun mal kurz zur meiner Person. Und Bitte nicht Falsch verstehen postmaster-ino ich finde es richtig gut das du auch auf Gefahren hinweist. RICHTIG COOL.
Ich selber bin Elektromeister und hab mit Programieren von SPS, DMX, KNX und so sachen schon bekanntschaft gemacht. Durch das Adressierbare LED Projekt nun die Bekanntschaft mit Arduino. Soweit bin ich mit Lesen und Selbststudium, so wie Trail & Error auch mit dem bisherigen Verlauf zufrieden und habe fast alles was ich mir dachte, umsetzen können.

Ich denke mal das sowas Ausbau fähig ist und ich mich damit auch beschäftigen kann. Daher kam ich ja auch auf die Idee einer Erweiterung.

Ein 2ter Streifen wäre ja vom ersten komplett getrennt. neues Netzteil neue 300 LEDS und halt neuer PIN. Nur die Animationn soll es als EINZELTEIL kennen.

Hallo agmue,
Danke für den Tip. Mit den Bibliotheken und Beispielen muss ich mich noch viel mehr beschäftigen....

Hi

Ok, als E-Meister werden Dir die Kabelquerschnitte wohl gelingen :wink:
Einen Stripe mit zusätzlich weißen LEDs hatte ich noch nicht in der Hand, bisher nur von gelesen.
Wenn Du eh nur weiß brauchst, gibt die Stripes auch als 3xweiß, dort kannst Du dann die Helligkeit in 24bit (=16777215 Stufen) dimmen - aber auch davon habe ich bisher nur gelesen - finde die RGB-Variante deutlich interessanter zum Spielen.

Ob es Sinn macht, die Stripes an verschiedene Arduinos zu hängen?
Man könnte mit einem 'Master' z.B. via I²C die Stripe-Arduinos befehligen - wenn Die nicht laufend irgend welchen Kram zu erledigen haben (hoch/runter dimmen oder so Kram), können Diese auch entsprechend auf Anfragen reagieren (beim Ansteuern der Stripes sind Interrupts gesperrt, Anfragen gehen dann verloren) - vll. mit 'Busy-Leitung'?

Das, was agmue schrieb ("... each strip will be referring to a different part of the single led array") hört sich interessant an - Du sprichst die LEDs per Nummer an, die Lib kümmert sich darum, an welchen Stripe diese Info dann gesendet wird.
Bei der Anzahl an LEDs scheidet der Nano dann aber aus.
Man könnte zwar für externen Speicher sorgen, Den bekommt man aber nicht schnell genug ausgelesen - auch muß man die gelesenen Daten ja noch zum Stripe schicken - da hier schon beim normalen Beschicken innerhalb der Lib die Prozessor-Takte für's Timing gezählt werden, gibt Das Keinen.

'Komplett getrennt' ... wenn's der gleiche Arduino ist, sollte zumindest GND verbunden sein.
Denke an die Widerstände zwischen Arduino und Datenpin der ersten LED - wenn das Netzteil des Stripe noch aus ist, der Arduino aber schon Daten sendet, stirbt Dir sonst die erste LED (Diode zwischen Datenpin und Versorgungsspannung, Schutzbeschaltung).

DMX nur belesen (sollte mich Mal treffen, hat's dann aber doch nicht), KNX nur beiläufig - ist 'nicht Meins'. SPS nur lesend im Programm, wann 'der und der Ausgang' kommt und was Da so noch Alles dran hängt (meist irgend ein Fehler im NotAus-Kreis).

Einzelteil und Animation bringe ich noch nicht zusammen - unterm Strich ist egal, welcher µC sich um welchen LED-Pixel kümmert - der Betrachter wird zu >99% nicht Mal wissen, daß Da irgend was kompliziertes abläuft, wenn Er's überhaupt aktiv wahrnimmt.

Wenn Dein Sketch nicht funktioniert, setze die Zahl der verwendeten LEDs runter - irgendwann funktioniert der Sketch dann schon.

Der zeitliche Ablauf, wann der einzelne NeoPixel das Signal wie wertet und wann Er die Daten übernimmt, sind im Datenblatt entnehmbar, das einzelne Bit braucht (High+Low) nur knapp über eine µs, die Übernahme der Daten erfolgt, wenn 50µs keine neuen Daten empfangen wurden.
Bei 300 Pixeln a 24 Bit (bei Dir wohl 32 Bit) macht Das
300 x 24 x 1 = 7200µs = 7,2ms die 50µs Reset machen sich kaum bemerkbar.
Hier kämst Du, theoretisch, auf ~ 100 Frames pro Sekunde - wohl gemerkt bei angenommener Bitlänge von 1µs (in Wahrheit ist's ein Muckensack mehr).
Bei 24 Bit werden's 9600µs = 9,6ms - wenn der Arduino noch irgend was sonst nebenher machen soll, sind die 100 Frames schnell 'Geschichte'.
Wenn Dein µC beide Stripes beschicken soll, braucht Der für Jeden Stripe diese ca. 10ms, schon sind's nur noch 50 Frames und Du hast noch keine Berechnung angestellt, wie die Animation weiter laufen soll - ganz nebenbei zählt Dein millis() in diesen 10ms nicht höher - hiermit kannst Du jetzt nur noch relative Zeiten erfassen - bei einer Sekunden-Animation (Uhr) komme ich auf 700 millis()-Ticks pro Sekunde, der Wert wird dynamisch nach unten angepasst.
So kann ich sicherstellen, daß meine Animation fertig ist, bevor der 'Sekundenzeiger' einen weiter rutscht.

Wieder viel Text und für Heute ist's eigentlich auch schon spät genug geworden.

MfG