Arduino LED RGB + CIE 1931 (Versió Pro)


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");
  }
}
✔ Copiat al portapapers