Interrupts let your Arduino stop what it is doing to quickly respond to important events. This makes your program faster and more responsive.
Why interrupts improve responsiveness in Arduino
attachInterrupt(digitalPinToInterrupt(pin), ISR_function, mode);
pin is the Arduino pin number that supports interrupts.
ISR_function is the function called when the interrupt happens. It must be short and fast.
mode defines when the interrupt triggers: LOW, CHANGE, RISING, or FALLING.
buttonPressed function when pin 2 changes from LOW to HIGH.attachInterrupt(digitalPinToInterrupt(2), buttonPressed, RISING);sensorTriggered function when pin 3 changes from HIGH to LOW.attachInterrupt(digitalPinToInterrupt(3), sensorTriggered, FALLING);This program uses an interrupt to detect when a button is pressed on pin 2. The interrupt sets a flag quickly. The main loop checks the flag and toggles the LED on pin 13 and prints a message. This way, the button press is detected immediately without waiting.
#include <Arduino.h> volatile bool buttonPressedFlag = false; void setup() { pinMode(2, INPUT_PULLUP); // Button connected to pin 2 pinMode(13, OUTPUT); // Built-in LED attachInterrupt(digitalPinToInterrupt(2), onButtonPress, FALLING); Serial.begin(9600); } void loop() { if (buttonPressedFlag) { buttonPressedFlag = false; digitalWrite(13, !digitalRead(13)); // Toggle LED Serial.println("Button pressed! LED toggled."); } } void onButtonPress() { buttonPressedFlag = true; }
Keep interrupt service routines (ISR) very short and fast to avoid delays.
Use volatile keyword for variables shared between ISR and main code.
Do not use delay() or Serial prints inside ISR.
Interrupts let your Arduino react immediately to events.
They improve responsiveness by stopping normal code to handle important signals.
Use interrupts for buttons, sensors, and time-critical tasks.
Practice
Solution
Step 1: Understand what interrupts do
Interrupts pause the current program to quickly respond to urgent events like button presses.Step 2: Compare with other options
Increasing clock speed or reducing power are unrelated to interrupts. Fixing code errors is not automatic.Final Answer:
They allow the Arduino to stop its current task and immediately handle important events. -> Option AQuick Check:
Interrupts improve responsiveness by immediate handling [OK]
- Thinking interrupts speed up the whole program
- Confusing interrupts with power saving
- Believing interrupts fix code errors automatically
Solution
Step 1: Recall Arduino interrupt syntax
The correct function is attachInterrupt with parameters digitalPinToInterrupt(pin), ISR function, and mode.Step 2: Check other options
Other options use wrong function names or missing parameters.Final Answer:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); -> Option BQuick Check:
Correct Arduino interrupt syntax = attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); [OK]
- Using wrong function names like interruptAttach
- Omitting digitalPinToInterrupt wrapper
- Missing mode parameter in attachInterrupt
volatile int count = 0;
void setup() {
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(2), increment, RISING);
pinMode(2, INPUT);
}
void loop() {
Serial.println(count);
delay(1000);
}
void increment() {
count++;
}Solution
Step 1: Analyze interrupt setup
Interrupt is attached to pin 2 with RISING mode, calling increment() to increase count.Step 2: Understand loop output
Loop prints count every second. Each rising edge on pin 2 increases count by 1.Final Answer:
The count will increase each time pin 2 detects a rising signal. -> Option DQuick Check:
Interrupt increments count on rising edge = The count will increase each time pin 2 detects a rising signal. [OK]
- Assuming interrupts are disabled by default
- Thinking code will not compile
- Believing count decreases without code for that
volatile int count = 0;
void setup() {
Serial.begin(9600);
attachInterrupt(2, increment, FALLING);
pinMode(2, INPUT_PULLUP);
}
void loop() {
Serial.println(count);
delay(1000);
}
void increment() {
count++;
}Solution
Step 1: Check attachInterrupt parameter
attachInterrupt requires digitalPinToInterrupt(pin) for portability and correctness, not just pin number.Step 2: Review other options
pinMode INPUT_PULLUP is correct for button with pull-up. ISR functions return void. Serial.begin() belongs in setup.Final Answer:
attachInterrupt should use digitalPinToInterrupt(2) instead of 2. -> Option CQuick Check:
Use digitalPinToInterrupt for attachInterrupt pin [OK]
- Passing raw pin number to attachInterrupt
- Changing pinMode to OUTPUT for input button
- Expecting ISR to return a value
- Calling Serial.begin() repeatedly inside loop
Solution
Step 1: Understand ISR best practices
ISRs should be short and fast; long calculations inside ISR cause delays and missed interrupts.Step 2: Use interrupts to set flags
Use ISR to set a flag when sensor triggers, then handle the flag in the main loop after calculation.Final Answer:
Use an interrupt to detect the sensor signal and set a flag, then handle the flag in loop(). -> Option AQuick Check:
ISR sets flag; loop handles work = Use an interrupt to detect the sensor signal and set a flag, then handle the flag in loop(). [OK]
- Doing long tasks inside ISR
- Disabling interrupts unnecessarily
- Ignoring interrupts and polling only
Ready to prove it?
Pass the test and this pattern moves unknown
