Bird
Raised Fist0
Arduinoprogramming~10 mins

Timer interrupts with TimerOne library in Arduino - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Timer interrupts with TimerOne library
Setup TimerOne
↓
Set Timer Period
↓
Attach Interrupt Function
↓
Timer Counts
↓
Timer Reaches Period
↓
Interrupt Triggered
↓
Interrupt Service Routine Runs
↓
Main Loop Continues
↩Back to Timer Counts
The TimerOne library sets a timer period and attaches an interrupt function that runs automatically when the timer reaches the set period, while the main program continues running.
Execution Sample
Arduino
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Timer1.initialize(1000000); // 1 second
  Timer1.attachInterrupt(blinkLED);
}

void loop() {
  // main code runs here
}

void blinkLED() {
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
This code sets a 1-second timer interrupt that toggles the built-in LED every second while the main loop runs continuously.
Execution Table
StepTimer Count (microseconds)ConditionActionOutput
10Timer startedTimer counting beginsNo output
2500000Timer < 1000000Continue countingNo output
31000000Timer == 1000000Interrupt triggeredblinkLED() called, LED toggled
40Timer reset after interruptTimer counting restartsNo output
5500000Timer < 1000000Continue countingNo output
61000000Timer == 1000000Interrupt triggeredblinkLED() called, LED toggled
7............
ExitN/AProgram runs indefinitelyNo exitNo exit
💡 Timer interrupts run repeatedly; main loop runs forever unless stopped
Variable Tracker
VariableStartAfter 1After 2After 3After 4Final
Timer Count (microseconds)0500000100000005000001000000
LED StateOFFOFFONOFFOFFON
Key Moments - 3 Insights
Why does the LED toggle even though the main loop does not change it?
Because the interrupt service routine blinkLED() runs automatically every time the timer reaches the set period, toggling the LED independently of the main loop (see execution_table steps 3 and 6).
Does the main loop stop when the interrupt runs?
No, the main loop continues running normally; the interrupt temporarily pauses the main code to run blinkLED() and then returns (see concept_flow).
Why does the timer count reset after reaching the period?
The timer automatically resets to zero after triggering the interrupt to start counting for the next period (see execution_table step 4).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the LED state after the first interrupt triggers at step 3?
AOFF
BON
CBlinking rapidly
DNo change
💡 Hint
Check the 'LED State' row in variable_tracker after step 3
At which timer count does the interrupt trigger according to the execution table?
A500000 microseconds
B0 microseconds
C1000000 microseconds
D1500000 microseconds
💡 Hint
Look at the 'Condition' and 'Action' columns in execution_table rows 3 and 6
If the timer period is changed to 500000 microseconds, how would the execution table change?
AInterrupt triggers at 500000 microseconds instead of 1000000
BInterrupt triggers at 1000000 microseconds as before
CTimer never triggers interrupt
DLED toggles twice as slow
💡 Hint
Timer period controls when interrupt triggers; see concept_flow and execution_table
Concept Snapshot
TimerOne library lets you set a timer period in microseconds.
Attach an interrupt function that runs automatically when timer reaches that period.
The timer resets and counts again, triggering interrupts repeatedly.
Main program runs normally while interrupts toggle or update things.
Use initialize() to set period and attachInterrupt() to set ISR.
Full Transcript
This visual execution shows how the TimerOne library works on Arduino. First, the timer is set up with a period (like 1 second). Then an interrupt function is attached. The timer counts microseconds. When it reaches the set period, it triggers the interrupt. The interrupt runs the function blinkLED, which toggles the LED state. After the interrupt, the timer resets and counts again. Meanwhile, the main loop keeps running without stopping. The LED toggles every time the interrupt runs, showing how interrupts let you do things in the background automatically.

Practice

(1/5)
1. What is the main purpose of using the TimerOne library in Arduino programming?
easy
A. To run code at precise time intervals using interrupts
B. To control the speed of the Arduino board
C. To manage power consumption automatically
D. To connect Arduino to the internet

Solution

  1. Step 1: Understand TimerOne library role

    The TimerOne library is designed to help run code at exact time intervals by using hardware timer interrupts.
  2. 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.
  3. Final Answer:

    To run code at precise time intervals using interrupts -> Option A
  4. Quick Check:

    TimerOne = precise timed interrupts [OK]
Hint: TimerOne = precise timing with interrupts [OK]
Common Mistakes:
  • Thinking TimerOne controls Arduino speed
  • Confusing interrupts with internet connection
  • Assuming it manages power automatically
2. Which of the following is the correct way to start TimerOne with a 1-second interval?
easy
A. Timer1.initialize(1000000);
B. Timer1.start(1000);
C. Timer1.setInterval(1);
D. Timer1.begin(1000);

Solution

  1. Step 1: Recall TimerOne initialization syntax

    The TimerOne library uses initialize() with microseconds as argument to set the timer interval.
  2. Step 2: Match 1 second to microseconds

    1 second = 1,000,000 microseconds, so initialize(1000000) is correct.
  3. Final Answer:

    Timer1.initialize(1000000); -> Option A
  4. Quick Check:

    initialize uses microseconds = 1000000 [OK]
Hint: Use initialize() with microseconds for timing [OK]
Common Mistakes:
  • Using milliseconds instead of microseconds
  • Using non-existent start() or begin() methods
  • Confusing setInterval() with initialize()
3. What will be the output on the Serial Monitor if this code runs?
void blink() {
  Serial.println("Tick");
}

void setup() {
  Serial.begin(9600);
  Timer1.initialize(500000);
  Timer1.attachInterrupt(blink);
}

void loop() {
  // empty
}
medium
A. No output because loop is empty
B. Prints "Tick" once and stops
C. Prints "Tick" every 0.5 seconds repeatedly
D. Prints "Tick" continuously without delay

Solution

  1. Step 1: Understand Timer1 setup

    Timer1 is initialized to 500000 microseconds (0.5 seconds) and blink() is attached as interrupt.
  2. Step 2: Analyze interrupt behavior

    Every 0.5 seconds, blink() runs and prints "Tick" to Serial Monitor repeatedly.
  3. Final Answer:

    Prints "Tick" every 0.5 seconds repeatedly -> Option C
  4. Quick Check:

    attachInterrupt triggers blink() repeatedly [OK]
Hint: attachInterrupt runs function repeatedly at interval [OK]
Common Mistakes:
  • Thinking loop() must print for output
  • Assuming interrupt runs only once
  • Confusing timing units causing wrong intervals
4. Identify the error in this TimerOne usage:
void blink() {
  digitalWrite(13, !digitalRead(13));
}

void setup() {
  pinMode(13, OUTPUT);
  Timer1.initialize(1000000);
  Timer1.attachInterrupt(blink());
}

void loop() {}
medium
A. Timer1.initialize() argument should be in milliseconds
B. Missing Serial.begin() in setup()
C. Pin 13 cannot be used with TimerOne interrupts
D. Incorrect call: attachInterrupt(blink()) should be attachInterrupt(blink)

Solution

  1. Step 1: Check attachInterrupt usage

    attachInterrupt expects a function pointer, so it should be attachInterrupt(blink), not attachInterrupt(blink()).
  2. Step 2: Verify other parts

    Serial.begin() is not needed here, pin 13 can be toggled, and initialize() uses microseconds correctly.
  3. Final Answer:

    Incorrect call: attachInterrupt(blink()) should be attachInterrupt(blink) -> Option D
  4. Quick Check:

    attachInterrupt needs function name, no parentheses [OK]
Hint: Pass function name without () to attachInterrupt [OK]
Common Mistakes:
  • Calling function with () inside attachInterrupt
  • Confusing microseconds with milliseconds
  • Thinking Serial.begin() is always required
5. You want to toggle an LED every 200ms using TimerOne. Which code snippet correctly sets this up?
hard
A. Timer1.initialize(200); Timer1.attachInterrupt(blink);
B. Timer1.initialize(200000); Timer1.attachInterrupt([](){ digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); });
C. Timer1.start(200000); Timer1.attachInterrupt(blink());
D. Timer1.setInterval(200000); Timer1.attachInterrupt(blink);

Solution

  1. Step 1: Convert 200ms to microseconds

    200 milliseconds = 200,000 microseconds, so initialize(200000) is correct.
  2. 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.
  3. Final Answer:

    Timer1.initialize(200000); Timer1.attachInterrupt([](){ digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); }); -> Option B
  4. Quick Check:

    initialize with microseconds + correct attachInterrupt [OK]
Hint: Use initialize(microseconds) and attachInterrupt with function [OK]
Common Mistakes:
  • Using milliseconds instead of microseconds
  • Calling function with () inside attachInterrupt
  • Using non-existent start() or setInterval() methods
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard