#define LED_PIN 2
#define BUTTON_PIN 4
volatile bool ledEnabled = true; // 'volatile' is required for variables used in interrupts
unsigned long lastInterruptTime = 0;
// The "Interrupt Service Routine" (ISR) - Must be fast!
void IRAM_ATTR handleButton() {
unsigned long interruptTime = millis();
// Simple software debounce: ignore interrupts within 200ms
if (interruptTime - lastInterruptTime > 200) {
ledEnabled = !ledEnabled;
}
lastInterruptTime = interruptTime;
}
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Attach the interrupt to Pin 4, looking for a FALLING edge (High to Low)
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButton, FALLING);
}
void loop() {
static unsigned long prevMillis = 0;
if (ledEnabled) {
if (millis() - prevMillis >= 1000) {
prevMillis = millis();
digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // Toggle LED
}
} else {
digitalWrite(LED_PIN, LOW);
}
}