Adapted some code from lady ada and modified it slighty, also adapted code from a forum member notrabdrahcir (his fading code works quite well!)
Anyways I just combined the 2, modified a little bit:
int redVal = 1; // Variables to store the values to send to the pins
int greenVal = 1; // Initial values are all off
int blueVal = 1;
int i = 0; // Loop counter
int wait = 15; // 50ms (.05 second) delay; shorten for faster fades
int switchPin = 2; // pushbutton on digital pin 2
int redPin = 5; // RGB cathode leg to digital pin 5
int greenPin = 6; // RGB cathode leg to digital pin 6
int bluePin = 3; // RGB cathode leg to digital pin 3
int val;
int val2;
int buttonState;
int lightMode = 0;
void setup()
{
pinMode(switchPin, INPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(9600);
buttonState = digitalRead(switchPin);
}
void loop(){
val = digitalRead(switchPin);
delay(10);
val2 = digitalRead(switchPin);
if (val == val2) {
if (val != buttonState) {
if (val == LOW) {
if (lightMode == 0) {
lightMode = 1;
}
else {
if (lightMode == 1) {
lightMode = 2;
}
else {
if (lightMode == 2) {
lightMode = 3;
}
else {
if (lightMode == 3) {
lightMode = 4;
}
else {
lightMode = 0;
}
}
}
}
}
}
buttonState = val;
}
//
if (lightMode == 0) {
analogWrite(redPin, 0);
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
}
if (lightMode == 1) { // RED
analogWrite(redPin, 255);
analogWrite(bluePin, 255);
analogWrite(greenPin, 0);
}
if (lightMode == 2) { // BLUE
analogWrite(redPin, 255);
analogWrite(bluePin, 0);
analogWrite(greenPin, 255);
}
if (lightMode == 3) { // GREEN
analogWrite(redPin, 0);
analogWrite(greenPin, 255);
analogWrite(bluePin, 255);
}
if (lightMode == 4) {
i += 1; // Increment counter
{
redVal =((i<255)*i)+((i>=255)*255)+((i>511)*(512-i))+((i>766)*(i-766))+((i>=1276)*(i-1276))+((i>1530)*(1530-i))+((i>1786)*(1786-i));
greenVal =(i<256)*(1)+(i>255)*(i-255)+(i>510)*(510-i)+(i>1020)*(1020-i)+(i>1274)*(i-1274)+(i>1530)*(i-1531)+(i>1785)*(3571-(2*i));
blueVal =(i<764)*(1)+(i>765)*(i-765)+(i>1020)*(1020-i)+(i>1786)*(1786-i);
}
if (i > 2040) //
{
i = 1;
}
// we do "255-redVal" instead of just "redVal" because the
// LEDs are hooked up to +5V instead of Gnd
analogWrite(redPin, redVal); // Write current values to LED pins
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
delay(wait); // Pause for 'wait' milliseconds before resuming the loop
}
}