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!
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.
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)
Ach so, für jede Farbe (R, G, B) gibt es dann noch verschiedene Intensitäten?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.