Tlc 5940 RGB Fading

Hallo,
ich habe meinen 64 Pixel Tisch fertig gebaut mittlerweile bin ich bei der Programmierung angekommen.
Ich bin gerade dabei ein Fading Programm zu schreiben, hab wieder ein Fehler den ich nicht finden kann.
Ich hab versucht erstmal eine Led leuchten zu lassen und in den Farben zu faden (von rot-gelb-grün-türkis-blau-lila und wieder zu rot und das die ganze zeit), wollte mich dann langsam hoch arbeiten bis schließlich sowas rauskommt: http://www.youtube.com/watch?v=9264jeI_1m4&feature=youtu.be

Hier mal der Code:

for (int c=500; c <= 0; c--)
{
  for (int a=0; a <= 500; a++)
  {
    for (int b=500; b <= 0; b--)
        {
          for (int c=0; c <= 500; c++)
          {
            for (int a=500; a <= 0; a--)
            {
              for (int b=0; b <= 500; b++)
              {
                for (int a=0; a <= 500; a++)
                {
                  Tlc.set(0,a);
                  Tlc.update();
                }
                Tlc.set(1,b);
                Tlc.update();
              }
              Tlc.set(0,a);
              Tlc.update();
            }
            Tlc.set(2,c);
            Tlc.update();
          }
          Tlc.set(1,b);
          Tlc.update();
        }
        Tlc.set(0,a);
        Tlc.update();
      }
  Tlc.set(2,c);
  Tlc.update();
}

Vielleicht findet ja jemand auf Anhieb den Fehler momentan faded er von rot nach gelb über grün und hört dann auf und fängt wieder bei rot an…

Verzeih mir, aber 7 verschachtelte for-Schleifen ist nur murks. Grüße Uwe

wie könnte ich das besser lösen?

Gib wenigstens den Schleifenvariablen andere Namen. Vielleicht kann man dann verstehen, was die 7 verschiedenen Variablen ( c,a,b,c,a,b,a ) sollen ?

Und wenn man eine Variable wiederverwendet, dann darf man sie nicht neu deklarieren. Das heißt nur beim ersten mal den Datentyp dazuschreiben und beim zweiten mal dann nur “a = 500” statt “int a = 500”. Sonst kannst es gut sein, dass das dann zwei verschiedene Variablen mit dem gleichen Namen sind.

Habs nochmal geändert und kommentiert vielleicht versteht man es jetzt besser:

int a,b,c,d,e,f,g;
 
// Tlc.set(0,500); Rot    Tlc.set(1,500); Grün     Tlc.set(2,500); Blau           
Tlc.set(0,500); //rotes licht ist an, schleife wird von innen nach außen abgearbeitet

for (g=500; g >= 0; g--)         //blaues licht geht aus es entsteht rot
{
  for (f=0; f <= 500; f++)           // rotes licht geht an es entsteht lila
  {
    for (e=500; e >= 0; e--)        //grünes lich geht aus es entsteht blau
        {
          for (d=0; d <= 500; d++)  //blaues licht geht an es entsteht türkis
          {
            for (c=500; c >= 0; a--)    //rotes licht geht aus es entsteht grün
            {
              for (b=0; b <= 500; b++)   //grünes licht geht an und mischt sich zu gelb
              {
                Tlc.set(1,b);
                Tlc.update();
              }
              Tlc.set(0,c);
              Tlc.update();
            }
            Tlc.set(2,d);
            Tlc.update();
          }
          Tlc.set(1,e);
          Tlc.update();
        }
        Tlc.set(0,f);
        Tlc.update();
      }
  Tlc.set(2,g);
  Tlc.update();
}

grünes licht geht an und mischt sich zu gelb

und das 500 ^ 5 = 31 Billionen mal ???

(Kann auch sein, dass ich mich um einen Faktor 106 vertan hab, egal … )

Farbwerte RGB in dezimal.
rot- 255-000-000
gelb- 255-255-000
grün-000-255-000
türkis-000-255-255
blau-000-000-255
lila- 255-000-255
um einen Übergang von rot-gelb-grün-türkis-blau bis lila zu haben muß Du
von 255-000-000 auf 255-255-000 faden dann
von 255-255-000 auf 000-255-000
usw.

also angenommen an Kanal 0 ist die rote LED angeschlossen, an 1 die grüne und an 2 die blaue und wir faden mit 12 Bit.

int R,G,B;

 // fade von rot nach gelb.
Tlc.set(0,4096);  // rot
Tlc.set(2,0);  // blau
for (G = 0; G<=4095; G++)
  {
  Tlc.set(1,G); //
  Tlc.update();
  delay(10);  // Pause für die Fadegeschwindigkeit.
  }
                 // fade von rot nach grün.
Tlc.set(1,4096);  // grün
Tlc.set(2,0);  // blau
for (R = 4095; R>=0; R--)
  {
  Tlc.set(0,R); //
  Tlc.update();
  delay(10);  // Pause für die Fadegeschwindigkeit.
  }
//ecc

Grüße Uwe

Oh man ich frage mich warum ich nicht drauf komme…
Hier für alle mal der Code, er funktioniert einwandfrei!

Tlc.set(0,4095);  // rot
Tlc.set(2,0);  // blau
for (G = 0; G<=4095; G++)
  {
  Tlc.set(myPins[0,1,2,3],G); //
  Tlc.update();
  delay(2);  // Pause für die Fadegeschwindigkeit.
  }
                 // fade von rot nach grün.
Tlc.set(1,4095);  // grün
Tlc.set(2,0);  // blau
for (R = 4095; R>=0; R--)
  {
  Tlc.set(0,R); //
  Tlc.update();
  delay(2);  // Pause für die Fadegeschwindigkeit.
  }

//fade zu türkis  
Tlc.set(1,4095);  // grün
Tlc.set(2,0);  // blau
for (B = 0; B<=4095; B++)
  {
  Tlc.set(2,B); //
  Tlc.update();
  delay(2);  // Pause für die Fadegeschwindigkeit.
  }  

//fade zu blau  
Tlc.set(2,4095);  // blau
Tlc.set(0,0);  // rot
for (G = 4095; G>=0; G--)
  {
  Tlc.set(1,G); //
  Tlc.update();
  delay(2);  // Pause für die Fadegeschwindigkeit.
  }  
  
//fade zu lila  
Tlc.set(2,4095);  // blau
Tlc.set(0,0);  // rot
for (R = 0; R<=4095; R++)
  {
  Tlc.set(0,R); //
  Tlc.update();
  delay(2);  // Pause für die Fadegeschwindigkeit.
  } 

//fade zu rot  
Tlc.set(0,4095);  // rot
Tlc.set(1,0);  // grün
for (B = 4095; B>=0; B--)
  {
  Tlc.set(2,B); //
  Tlc.update();
  delay(2);  // Pause für die Fadegeschwindigkeit.
  }

Jetzt stellt sich die Frage wie ich am einfachsten das Fading auf alle “Pixel” bekomme?
Habs mit einem Array probiert hat aber nicht geklappt, hat jemand eine gute Idee?

Mein versuch sah ungefähr so aus:

int myArray[] = {0, 3, 6, 9, 12, 15};
Tlc.set(myArray[],2000);
Tlc.update();

Gruß

hi,

also ich würde das so angehen (unprobiert):

void setup() {
Tlc.set(1, 4095);
Tlc.update;
}

void loop() {
for (byte n =0; n < 3; n++) {
for (int c = 0; c < 4096; c++) { Tlc.set(((n + 1) % 3) + 1, c); Tlc.update; }
for (int c = 4095; c >= 0; c–) { Tlc.set(n + 1, c); Tlc.update; }
}
}

gruß stefan

Ich würde Dir mal rate ein C- Tutorial zu lesen um einige Grundlagen zu erlernen. Grüße Uwe.

hi, uwe,

Ich würde Dir mal rate ein C- Tutorial zu lesen um einige Grundlagen zu erlernen.

ok, ich hab' den sketch nicht getestet, aber war er soooo falsch? =(

gruß stefan

Ich glaub du warst nicht gemeint, Stefan :) Bezieht sich wohl eher auf den stark blockenden Code, for-Schleifen mit 4k Werten, fehlender Index bei Arrays etc.

Gibt es bei der TLC5940 Lib keine Beispiele? Hab die leider gerade nicht drauf. Mein letzter Versuch mit dem TLC5940 führte dazu, dass mein Breadboard sich etwas deformiert hat :D

hi,

war mir klar, s., aber aus österreichischer sicht kann ein südtiroler gar nicht genug schuldgefühle haben. dort haben sie in den dorfwirtshäusern sogar schon spaghetti auf der karte... :roll_eyes:

gruß, stefan

Eisebaer: war mir klar, s., aber aus österreichischer sicht kann ein südtiroler gar nicht genug schuldgefühle haben. dort haben sie in den dorfwirtshäusern sogar schon spaghetti auf der karte... :roll_eyes:

made my day XD

ja und Maccheroni, Rigatoni, Farfalle, Strozzapreti, Mezze Penne, Tagliatelle, Linguine, Fusilli, Bigoli, Maccheroncini, Vermicelli, Spaghettini, Paglia e Fieno, Penne, Penne rigate, Rigatoni, Sedani, Sedadini, Pennette, Garganelli, Gnocchi, Pipe Rigate, Conchigliette, Orechiette Riccioli, Gemelli, Cellentani... ;) ;) ;)

Gib's zu Du würdest gerne mal nach Südtirol kommen, sowas essen. Grüße Uwe

hi, uwe,

Gib's zu Du würdest gerne mal nach Südtirol kommen, sowas essen.

nein, nein, die besten spaghetti gibt's sowieso bei mir um's eck beim chinesen. der hat übrigens auch super-döner.

gruß stefan

Eisebaer: nein, nein, die besten spaghetti gibt's sowieso bei mir um's eck beim chinesen.

Als Beilage zum Hirschgulasch? Solange er nicht auch noch Salzburger Nockeln machen bin ich ja beruhigt. ;) ;) ;) Grüße Uwe

Ich würde Dir mal rate ein C- Tutorial zu lesen um einige Grundlagen zu erlernen. Grüße Uwe.

Recht hast du, ist schon ne weile her als ich das im Studium hatte kannst du mir einen guten empfehlen?

Gruß

Ich habe noch mit Ritchie und Kernighan Buch C gelernt. Brian W. Kernighan, Dennis M. Ritchie: Programmieren in C. 2. Auflage. Hanser, München 1990, ISBN 3446154973. Ich kann Dir leider nichts vorschlagen, da Arduino auch noch große Teile von C++ beherrscht. Grüße Uwe