I have this code for a police flasher with different flashing methods. i have got multiple flashing methods in one code and have a button to switch between the different methods. i have got the button to work but because i am using the delay() function, it limits me to when i can press the button. please help and what other method could i use for a delay that wont interfere with the button use.
int ledPins[] = {2,3,4,5,6,7,8,9}; //An array to hold the pin each LED is connected to
int delays = 50;
int off = LOW;
int on = HIGH;
int amber = 2;
int amber2 = 3;
int amber3 = 4;
int amber4 = 5;
int white = 6;
int white2 = 7;
int white3 = 8;
int white4 = 9; //i.e. LED #0 is connected to pin 2, LED #1, 3 and so on
//to address an array use ledPins[0] this would equal 2
//and ledPins[7] would equal 9
int buttonPin = 12; // button pin variable, we will be using pin 11
int val = 0; // variable to read button pin value
int sequence = 1; // variable to hold current sequence
/*
* setup() - this function runs once when you turn your Arduino on
* We the three control pins to outputs
*/
void setup()
{
//Set each pin connected to an LED to output mode (pulling high (on) or low (off)
for(int i = 0; i < 8; i++){ //this is a loop and will repeat eight times
pinMode(ledPins[i],OUTPUT);
pinMode(amber, OUTPUT);
pinMode(amber2, OUTPUT);
pinMode(amber3, OUTPUT);
pinMode(amber4, OUTPUT);
pinMode(white, OUTPUT);
pinMode(white2, OUTPUT);
pinMode(white3, OUTPUT);
pinMode(white4, OUTPUT); //we use this to set each LED pin to output
} //the code this replaces is below
pinMode(buttonPin, INPUT); // set button pin to be an input
/* (commented code will not run)
* these are the lines replaced by the for loop above they do exactly the
* same thing the one above just uses less typing
pinMode(ledPins[0],OUTPUT);
pinMode(ledPins[1],OUTPUT);
pinMode(ledPins[2],OUTPUT);
pinMode(ledPins[3],OUTPUT);
pinMode(ledPins[4],OUTPUT);
pinMode(ledPins[5],OUTPUT);
pinMode(ledPins[6],OUTPUT);
pinMode(ledPins[7],OUTPUT);
(end of commented code)*/
}
/*
* loop() - this function will start after setup finishes and then repeat
* we call a function called oneAfterAnother(). if you would like a different behaviour
* uncomment (delete the two slashes) one of the other lines
*/
void loop() // run over and over again
{
// oneAfterAnotherNoLoop(); //this will turn on each LED one by one then turn each off
//oneAfterAnotherLoop(); //does the same as oneAfterAnotherNoLoop but with
//much less typing
//oneOnAtATime(); //this will turn one LED on then turn the next one
//on turning the
//former off (one LED will look like it is scrolling
//along the line
//inAndOut(); //lights the two middle LEDs then moves them out then back
//in again
// check if button pressed
val = digitalRead(buttonPin);
if(val == LOW)
{
if(sequence == 3) // if sequence is at 3 already, make it 1 again
{
sequence = 1;
} else
{
sequence++; // otherwise go to the next sequence
}
}
switch(sequence)
{
case 1:
oneAfterAnotherNoLoop();
break;
case 2:
oneOnAtATime();
break;
case 3:
inAndOut();
break;
}
}
/*
* oneAfterAnotherNoLoop() - Will light one LED then delay for delayTime then light
* the next LED until all LEDs are on it will then turn them off one after another
*
* this does it without using a loop which makes for a lot of typing.
* oneOnAtATimeLoop() does exactly the same thing with less typing
*/
void oneAfterAnotherNoLoop(){
digitalWrite(amber, on);
digitalWrite(amber2, on);
digitalWrite(amber3, on);
digitalWrite(amber4, on);
delay(delays);
digitalWrite(amber, off);
digitalWrite(amber2, off);
digitalWrite(amber3, off);
digitalWrite(amber4, off);
delay(delays);
digitalWrite(amber, on);
digitalWrite(amber2, on);
digitalWrite(amber3, on);
digitalWrite(amber4, on);
delay(delays);
digitalWrite(amber, off);
digitalWrite(amber2, off);
digitalWrite(amber3, off);
digitalWrite(amber4, off);
delay(delays);
digitalWrite(amber, on);
digitalWrite(amber2, on);
digitalWrite(amber3, on);
digitalWrite(amber4, on);
delay(delays);
digitalWrite(amber, off);
digitalWrite(amber2, off);
digitalWrite(amber3, off);
digitalWrite(amber4, off);
delay(delays);
digitalWrite(white, on);
digitalWrite(white2, on);
digitalWrite(white3, on);
digitalWrite(white4, on);
delay(delays);
digitalWrite(white, off);
digitalWrite(white2, off);
digitalWrite(white3, off);
digitalWrite(white4, off);
delay(delays);
digitalWrite(white, on);
digitalWrite(white2, on);
digitalWrite(white3, on);
digitalWrite(white4, on);
delay(delays);
digitalWrite(white, off);
digitalWrite(white2, off);
digitalWrite(white3, off);
digitalWrite(white4, off);
delay(delays);
digitalWrite(white, on);
digitalWrite(white2, on);
digitalWrite(white3, on);
digitalWrite(white4, on);
delay(delays);
digitalWrite(white, off);
digitalWrite(white2, off);
digitalWrite(white3, off);
digitalWrite(white4, off);
delay(delays);
}
/*
* oneAfterAnotherLoop() - Will light one LED then delay for delayTime then light
* the next LED until all LEDs are on it will then turn them off one after another
*
* this does it using a loop which makes for a lot less typing.
* than oneOnAtATimeNoLoop() does exactly the same thing with less typing
*/
void oneAfterAnotherLoop(){
int delayTime = 100; //the time (in milliseconds) to pause between LEDs
//make smaller for quicker switching and larger for slower
//Turn Each LED on one after another
for(int i = 0; i <= 7; i++){
digitalWrite(ledPins[i], HIGH); //Turns on LED #i each time this runs i
delay(delayTime); //gets one added to it so this will repeat
} //8 times the first time i will = 0 the final
//time i will equal 7;
//Turn Each LED off one after another
for(int i = 7; i >= 0; i--){ //same as above but rather than starting at 0 and counting up
//we start at seven and count down
digitalWrite(ledPins[i], LOW); //Turns off LED #i each time this runs i
delay(delayTime); //gets one subtracted from it so this will repeat
} //8 times the first time i will = 7 the final
//time it will equal 0
}
/*
* oneOnAtATime() - Will light one LED then the next turning off all the others
*/
void oneOnAtATime(){
digitalWrite(amber, on);
digitalWrite(amber2, on);
digitalWrite(amber3, on);
digitalWrite(amber4, on);
delay(delays);
digitalWrite(amber, off);
digitalWrite(amber2, off);
digitalWrite(amber3, off);
digitalWrite(amber4, off);
delay(delays);
digitalWrite(amber, on);
digitalWrite(amber2, on);
digitalWrite(amber3, on);
digitalWrite(amber4, on);
delay(delays);
digitalWrite(amber, off);
digitalWrite(amber2, off);
digitalWrite(amber3, off);
digitalWrite(amber4, off);
delay(delays);
digitalWrite(amber, on);
digitalWrite(amber2, on);
digitalWrite(amber3, on);
digitalWrite(amber4, on);
delay(delays);
digitalWrite(amber, off);
digitalWrite(amber2, off);
digitalWrite(amber3, off);
digitalWrite(amber4, off);
delay(delays);
digitalWrite(white, on);
digitalWrite(white2, on);
digitalWrite(white3, on);
digitalWrite(white4, on);
delay(delays);
digitalWrite(white, off);
digitalWrite(white2, off);
digitalWrite(white3, off);
digitalWrite(white4, off);
delay(delays);
}