You're not the first to ask. That's why I wrote this sketch I call DaftPunkLights:
const int CheekPins[] = {
3,4,5,6,7,8,9,8,7,6,5,4}; // gives forward and back
const int CHEEK_COUNT = sizeof CheekPins / sizeof (int);
const int CheekIntervals[] =
{
300, 300, 300, 300, 300, 300,
300, 300, 300, 300, 300, 300}
; // Milliseconds
unsigned long CheekTime = millis();
int CheekStep = 0;
const int ChinPins[] = {
10,11,12,13};
const int CHIN_COUNT = sizeof ChinPins / sizeof (int);
const int ChinIntervals[] = {
300, 300, 300, 300}
; // Milliseconds
unsigned long ChinTime = millis();
int ChinStep = 0;
void setup()
{
int i;
/* Cheek LED's */
for (i=0; i< CHEEK_COUNT; i++)
pinMode(CheekPins[i], OUTPUT); // Yes, it's OK to set the pinMode twice on some pins
/* Chin LED's */
for (i=0; i< CHIN_COUNT; i++)
pinMode(ChinPins[i], OUTPUT);
}
void loop()
{
// Do the cheek animation
if ((millis() - CheekTime) > CheekIntervals[CheekStep])
{
CheekTime = millis();
digitalWrite(CheekPins[CheekStep], LOW);
CheekStep = (CheekStep+1) % CHEEK_COUNT;
digitalWrite(CheekPins[CheekStep], HIGH);
}
// Do the chin animation
if ((millis() - ChinTime) > ChinIntervals[ChinStep])
{
ChinTime = millis();
digitalWrite(ChinPins[ChinStep], LOW);
ChinStep = (ChinStep+1) % CHIN_COUNT;
digitalWrite(ChinPins[ChinStep], HIGH);
}
}