Lab_interaccio/2018/LLAC-RGBW-varios/FASTLED/rgb2rgbw/rgb2rgbw.ino

164 lines
2.8 KiB
Arduino
Raw Normal View History

2025-02-25 21:29:42 +01:00
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;
}
*/