constexpr int8_t pushButtonPin = 2;
constexpr int8_t ledPin = 3;
int count = 0;
uint32_t lastDebounceTime = 0;
constexpr uint32_t debounceDelay = 10;
enum pushButtonStates : int8_t {
PRESSED = 0,
RELEASED = 1
};
volatile pushButtonStates pushButtonStatus = RELEASED;
volatile bool stateChanged = false;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(pushButtonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(pushButtonPin), updateState, CHANGE);
}
void updateState() {
uint32_t currentTime = millis();
pushButtonStates currentState = (pushButtonStates)digitalRead(pushButtonPin);
if (currentState != pushButtonStatus && (currentTime - lastDebounceTime) > debounceDelay) {
lastDebounceTime = currentTime;
pushButtonStatus = currentState;
stateChanged = true; // Indicate that the state has changed
}
}
void loop() {
if (stateChanged) {
stateChanged = false; // Reset state change indicator
switch (pushButtonStatus) {
case PRESSED:
digitalWrite(ledPin, HIGH);
Serial.println(++count);
break;
case RELEASED:
digitalWrite(ledPin, LOW);
break;
}
}
}