const int BUTTON_PIN = 4;
const int LED_PIN = 2;
// این متغیر باید volatile باشد چون هم در حلقهٔ اصلی و هم داخل ISR تغییر میکند
volatile bool ledState = false;
// ISR = Interrupt Service Routine؛ باید کوتاه و سریع باشد
void IRAM_ATTR onButtonPress() {
ledState = !ledState; // فقط وضعیت را برعکس میکنیم؛ کار سنگین اینجا انجام نمیشود
}
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
// هر بار که پایهٔ دکمه از HIGH به LOW برود (لبهٔ افتان، یعنی دکمه فشرده شد)، تابع onButtonPress صدا زده میشود
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), onButtonPress, FALLING);
}
void loop() {
// برنامهٔ اصلی آزاد است کارهای دیگر انجام دهد؛ وقفه در پسزمینه رخ میدهد
digitalWrite(LED_PIN, ledState);
Serial.println(ledState ? "LED روشن" : "LED خاموش");
delay(200);
}