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; } */