Timer interrupts with TimerOne library in Arduino - Time & Space Complexity
When using timer interrupts with the TimerOne library, it's important to understand how often the interrupt code runs as input changes.
We want to know how the number of operations grows as the timer interval or workload changes.
Analyze the time complexity of the following code snippet.
#include <TimerOne.h>
volatile int count = 0;
void setup() {
Timer1.initialize(1000000); // 1 second
Timer1.attachInterrupt(timerIsr);
}
void loop() {
// main code runs here
}
void timerIsr() {
count++;
}
This code sets a timer interrupt to run every 1 second and increments a counter each time the interrupt triggers.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The interrupt service routine (ISR) runs repeatedly.
- How many times: It runs once every timer interval (e.g., every 1 second).
The number of times the ISR runs depends on the total time the program runs and the timer interval.
| Input Size (seconds running) | Approx. ISR Calls |
|---|---|
| 10 | 10 |
| 100 | 100 |
| 1000 | 1000 |
Pattern observation: The number of ISR calls grows linearly with the running time.
Time Complexity: O(n)
This means the total number of interrupt calls grows directly in proportion to the running time.
[X] Wrong: "The interrupt runs only once or a fixed number of times regardless of time."
[OK] Correct: The interrupt triggers repeatedly at each timer interval, so the total calls increase as time passes.
Understanding how timer interrupts scale with time helps you reason about real-time systems and how often tasks run in embedded programming.
What if we changed the timer interval from 1 second to 0.1 seconds? How would the time complexity change?
Practice
Solution
Step 1: Understand TimerOne library role
The TimerOne library is designed to help run code at exact time intervals by using hardware timer interrupts.Step 2: Compare options with library purpose
Only To run code at precise time intervals using interrupts correctly describes this purpose. Other options describe unrelated features.Final Answer:
To run code at precise time intervals using interrupts -> Option AQuick Check:
TimerOne = precise timed interrupts [OK]
- Thinking TimerOne controls Arduino speed
- Confusing interrupts with internet connection
- Assuming it manages power automatically
Solution
Step 1: Recall TimerOne initialization syntax
The TimerOne library uses initialize() with microseconds as argument to set the timer interval.Step 2: Match 1 second to microseconds
1 second = 1,000,000 microseconds, so initialize(1000000) is correct.Final Answer:
Timer1.initialize(1000000); -> Option AQuick Check:
initialize uses microseconds = 1000000 [OK]
- Using milliseconds instead of microseconds
- Using non-existent start() or begin() methods
- Confusing setInterval() with initialize()
void blink() {
Serial.println("Tick");
}
void setup() {
Serial.begin(9600);
Timer1.initialize(500000);
Timer1.attachInterrupt(blink);
}
void loop() {
// empty
}Solution
Step 1: Understand Timer1 setup
Timer1 is initialized to 500000 microseconds (0.5 seconds) and blink() is attached as interrupt.Step 2: Analyze interrupt behavior
Every 0.5 seconds, blink() runs and prints "Tick" to Serial Monitor repeatedly.Final Answer:
Prints "Tick" every 0.5 seconds repeatedly -> Option CQuick Check:
attachInterrupt triggers blink() repeatedly [OK]
- Thinking loop() must print for output
- Assuming interrupt runs only once
- Confusing timing units causing wrong intervals
void blink() {
digitalWrite(13, !digitalRead(13));
}
void setup() {
pinMode(13, OUTPUT);
Timer1.initialize(1000000);
Timer1.attachInterrupt(blink());
}
void loop() {}Solution
Step 1: Check attachInterrupt usage
attachInterrupt expects a function pointer, so it should be attachInterrupt(blink), not attachInterrupt(blink()).Step 2: Verify other parts
Serial.begin() is not needed here, pin 13 can be toggled, and initialize() uses microseconds correctly.Final Answer:
Incorrect call: attachInterrupt(blink()) should be attachInterrupt(blink) -> Option DQuick Check:
attachInterrupt needs function name, no parentheses [OK]
- Calling function with () inside attachInterrupt
- Confusing microseconds with milliseconds
- Thinking Serial.begin() is always required
Solution
Step 1: Convert 200ms to microseconds
200 milliseconds = 200,000 microseconds, so initialize(200000) is correct.Step 2: Check attachInterrupt syntax and function
Using a lambda function without parentheses is valid and toggles LED correctly. Other options use wrong methods or call functions incorrectly.Final Answer:
Timer1.initialize(200000); Timer1.attachInterrupt([](){ digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); }); -> Option BQuick Check:
initialize with microseconds + correct attachInterrupt [OK]
- Using milliseconds instead of microseconds
- Calling function with () inside attachInterrupt
- Using non-existent start() or setInterval() methods
Ready to prove it?
Pass the test and this pattern moves unknown
