// nice names for diagnostic LEDs
const byte periodicFlash = 0;
const byte sawButtonPress = 1;
const byte countedThree = 2;
// and where to hang them
const byte ledPins[] = {2, 3, 4};
const byte numLeds = sizeof ledPins / sizeof *ledPins;
const unsigned long flashTime = 75;
unsigned long ledOnTime[numLeds] = {0};
const byte myButton = 8;
void flash(byte which)
{
if (which >= numLeds)
return;
digitalWrite(ledPins[which], HIGH);
ledOnTime[which] = millis();
}
void serviceFlashes()
{
unsigned long now = millis();
for (byte i = 0; i < numLeds; i++) {
if (ledOnTime[i] && (now - ledOnTime[i] >= flashTime)) {
digitalWrite(ledPins[i], LOW);
ledOnTime[i] = 0;
}
}
}
void setup() {
for (byte ii = 0; ii < numLeds; ii++)
pinMode(ledPins[ii], OUTPUT);
pinMode(myButton, INPUT_PULLUP);
}
bool buttonState;
unsigned long bTimer;
unsigned long gTimer;
byte counter;
void loop() {
unsigned long now = millis();
serviceFlashes();
// flash something every once in awhile
if (now - gTimer > 777) {
flash(periodicFlash);
gTimer = now;
}
// flash something each debounced button press
bool buttonPress = false; // until proven elsewise
if (now - bTimer > 50) {
bool buttonReading = digitalRead(myButton) == LOW;
if (buttonState != buttonReading) {
if (buttonReading) {
flash(sawButtonPress);
counter++;
if (counter == 3) {
flash(countedThree);
counter = 0;
}
}
buttonState = buttonReading;
bTimer = now;
}
}
}