My diffuser is made of a ping pong ball, with a bit of filling to even out the light.
Code for the stepper is below: It's not 100% perfect, but it does the job ! :)
/** Serial RGB LED* ---------------* Serial commands control the brightness of R,G,B LEDs** Command structure is "<colorCode><colorVal>", where "colorCode" is* one of "r","g",or "b" and "colorVal" is a number 0 to 255.* E.g. "r0" turns the red LED off.* "g127" turns the green LED to half brightness* "b64" turns the blue LED to 1/4 brightness** Created 18 October 2006* copyleft 2006 Tod E. Kurt <tod@todbot.com* http://todbot.com/*/char serInString[100]; // array that will hold the different bytes of the string. 100=100characters;// -> you must state how long the array will be else it won't work properlychar colorCode;int colorVal;int rcolorVal;int gcolorVal;int bcolorVal;int redPin = 9; // Red LED, connected to digital pin 9int greenPin = 10; // Green LED, connected to digital pin 10int bluePin = 11; // Blue LED, connected to digital pin 11void setup() {pinMode(redPin, OUTPUT); // sets the pins as outputpinMode(greenPin, OUTPUT);pinMode(bluePin, OUTPUT);Serial.begin(9600);analogWrite(redPin, 50); // set them all to mid brightnessanalogWrite(greenPin, 50); // set them all to mid brightnessanalogWrite(bluePin, 50); // set them all to mid brightnessSerial.println("enter color command (e.g. 'r43') :");}void loop () {// clear the stringmemset(serInString, 0, 100);//read the serial port and create a string out of what you readreadSerialString(serInString);colorCode = serInString[0];if( colorCode == 'r' || colorCode == 'g' || colorCode == 'b' ) {colorVal = atoi(serInString+1);Serial.print("setting color ");Serial.print(colorCode);Serial.print(" to ");Serial.print(colorVal);Serial.println();serInString[0] = 10; // indicates we've used this stringif(colorCode == 'r' && colorVal == 0) {colorVal = (rcolorVal + 25);analogWrite(redPin, colorVal);rcolorVal = (rcolorVal + 25);}else if(colorCode =='r' && colorVal >1){analogWrite(redPin, colorVal);rcolorVal == colorVal;}if(colorCode == 'g' && colorVal == 0) {colorVal = (gcolorVal + 25);analogWrite(greenPin, colorVal);gcolorVal = (gcolorVal + 25);}else if(colorCode =='g' && colorVal >1){analogWrite(greenPin, colorVal);gcolorVal == colorVal;}if(colorCode == 'b' && colorVal == 0) {colorVal = (bcolorVal + 25);analogWrite(bluePin, colorVal);bcolorVal = (bcolorVal + 25);}else if(colorCode =='b' && colorVal >1){analogWrite(bluePin, colorVal);bcolorVal == colorVal;}//color statesSerial.print("red is at ");Serial.print(rcolorVal);Serial.println();Serial.print("green is at ");Serial.print(gcolorVal);Serial.println();Serial.print("blue is at ");Serial.print(bcolorVal);Serial.println();}delay(100); // wait a bit, for serial data}//read a string from the serial and store it in an array//you must supply the array variablevoid readSerialString (char *strArray) {int i = 0;if(!Serial.available()) {return;}while (Serial.available()) {strArray[i] = Serial.read();i++;}}