const unsigned PatternCountLimit = 500;
unsigned PatternDelays[PatternCountLimit];
unsigned PatternCount = 0;
const byte ButtonPin = 2;
const unsigned DebounceTime = 10;
boolean ButtonWasPressed = false;
unsigned long ButtonStateChangeTime = 0; // Debounce timer
void setup()
{
pinMode(ButtonPin, INPUT_PULLUP); // Button between Pin and Ground
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
unsigned long currentTime = millis();
unsigned timeSinceLastChange = currentTime - ButtonStateChangeTime;
boolean buttonIsPressed = digitalRead(ButtonPin) == LOW; // Active LOW
// Check for button state change and do debounce
if (buttonIsPressed != ButtonWasPressed &&
timeSinceLastChange > DebounceTime)
{
// Button state has changed
ButtonWasPressed = buttonIsPressed;
ButtonStateChangeTime = currentTime;
if (buttonIsPressed)
{
// Button was just pressed
if (PatternCount > 0 && PatternCount < PatternCountLimit)
{
PatternDelays[PatternCount++] = timeSinceLastChange;
}
}
else
{
// Button was just released
if (PatternCount < PatternCountLimit)
{
PatternDelays[PatternCount++] = timeSinceLastChange;
}
}
} // End button state change detection
// Has the button been released for 3 seconds?
if (PatternCount > 0 && !buttonIsPressed && timeSinceLastChange > 3000)
{
// Time to play back
digitalWrite(LED_BUILTIN, HIGH);
for (unsigned i = 0; i < PatternCount; i++)
{
delay(PatternDelays[i]);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // Toggle
}
digitalWrite(LED_BUILTIN, LOW);
PatternCount = 0; // reset for new pattern
}
}