RGB-Farbwechsel (Moodlight)

OP #2138233
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!
#2138241
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.
Gast #2138245
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)
OP #2138287
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren