Christmas light controller - Button Issue

Greetings All,

I'm trying to put together a multi-mode Christmas light controller.

Currently I have the wiring and sketch working, but I do have one issue.

It can sometimes take several button presses in order for the mode to change. It's almost as if I have to perfectly time the button press. Is there anything I can do to remove this problem?

//original code by jgueydan
//modified to suit
//Multi-Mode Christmas light controller
//Ver 1.0 basic modes

int counter = 1; //starting mode
int switchPin = A0;
int ch1 = 2;
int ch2 = 3;
int ch3 = 4;
int ch4 = 5;
int ch5 = 6;
int ch6 = 7;
int ch7 = 8;
int ch8 = 9;
int ch9 = 10;
int ch10 = 11;
int ch11 = 12;
int ch12 = 13;

void setup()
{
pinMode(A0, INPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}

void loop() {
//Handle input
int switchVal = digitalRead(switchPin);
if(switchVal == HIGH)
{
delay(500);
counter ++;
//Reset count if over max mode number
if(counter == 8)
{
counter = 1;
}
}

else
//Change mode
switch (counter) {
case 1: //all off
digitalWrite(ch1, LOW);
digitalWrite(ch2, LOW);
digitalWrite(ch3, LOW);
digitalWrite(ch4, LOW);
digitalWrite(ch5, LOW);
digitalWrite(ch6, LOW);
digitalWrite(ch7, LOW);
digitalWrite(ch8, LOW);
digitalWrite(ch9, LOW);
digitalWrite(ch10, LOW);
digitalWrite(ch11, LOW);
digitalWrite(ch12, LOW);
break;
case 2: //all on
digitalWrite(ch1, HIGH);
digitalWrite(ch2, HIGH);
digitalWrite(ch3, HIGH);
digitalWrite(ch4, HIGH);
digitalWrite(ch5, HIGH);
digitalWrite(ch6, HIGH);
digitalWrite(ch7, HIGH);
digitalWrite(ch8, HIGH);
digitalWrite(ch9, HIGH);
digitalWrite(ch10, HIGH);
digitalWrite(ch11, HIGH);
digitalWrite(ch12, HIGH);
break;
case 3: //slow blink
digitalWrite(ch1, HIGH);
digitalWrite(ch2, HIGH);
digitalWrite(ch3, HIGH);
digitalWrite(ch4, HIGH);
digitalWrite(ch5, HIGH);
digitalWrite(ch6, HIGH);
digitalWrite(ch7, HIGH);
digitalWrite(ch8, HIGH);
digitalWrite(ch9, HIGH);
digitalWrite(ch10, HIGH);
digitalWrite(ch11, HIGH);
digitalWrite(ch12, HIGH);
delay(1000);
digitalWrite(ch1, LOW);
digitalWrite(ch2, LOW);
digitalWrite(ch3, LOW);
digitalWrite(ch4, LOW);
digitalWrite(ch5, LOW);
digitalWrite(ch6, LOW);
digitalWrite(ch7, LOW);
digitalWrite(ch8, LOW);
digitalWrite(ch9, LOW);
digitalWrite(ch10, LOW);
digitalWrite(ch11, LOW);
digitalWrite(ch12, LOW);
delay(1000);
break;
case 4: //fast blink
digitalWrite(ch1, HIGH);
digitalWrite(ch2, HIGH);
digitalWrite(ch3, HIGH);
digitalWrite(ch4, HIGH);
digitalWrite(ch5, HIGH);
digitalWrite(ch6, HIGH);
digitalWrite(ch7, HIGH);
digitalWrite(ch8, HIGH);
digitalWrite(ch9, HIGH);
digitalWrite(ch10, HIGH);
digitalWrite(ch11, HIGH);
digitalWrite(ch12, HIGH);
delay(500);
digitalWrite(ch1, LOW);
digitalWrite(ch2, LOW);
digitalWrite(ch3, LOW);
digitalWrite(ch4, LOW);
digitalWrite(ch5, LOW);
digitalWrite(ch6, LOW);
digitalWrite(ch7, LOW);
digitalWrite(ch8, LOW);
digitalWrite(ch9, LOW);
digitalWrite(ch10, LOW);
digitalWrite(ch11, LOW);
digitalWrite(ch12, LOW);
delay(500);
break;
case 5: //slow chase
digitalWrite(ch1, HIGH);
delay(250);
digitalWrite(ch1, LOW);
digitalWrite(ch2, HIGH);
delay(250);
digitalWrite(ch2, LOW);
digitalWrite(ch3, HIGH);
delay(250);
digitalWrite(ch3, LOW);
digitalWrite(ch4, HIGH);
delay(250);
digitalWrite(ch4, LOW);
digitalWrite(ch5, HIGH);
delay(250);
digitalWrite(ch5, LOW);
digitalWrite(ch6, HIGH);
delay(250);
digitalWrite(ch6, LOW);
digitalWrite(ch7, HIGH);
delay(250);
digitalWrite(ch7, LOW);
digitalWrite(ch8, HIGH);
delay(250);
digitalWrite(ch8, LOW);
digitalWrite(ch9, HIGH);
delay(250);
digitalWrite(ch9, LOW);
digitalWrite(ch10, HIGH);
delay(250);
digitalWrite(ch10, LOW);
digitalWrite(ch11, HIGH);
delay(250);
digitalWrite(ch11, LOW);
digitalWrite(ch12, HIGH);
delay(250);
digitalWrite(ch12, LOW);
break;
case 6: //fast chase
digitalWrite(ch1, HIGH);
delay(100);
digitalWrite(ch1, LOW);
digitalWrite(ch2, HIGH);
delay(100);
digitalWrite(ch2, LOW);
digitalWrite(ch3, HIGH);
delay(100);
digitalWrite(ch3, LOW);
digitalWrite(ch4, HIGH);
delay(100);
digitalWrite(ch4, LOW);
digitalWrite(ch5, HIGH);
delay(100);
digitalWrite(ch5, LOW);
digitalWrite(ch6, HIGH);
delay(100);
digitalWrite(ch6, LOW);
digitalWrite(ch7, HIGH);
delay(100);
digitalWrite(ch7, LOW);
digitalWrite(ch8, HIGH);
delay(100);
digitalWrite(ch8, LOW);
digitalWrite(ch9, HIGH);
delay(100);
digitalWrite(ch9, LOW);
digitalWrite(ch10, HIGH);
delay(100);
digitalWrite(ch10, LOW);
digitalWrite(ch11, HIGH);
delay(100);
digitalWrite(ch11, LOW);
digitalWrite(ch12, HIGH);
delay(100);
digitalWrite(ch12, LOW);
delay(250);
break;
case 7:
break;
}
}

"Is there anything I can do to remove the problem" - Yes indeed there is. Correct the program.

The problem is the way you do inut and too much use of delay() all through the program.

You test if the switch is down, and every 1/2 second you increment the counter. So you have to time the release to be 1/4 or 3/4 or 5/4 or 7/4 ... seconds long after the push to know how many step you have advanced. Once you let go the sequence starts. And it does not check the button again, before one sequence is done, and it starts to repeat. If you miss that, you have to wait one more loop. If you push down the button in a sequence then the program will see it as a push the moment the sequence completes (when presumably al llLEDS are off ) and you have to do you 1/2 second counting.

You need to rearrange the program, read the "Blink without delay", implement a state machine to do your sequences and so on to correctly solve the problem.

What Msquare said and use [ code] [ /code] tags when posting code.
See the hash button above the message input box.