void loop( ) {
switch( state ) {
case 'O': if( digitalRead( start_button ) == HIGH ) {
state = 'G';
Timer = millis( );
digitalWrite( green_led, 0 ); // green on
}
break;
case 'G': if( (millis( ) - Timer) > green_to ) { // test for green timeout
state = 'Y';
Timer = millis( );
digitalWrite( green_led, 1 ); // green off
digitalWrite( yellow_led, 0 ); // yellow on
}
break;
case 'Y': if( (millis( ) - Timer) > yellow_to ) { // test for yellow timeout
state = 'R';
Timer = millis( );
digitalWrite( yellow_led, 1 ); // yellow off
digitalWrite( red_led, 0 ); // red on
}
break;
case 'R': if( (millis( ) - Timer) > red_blink_to ) { // test for red blink timeout
digitalWrite( red_led, !(digitalRead( red_led ) );
Timer = millis( );
}
break;
default: break;
}
if( digitalRead( stop_button ) == HIGH ) {
digitalWrite( red_led, 1 ); // red off
digitalWrite( yellow_led, 1 ); // yellow off
digitalWrite( green_led, 1 ); // green off
state = 'O'; // system off
}
}
Does this work?
Looks like you can get away without button debounce.