Jaz sem to rešil drugače. Se pač požvižgaš na to, koliko je nivoev posamezne barve (R,G, B). Operiraš pa s HSB (Hue, Sat, Brightness). To je veliko bolj "naravno".
Tole je implementacija te ideje...
- Koda: Izberi vse
#include <stdio.h>
#include <math.h>
// Function to convert HSB to RGB
void HSBtoRGB(float hue, float saturation, float brightness, int *r, int *g, int *b) {
float chroma = brightness * saturation; // Max difference of RGB values
float h_prime = fmod(hue / 60.0, 6); // Hue sector
float x = chroma * (1 - fabs(fmod(h_prime, 2) - 1));
float m = brightness - chroma;
float r1, g1, b1; // Intermediate RGB values
if (h_prime < 1) {
r1 = chroma;
g1 = x;
b1 = 0;
} else if (h_prime < 2) {
r1 = x;
g1 = chroma;
b1 = 0;
} else if (h_prime < 3) {
r1 = 0;
g1 = chroma;
b1 = x;
} else if (h_prime < 4) {
r1 = 0;
g1 = x;
b1 = chroma;
} else if (h_prime < 5) {
r1 = x;
g1 = 0;
b1 = chroma;
} else {
r1 = chroma;
g1 = 0;
b1 = x;
}
// Adjust and scale to 8-bit RGB
*r = (int)((r1 + m) * 255);
*g = (int)((g1 + m) * 255);
*b = (int)((b1 + m) * 255);
}
Hue: predstavlja barvo (color wheel) (0-360°). Barvo "spraviš" v ta rang lahko s funkcijo fmod(hue, 360)
Saturation: intenzivnost od 0.0 (sivo) do 1.0 (full color).
Brightness: Jakost (osvetljenost) od 0.0 (povsem temno) do 1.0 (polna osvetlitev).
Vedeti pa moraš, da te RGB LED ponavadi nimajo 1:1 nastavitev registra proti svetilnosti. Jaz sem to rešil z lookup tabelo. PWM sem nastavil, da je delal med 0 (0%) in 300 (100%). Pretvorba pa ni linearna, ker je občutljivost očesa nelinearna. Tole je moja tabela za pretvorbo, lahko si jo pa poljubno skaliraš za lastne potrebe:
- Koda: Izberi vse
0 ,
0 ,
0 ,
1 ,
2 ,
2 ,
3 ,
3 ,
4 ,
4 ,
5 ,
6 ,
6 ,
7 ,
8 ,
8 ,
9 ,
10 ,
11 ,
12 ,
12 ,
13 ,
14 ,
15 ,
16 ,
17 ,
18 ,
19 ,
20 ,
21 ,
22 ,
24 ,
25 ,
26 ,
27 ,
29 ,
30 ,
32 ,
33 ,
34 ,
36 ,
38 ,
39 ,
41 ,
43 ,
45 ,
46 ,
48 ,
50 ,
52 ,
54 ,
56 ,
59 ,
61 ,
63 ,
66 ,
68 ,
71 ,
73 ,
76 ,
79 ,
82 ,
85 ,
88 ,
91 ,
94 ,
98 ,
101 ,
105 ,
108 ,
112 ,
116 ,
120 ,
124 ,
129 ,
133 ,
138 ,
142 ,
147 ,
152 ,
157 ,
162 ,
168 ,
173 ,
179 ,
185 ,
191 ,
198 ,
204 ,
211 ,
218 ,
225 ,
232 ,
240 ,
248 ,
256 ,
264 ,
272 ,
281 ,
290 ,
300 ,
};
Če pogledaš
tole spletno stran je gor en trikoten demo board. No, to sem naredil s to funkcijo