Rising, falling, and change triggers in Arduino - Time & Space Complexity
When using rising, falling, or change triggers in Arduino, we want to know how the program's work grows as input signals change.
We ask: How often does the code run when signals trigger events?
Analyze the time complexity of the following code snippet.
volatile int count = 0;
void setup() {
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2), countRising, RISING);
}
void loop() {
// main code runs here
}
void countRising() {
count++;
}
This code counts how many times a signal rises on pin 2 using an interrupt trigger.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The interrupt function
countRising()runs each time the signal rises. - How many times: It runs once per rising edge detected on the input pin.
The number of times countRising() runs grows directly with the number of rising signals.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 rising signals | 10 calls to countRising() |
| 100 rising signals | 100 calls to countRising() |
| 1000 rising signals | 1000 calls to countRising() |
Pattern observation: The work grows linearly with the number of signal changes.
Time Complexity: O(n)
This means the program's work increases directly with the number of signal triggers.
[X] Wrong: "The interrupt function runs constantly like a loop."
[OK] Correct: The interrupt only runs when the signal changes, not continuously, so work depends on signal events, not time.
Understanding how event-driven code runs helps you explain how programs handle real-world signals efficiently.
"What if we changed the trigger from RISING to CHANGE? How would the time complexity change?"
Practice
Solution
Step 1: Understand the meaning of RISING trigger
The RISING trigger activates when the signal goes from LOW (0) to HIGH (1).Step 2: Compare with other triggers
FALLING triggers on HIGH to LOW, CHANGE triggers on any change, LOW triggers when signal is LOW.Final Answer:
RISING -> Option AQuick Check:
LOW to HIGH = RISING [OK]
- Confusing RISING with FALLING
- Thinking CHANGE triggers only on RISING
- Mixing LOW trigger with RISING
Solution
Step 1: Identify correct function usage
attachInterrupt requires pin number converted by digitalPinToInterrupt for portability.Step 2: Match trigger type FALLING
attachInterrupt(digitalPinToInterrupt(2), ISR, FALLING); uses digitalPinToInterrupt(2) and FALLING correctly.Final Answer:
attachInterrupt(digitalPinToInterrupt(2), ISR, FALLING); -> Option BQuick Check:
Use digitalPinToInterrupt with FALLING [OK]
- Using pin number directly without digitalPinToInterrupt
- Mixing trigger types with wrong syntax
- Using LOW trigger incorrectly
volatile int count = 0;
void ISR() { count++; }
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2), ISR, CHANGE);
}
void loop() {
Serial.println(count);
delay(1000);
}Solution
Step 1: Understand CHANGE trigger behavior
CHANGE triggers on any signal change: LOW to HIGH and HIGH to LOW, so ISR runs twice.Step 2: Count increments in ISR
Each ISR call increments count by 1, so after two changes count = 2.Final Answer:
2 2 2 ... (count increments twice) -> Option CQuick Check:
CHANGE triggers twice, count = 2 [OK]
- Assuming CHANGE triggers only once
- Forgetting volatile keyword importance
- Thinking ISR cannot modify variables
void ISR() {
// interrupt code
}
void setup() {
attachInterrupt(3, ISR, RISING);
}Solution
Step 1: Check attachInterrupt pin argument
Pin number must be converted with digitalPinToInterrupt(pin) for correct interrupt mapping.Step 2: Validate other parts
ISR has correct signature (no parameters), RISING is valid, attachInterrupt is correctly called in setup.Final Answer:
Pin number 3 should be converted using digitalPinToInterrupt() -> Option DQuick Check:
Use digitalPinToInterrupt for pin numbers [OK]
- Passing raw pin number directly
- Thinking ISR needs parameters
- Calling attachInterrupt in loop()
Solution
Step 1: Understand button state changes
A button press changes signal from HIGH to LOW or LOW to HIGH depending on wiring.Step 2: Choose trigger to count all changes
CHANGE triggers on any signal change, so it counts both presses and releases.Final Answer:
CHANGE, because it counts both presses and releases -> Option AQuick Check:
Count all changes = use CHANGE trigger [OK]
- Using RISING or FALLING and missing half the events
- Confusing LOW trigger with change detection
- Not considering both press and release
Ready to prove it?
Pass the test and this pattern moves unknown
