This is an extension to the learning loops example. I wired two potentiometers up to the analog inputs 0 and 1. From these I read the values to determine the delay and the brightness of the LEDs. In addition, the intensity of the LED's is faded instead of being just on/off as the wave moves back and forth. This requires using the PWM capable ports (5, 6, 9, 10, 11) for the LED outputs.
/* * Knight Rider Overkill * * By wiring a potentiometer to analog inputs 0 and 1 I can adjust the * speed and brightness. * * In ASCII art the extra wiring looks something like this: * * +-+ potentiometer * |0| * +-+ * / | \ * 5v | Gnd * | * inputPin */ int speedPin = 0; // pin to read the potentiometer for speed int intenPin = 1; // pin to read the potentiometer for brightness #define NUMLIGHTS 5 int pins[NUMLIGHTS] = { 5, 6, 9, 10, 11 }; void setup() { int lightPin; for (lightPin=0 ; lightPin < NUMLIGHTS ; lightPin++) { pinMode(pins[lightPin], OUTPUT); } } void loop() { static int pos = 0; // the position of the brightest light in the light array static int direction = 1; // the direction the bright spot is travelling (1 or -1) int light; int speed = analogRead(speedPin); // how fast the light moves int inten = analogRead(intenPin) >> 2; // read the value and divide by 4 to get range 0 .. 255 if (inten > 255) inten = 255; for (light=0 ; light < NUMLIGHTS ; light++) { if (light == pos) { // The light at this position is set bright analogWrite(pins[light], inten); } else if ( light == (pos+1) || light == (pos-1)) { // This makes the two lights adjacent to the bright one glow at reduced intensity. // It makes for a nicer effect analogWrite(pins[light], inten>>4); } else { // Digital I/O pins 5 & 6 don't seem to go dark if I do analogWrite(pins[light], 0) // By doing digitalWrite it all looks correct digitalWrite(pins[light], 0); } } // move the light position pos += direction; // if we've reached the end, reverse directions if (pos >= (NUMLIGHTS-1)) direction = -1; if (pos <= 0) direction = 1; delay(speed); }