Forum: Mikrocontroller und Digitale Elektronik RGB-Farbwechsel (Moodlight)


von H. G. (ledi)


Lesenswert?

Hallo!

Ich steuere per Funk eine RGB-Led an.

Diese soll:

Bei Tastendruck 1 --> Farbwechsel mit R und B
Bei Tastendruck 2 --> Farbwechsel mit R und G
Bei Tastendruck 3 --> Farbwechsel mit G und B
Bei Tastendruck 4 --> Farbwechsel mit R, G und B (Hier sollen so 
ziemlich "alle" Farben von Rot bis Weiß durchlaufen werden.

Punkt 1 bis 3 habe ich hin bekommen. Bei Punkt 4 habe ich aber Probleme.

Kann mir hier jemand weiter helfen oder hat vielleicht jemand ein 
fertiges Codebeispiel in C?

Danke für Eure Hilfe!

von Mark B. (markbrandis)


Lesenswert?

Naja Du hast halt 7 verschiedene Zustände (8, wenn man dunkel mitzählt, 
aber dieser soll hier vielleicht nicht mit durchlaufen werden) und 
zeigst die der Reihe nach an? Ist im Endeffekt auch nix anderes als eine 
Binärzahl mit 3 Bits:

B G R
0 0 0 : dunkel
0 0 1 : R
0 1 0 : G
0 1 1 : RG
1 0 0 : B
1 0 1 : RB
1 1 0 : GB
1 1 1 : RGB

Natürlich kann die Reihenfolge beliebig sein und muss nicht den 
aufsteigenden Dezimalzahlen von 0 bis 7 (bzw. von 1 bis 7) entsprechen.

von Helfer (Gast)


Lesenswert?

Heimo, such dir mal ein Bild eines Farbdreiecks.
http://www.fotoseminare.org/fotoschule/jpg/CIE-farbraum-g.jpg

Bei den Aktionen 1-3 bist du immer auf den Kanten des RGB-Farbraums 
gelaufen. Du hast jeweils zwei Werte verändert z.B. R und G.

Bei der Aktion 4 musst du ungefähr durch die Mitte des RGB-Farbraums 
rennen, wenn du Weiss dabei haben willst. D.h. du veränderst 
gleichzeitig drei Werte (RGB)

von Mark B. (markbrandis)


Lesenswert?

Ach so, für jede Farbe (R, G, B) gibt es dann noch verschiedene 
Intensitäten?

von H. G. (ledi)


Lesenswert?

Nun ja, die Sache ist schon etwas komplexer.

(Die Farbwerte welche ich über die PWM-Kanäle des AT90PWM316 ausgebe, 
werden durch eine lineare Dimmung mittels 256-Werte der valuetable 
realisiert)
1
const unsigned int valuetable[256]=  // = logarithmische Werte
2
{           
3
  0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,
4
  2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,
5
  3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,
6
  5,5,5,5,5,6,6,6,6,6,7,7,7,7,8,8,
7
  8,8,9,9,9,9,10,10,10,11,11,12,12,12,13,13,
8
  14,14,15,15,15,16,17,17,18,18,19,19,20,21,21,22,
9
  23,24,24,25,26,27,28,29,30,31,32,33,34,35,36,37,
10
  39,40,41,43,44,45,47,48,50,52,53,55,57,59,61,63,
11
  65,67,69,72,74,77,79,82,84,87,90,93,96,99,103,106,
12
  110,113,117,121,125,129,133,138,142,147,152,157,162,168,173,179,
13
  185,191,197,204,210,217,225,232,240,248,256,264,273,282,292,301,
14
  311,322,332,343,355,366,379,391,404,417,431,446,460,476,491,508,
15
  525,542,560,579,598,618,638,659,681,704,727,751,776,802,828,856,
16
  884,913,944,975,1007,1041,1075,1111,1148,1186,1225,1266,1308,1351,1396,1442,
17
  1490,1539,1590,1643,1697,1754,1812,1872,1934,1998,2064,2133,2203,2277,2352,2430,
18
  2511,2594,2680,2769,2860,2955,3053,3154,3259,3367,3479,3594,3713,3836,3964,4095
19
};

Hier der C-Code für die Farbmischung 2er Farben:
1
if( Taste == 5 && Zaehler == 4 ) 
2
{
3
   OCR1SB = valuetable[ 0 ];
4
   OCR1SA = valuetable[ B + actEntry_B ];
5
   OCR0SA = valuetable[ R + actEntry_R ];
6
7
   if ( Increasing_B == 1)
8
   {     
9
        if( actEntry_B == 255) 
10
        {
11
           if( actEntry_R == 255)
12
           {
13
             Increasing_B = 0;
14
             Increasing_R = 0;
15
           }
16
           else
17
             actEntry_R++;
18
         }
19
         else
20
           actEntry_B++;
21
   }
22
      
23
   else 
24
   {
25
        if( actEntry_B == 0 ) 
26
        {
27
             Increasing_B = 1;
28
             actEntry_B = 1;
29
        }
30
        else 
31
        {
32
             actEntry_B--;
33
             _delay_ms(30);
34
             if ( actEntry_B == 0 )
35
            {
36
               Increasing_B = 1;
37
            }
38
        }      
39
   }
40
   for (i=0; i<time; ++i)
41
   {
42
       _delay_ms(1);
43
   }
44
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.