const int pinR = 9;
const int pinG = 10;
const int pinB = 11;
float gammaCorrect(float c){
if (c <= 0.04045)
return c / 12.92;
else
return pow((c + 0.055) / 1.055, 2.4);
}
void rgbToXYZ(int r,int g,int b,float &X,float &Y,float &Z){
float R = gammaCorrect(r/255.0);
float G = gammaCorrect(g/255.0);
float B = gammaCorrect(b/255.0);
X = R*0.4124 + G*0.3576 + B*0.1805;
Y = R*0.2126 + G*0.7152 + B*0.0722;
Z = R*0.0193 + G*0.1192 + B*0.9505;
}
float xyToWavelength(float x,float y){
float angle = atan2(y-0.33,x-0.33);
float deg = angle*180/PI;
if(deg<0) deg+=360;
if(deg<=270)
return 380+(deg/270.0)*(750-380);
else
return 0;
}
void setup(){
pinMode(pinR,OUTPUT);
pinMode(pinG,OUTPUT);
pinMode(pinB,OUTPUT);
Serial.begin(9600);
Serial.println("Introdueix RGB: R,G,B");
}
void loop(){
if(Serial.available()){
String input = Serial.readStringUntil('\n');
int r,g,b;
sscanf(input.c_str(),"%d,%d,%d",&r,&g,&b);
analogWrite(pinR,r);
analogWrite(pinG,g);
analogWrite(pinB,b);
float X,Y,Z;
rgbToXYZ(r,g,b,X,Y,Z);
float sum=X+Y+Z;
float x=X/sum;
float y=Y/sum;
float wavelength=xyToWavelength(x,y);
Serial.print("RGB: ");
Serial.print(r);Serial.print(",");
Serial.print(g);Serial.print(",");
Serial.println(b);
Serial.print("Longitud ona aprox: ");
Serial.print(wavelength);
Serial.println(" nm");
}
}