int LED_PIN = 5; int BUTTON_PIN = 8; volatile int userClickCount = 0; volatile unsigned long lastClickTimestamp = 0; int debounceThresholdInMilliseconds = 250; void setup() { Serial.begin(9600); enableOutputOn(LED_PIN); enableInputOn(BUTTON_PIN); digitalWrite(BUTTON_PIN, LOW); // enable internal pull-up resistor attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), changeState, FALLING); blinkWelcome(); } void changeState(){ if(validClick()){ userClickCount++; Serial.print("valid click: "); Serial.println(userClickCount); }else{ Serial.println("skipping fake signal"); } } boolean validClick(){ boolean isValid = false; unsigned long now = millis(); long timeElapsedSinceLastClick = now - lastClickTimestamp; if(timeElapsedSinceLastClick > debounceThresholdInMilliseconds){ isValid = true; }else{ } lastClickTimestamp = millis(); return isValid; } void loop() { delay(2000); blinkFast(userClickCount); } void enableOutputOn(int pin){ pinMode(pin, OUTPUT); } void enableInputOn(int pin){ pinMode(pin, INPUT); } void blinkWelcome(){ blinkFast(5); delay(1000); } void blinkFast(int count){ blink(count, 150); } void blink(int count, int delayMillis){ for(int i = 0; i < count; i++) { blinkOnce(delayMillis); } } void blinkOnce(int delayMillis){ digitalWrite(LED_PIN, HIGH); delay(delayMillis); digitalWrite(LED_PIN, LOW); delay(delayMillis); }