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); } } Wavelength to RGB Converter