164 lines
2.8 KiB
Arduino
164 lines
2.8 KiB
Arduino
|
|
||
|
|
||
|
void setup() {
|
||
|
|
||
|
Serial.begin(9600);
|
||
|
|
||
|
delay(5000);
|
||
|
|
||
|
rgb2rgbw(0, 255, 0);
|
||
|
rgb2rgbw(255, 255, 255);
|
||
|
rgb2rgbw(100, 100, 100);
|
||
|
rgb2rgbw(255, 100, 100);
|
||
|
rgb2rgbw(50, 100, 200);
|
||
|
rgb2rgbw(63, 212, 255); // 46, 153, 184, 70
|
||
|
}
|
||
|
|
||
|
// the loop function runs over and over again forever
|
||
|
|
||
|
|
||
|
void loop() {
|
||
|
|
||
|
uint8_t* pixel = rgb2rgbw_(255,79,79);
|
||
|
// MAX: 189, 59, 59, 65
|
||
|
// Serial Print: 176, 0, 0, 79
|
||
|
|
||
|
SerialUSB.print(pixel[0]);
|
||
|
SerialUSB.print(" ");
|
||
|
SerialUSB.print(pixel[1]);
|
||
|
SerialUSB.print(" ");
|
||
|
SerialUSB.print(pixel[2]);
|
||
|
SerialUSB.print(" ");
|
||
|
SerialUSB.println(pixel[3]);
|
||
|
|
||
|
delay(1000);
|
||
|
}
|
||
|
|
||
|
// La buena es esta:
|
||
|
// W = (1-sat)*(r+g+b)/3
|
||
|
// Ro = Ri*(1-Wo)
|
||
|
// ...
|
||
|
// Hay que pasar antes a HSV para sacar la saturacion
|
||
|
|
||
|
/* VERSION EN JAVASCRIPT QUE PARECE QUE FUNCIONA
|
||
|
|
||
|
function rgb2Rgbw(r,g,b){
|
||
|
var m = r < g ? (r < b ? r : b) : (g < b ? g : b);
|
||
|
return {
|
||
|
r:r-m,
|
||
|
g:g-m,
|
||
|
b:b-m,
|
||
|
w:m
|
||
|
};
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
uint8_t* rgb2rgbw_ (uint8_t Ri, uint8_t Gi, uint8_t Bi) // esta no es muy precisa
|
||
|
{
|
||
|
uint8_t Wo, Ro, Go, Bo;
|
||
|
static uint8_t pixel[4];
|
||
|
|
||
|
Wo = Ri < Gi ? (Ri < Bi ? Ri : Bi) : (Gi < Bi ? Gi : Bi);
|
||
|
|
||
|
Ro = Ri - Wo;
|
||
|
Go = Gi - Wo;
|
||
|
Bo = Bi - Wo;
|
||
|
|
||
|
pixel[0] = Ro;
|
||
|
pixel[1] = Go;
|
||
|
pixel[2] = Bo;
|
||
|
pixel[3] = Wo;
|
||
|
|
||
|
return pixel;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
int rgb2rgbw (int Ri, int Gi, int Bi) // esta no es muy precisa
|
||
|
{
|
||
|
int Wo, Ro, Go, Bo;
|
||
|
|
||
|
//Wo = min(min(Ri, Gi), Bi) ;
|
||
|
Wo = Ri < Gi ? (Ri < Bi ? Ri : Bi) : (Gi < Bi ? Gi : Bi);
|
||
|
|
||
|
Ro = Ri - Wo;
|
||
|
Go = Gi - Wo;
|
||
|
Bo = Bi - Wo;
|
||
|
|
||
|
SerialUSB.print("Ri: ");
|
||
|
SerialUSB.print(Ri);
|
||
|
SerialUSB.print(" Gi: ");
|
||
|
SerialUSB.print(Gi);
|
||
|
SerialUSB.print(" Bi: ");
|
||
|
SerialUSB.println(Bi);
|
||
|
|
||
|
SerialUSB.print("Ro: ");
|
||
|
SerialUSB.print(Ro);
|
||
|
SerialUSB.print(" Go: ");
|
||
|
SerialUSB.print(Go);
|
||
|
SerialUSB.print(" Bo: ");
|
||
|
SerialUSB.print(Bo);
|
||
|
SerialUSB.print(" Wo: ");
|
||
|
SerialUSB.println(Wo);
|
||
|
SerialUSB.println();
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
// esta no es muy precisa
|
||
|
int rgb2rgbw (int Ri, int Gi, int Bi)
|
||
|
{
|
||
|
int Wo, K, Q, Ro, Go, Bo;
|
||
|
|
||
|
int M = max(max(Ri, Gi), Bi);
|
||
|
int m = min(min(Ri, Gi), Bi);
|
||
|
|
||
|
if ( (m / M) < 0.5 )
|
||
|
{
|
||
|
Wo = (m * M) / (M - m);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Wo = M;
|
||
|
}
|
||
|
|
||
|
SerialUSB.print("Wo: ");
|
||
|
SerialUSB.println(Wo);
|
||
|
|
||
|
//Wo = if (m/M < 0.5) use ( (m*M) / (M-m) ) else M
|
||
|
|
||
|
Q = 255;
|
||
|
K = (Wo + M) / (m+1) ;
|
||
|
|
||
|
SerialUSB.print("K: ");
|
||
|
SerialUSB.println(K);
|
||
|
|
||
|
Ro = floor( ( ( K * Ri ) - Wo ) / Q );
|
||
|
Go = floor( ( ( K * Gi ) - Wo ) / Q );
|
||
|
Bo = floor( ( ( K * Bi ) - Wo ) / Q );
|
||
|
|
||
|
SerialUSB.print("Ri: ");
|
||
|
SerialUSB.print(Ri);
|
||
|
SerialUSB.print(" Gi: ");
|
||
|
SerialUSB.print(Gi);
|
||
|
SerialUSB.print(" Bi: ");
|
||
|
SerialUSB.println(Bi);
|
||
|
|
||
|
SerialUSB.print("Ro: ");
|
||
|
SerialUSB.print(Ro);
|
||
|
SerialUSB.print(" Go: ");
|
||
|
SerialUSB.print(Go);
|
||
|
SerialUSB.print(" Bo: ");
|
||
|
SerialUSB.print(Bo);
|
||
|
SerialUSB.print(" Wo: ");
|
||
|
SerialUSB.println(Wo);
|
||
|
|
||
|
return Wo;
|
||
|
|
||
|
}
|
||
|
*/
|