Go Down

Topic: Tlc 5940 RGB Fading (Read 696 times) previous topic - next topic

Gibsonuser

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:
Code: [Select]
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....

uwefed

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

Gibsonuser

wie könnte ich das besser lösen?

michael_x

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

Serenifly

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.

Gibsonuser

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

Code: [Select]
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();
}


michael_x

Quote
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 ... )

uwefed

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.
 
Code: [Select]
       
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




Gibsonuser

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

Code: [Select]
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:

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


Gruß

Eisebaer

#9
Dec 10, 2013, 02:44 am Last Edit: Dec 10, 2013, 04:11 am by Eisebaer Reason: 1
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

uwefed

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

Eisebaer

hi, uwe,

Quote
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

sschultewolter

#12
Dec 10, 2013, 11:08 am Last Edit: Dec 10, 2013, 11:10 am by sschultewolter Reason: 1
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
Keinen technischen Support über PN!

Eisebaer

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... :smiley-roll-blue:

gruß, stefan

mkl0815


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... :smiley-roll-blue:

made my day  XD

Go Up