const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
const int ldrPin = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int wavelength = 380; // Start at 380nm
  while (wavelength <= 780) { // Scan up to 780nm
    // Convert wavelength to RGB values
    int redValue = getRGBValue(wavelength, 'R');
    int greenValue = getRGBValue(wavelength, 'G');
    int blueValue = getRGBValue(wavelength, 'B');

    // Set RGB LED values
    analogWrite(redPin, redValue);
    analogWrite(greenPin, greenValue);
    analogWrite(bluePin, blueValue);

    // Read LDR sensor value and print to serial monitor
    int ldrValue = analogRead(ldrPin);
    Serial.print("Wavelength: ");
    Serial.print(wavelength);
    Serial.print("nm, LDR Value: ");
    Serial.println(ldrValue);

    wavelength++; // Increment wavelength
    delay(100); // Delay for stability
  }
}

// Convert wavelength to RGB values
int getRGBValue(int wavelength, char color) {
  double gamma = 0.8;
  double factor = 0.1;
  double R, G, B;
  if (wavelength < 380 || wavelength > 780) {
    return 0;
  }
  if (wavelength >= 380 && wavelength < 440) {
    R = -(wavelength - 440) / (440 - 380);
    G = 0;
    B = 1;
  } else if (wavelength >= 440 && wavelength < 490) {
    R = 0;
    G = (wavelength - 440) / (490 - 440);
    B = 1;
  } else if (wavelength >= 490 && wavelength < 510) {
    R = 0;
    G = 1;
    B = -(wavelength - 510) / (510 - 490);
  } else if (wavelength >= 510 && wavelength < 580) {
    R = (wavelength - 510) / (580 - 510);
    G = 1;
    B = 0;
  } else if (wavelength >= 580 && wavelength < 645) {
    R = 1;
    G = -(wavelength - 645) / (645 - 580);
    B = 0.0;
  } else if (wavelength >= 645 && wavelength < 781) {
    R = 1;
    G = 0;
    B = 0;
  }
  if (color == 'R') {
    return 255 * pow(R, gamma);
  } else if (color == 'G') {
    return 255 * pow(G, gamma);
  } else if (color == 'B') {
    return 255 * pow(B, gamma);
  }
}