Hallo zusammen,
nachdem ich es nicht geschafft habe, meine 2801 Leds mit dem Raspi individuell anzusteuern , bin ich auf den Arduino gestoßen, der das ganze Problemlos machen soll.
Ohne Programmiererfahrung (kann fast alles lesen und kleinere Fehler beheben - aber nichts von Grund auf neu schreiben) hat es 2 Tage gedauert.
Am ersten Abend funktionierte die Ansteuerung der Matrix über Glediator, am Tag danach die manuelle Ansteuerung des Rests.
Jetzt will ich aber die Farbkanäle unabhängig voneinander - parallel laufend - mit unterschiedlicher Schleifenzeit ansteuern, um einen Farbverlauf zu erzeugen, der sich nicht ständig wiederholt.
Hier fehlen mir aber die theoretischen Grundlagen. Derzeit arbeite ich mit 3 For schleifen, mit integrierter If Schleife, die jeden Kanal befeuert.
Mein Problem dabei ist, dass durch diese Verschachtelung natürlich die innerste Schleife am häufigsten durchlaufen wird.
Ich will das also irgendwie "parallelisieren" - ich weiß nur nicht wie.
Mache ich das über Interrupts? Also irgend nen Zähler laufen lassen und je nach Zählerstand dann interrupten und den jeweiligen Kanals beeinflussen?
Mein ziel ist folgendes:
Der erste Farbkanal faded in ca 30 Sec von 0 auf 255 und wieder auf 0
Der zweite macht das gleiche in 40 Sec
Der Dritte macht das in 35 Sec
Bitte gebt mir mal Stichpunkte, wie ich da weiterkomme.
Für die Programmierprofis unter euch nun was zum lachen - mein "Code", wie er derzeit läuft.
#include "SPI.h"
#include "Adafruit_WS2801.h"
//Pins setzen
int dataPin = 2;
int clockPin = 3;
//Variablen für schleifen
int r = 0;
int r_color = 0;
int g = 0;
int g_color = 0;
int b = 0;
int b_color = 0;
//Strip Setup
Adafruit_WS2801 strip = Adafruit_WS2801(80, dataPin, clockPin);
//Los gehts - setup
void setup() {
strip.begin();
strip.show();
}
//Richtig los
void loop() {
//3 verschachtelte For - Pro kanal
for (r=0; r < 512;)
{
for (g=0; g < 512;)
{
for (b=0; b < 512;)
{
//Dirty hack für hoch und runterzählen und Farbwert setzen
if (b < 255){b_color = b;}
else{b_color = 512 - b;}
//Streifen befeuern
colorWipe(Color(r_color, g_color, b_color), 1);
// für schnellen Test erstmal 30 - später irgendwas zw. 1 und 5
b = b + 30;
}
if (g < 255){g_color = g;}
else{g_color = 512 - g;}
g = g + b_color ;
}
if (r < 255){r_color = r;}
else{r_color = 512 - r;}
r = r + g_color;
}
}
//Copy&Paste aus Beispielscript - notwendig für Farbübergabe
void colorSet(uint32_t c)
{
int i;
for (i=0; i < strip.numPixels(); i++)
{
strip.setPixelColor(i, c); // set the color for each pixel
}
strip.show(); // write the pixels to the strip
}
//Copy&paste aus Beispiel - schreibt den Strip mit delay
void colorWipe(uint32_t c, uint8_t wait) {
int i;
for (i=0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
//Copy&Paste aus Beispielscript - notwendig für Farbübergabe
uint32_t Color(byte r, byte g, byte b)
{
uint32_t c;
c = r;
c <<= 8;
c |= g;
c <<= 8;
c |= b;
return c;
}