Arduino Example: Police Lights with millis()
Based on a question from Anderw on the initial Multitasking with millis() tutorial, this example shows how to create a Police-Light like strobe effect. The following code uses no calls to delay().
Code also available via Pastebin.org.
// English for which LED to Strobe
#define RED 0x0
#define BLUE 0x1
// Variable to track which LED is on
byte whichLED = RED;
// Where are the LEDs connected?
const int LED_Red = 7;
const int LED_Blue = 11;
// State variables for the LEDs
byte Red_State = LOW;
byte Blue_State = LOW;
// Some delay values to change flashing behavior
unsigned long switchDelay = 250;
unsigned long strobeDelay = 50;
// Seed the initial wait for the strobe effect
unsigned long strobeWait = strobeDelay;
// Variable to see when we should swtich LEDs
unsigned long waitUntilSwitch = switchDelay; // seed initial wait
void setup() {
pinMode(LED_Red, OUTPUT);
pinMode(LED_Blue, OUTPUT);
}
void loop() {
digitalWrite(LED_Red, Red_State); // each iteration of loop() will set the IO pins,
digitalWrite(LED_Blue, Blue_State); // even if they don't change, that's okay
// Toggle back and forth between the two LEDs
if ((long)(millis() - waitUntilSwitch)>=0) {
// time is up!
Red_State = LOW;
Blue_State = LOW;
whichLED = !whichLED; // toggle LED to strobe
waitUntilSwitch += switchDelay;
}
// Create the stobing effect
if ((long)(millis() - strobeWait)>=0) {
if (whichLED == RED)
Red_State = !Red_State;
if (whichLED == BLUE)
Blue_State = !Blue_State;
strobeWait += strobeDelay;
}
}
State Variables
Red_State and Blue_State
Instead of using digitalWrite() directly, “state” variables are used to determine the state (on or off) of each LED. This allows logic inside the loop() to determine when the lights should be turned on or off. Each iteration of loop() will update the LEDs with a digitalWrite() based on this state variable.
whichLED
Using a couple of #define statements, this variable tracks which LED should be strobing at a given time. The #define statements are optional, but make the code easier to follow later on (Around line 46).
wait Variables
waitUntilSwitch
This variable tracks the millis() value needed before switching between the Red and Blue LED. It is incremented by switchDelay.
strobeWait
This variable determines the rate at for the currently strobing LED. It is incremented by strobeDelay. [Note: strobeDelay must be some multiple less than switchDelay for a strobe effect.]
millis() if-statements
Both of the millis() if-statements make use of millis() rollover handling, instead of trying to reset millis().
The millis() loops should be self-explanatory, after reading the millis() multitasking tutorial. The first if-statement (line 36) checks to see if it time to switch the active LED. It makes sure to disable both LEDs before setting a state, so one does not get “stuck on.”
The if-statement on line 45 independently controls the strobing of the active LED. This is why the #define statements were used at the top of the code. It makes it clearer to the reader that lines 46 and 48 are checking to see which LED is the active LED. [Note: A switch() statement would be appropriate if more than 2 LEDs were used in the sequence.]

[...] Police Light Strobe Effect: http://www.cmiyc.com/tutorials/arduino-example-police-lights-with-millis/ [...]
I will give that a try and try to add more lights at different rates. Thanks!
What is the >? It gives me an error..
Andrew
Checked code on other site and it was better..it should be a > symbol.
Sorry about that. I’m not sure what step in my publishing process introduces the change. The symbols < and > are used by HTML code, so one step in my process converts them into the symbol codes > and %lt;.
But, that’s why I also make the code available via Pastebin.