Maîtrisez les Timers Internes Arduino pour un Chronométrage Précis
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| LED (standard) | 1 |
| Résistance 220 Ω | 1 |
À propos du projet
Vue d'ensemble
Pour mesurer le temps avec précision, il faut utiliser un timer matériel. Les timers internes de l'Arduino (ATmega328P) ne sont pas triviaux à configurer, ce tutoriel les explique simplement.
L'intérêt majeur : pendant delay(), le processeur est bloqué. Avec un timer, le programme continue ; une interruption se déclenche exactement au moment voulu.
Nous utilisons le TIMER0 (le plus simple). Les autres (Timer1, Timer2) pourront faire l'objet de futurs tutoriels.
Fonctionnement
Consultez la datasheet de l'ATmega328P. Le schéma bloc du compteur montre :
- L'horloge (16 MHz) entre dans le prédiviseur (prescaler).
- Le prédiviseur génère des impulsions à fréquence réduite vers la logique de contrôle.
- Celle-ci incrémente le registre TCNTn.
- On compare TCNTn à une valeur de référence dans OCRn.
- Lors de l'égalité (mode CTC - Clear Timer on Compare), le flag TOVn génère une interruption.
Le prédiviseur se configure via le registre TCCR0B :
Pour calculer la valeur d'OCR0A afin d'obtenir une période souhaitée :
Exemple : interruption toutes les 1 ms (prédiviseur 64) :
TCCR0A |= (1 << WGM01); // Mode CTC
OCR0A = 0xF9; // 249 -> 1 ms @ 16MHz/64
TIMSK0 |= (1 << OCIE0A); // Active interruption COMPA
sei(); // Active interruptions globales
TCCR0B |= (1 << CS01) | (1 << CS00); // Prédiviseur 64 (démarre le timer)
Important : régler le prédiviseur en dernier, car le timer démarre immédiatement. Pour l'arrêter, remettre TCCR0B à 0.
Code exemple : Clignotement LED 1 Hz via Timer0
/* Clignote la LED broche 13 chaque seconde via timer interne */
int timer = 0;
bool state = 0;
void setup() {
pinMode(13, OUTPUT);
TCCR0A = (1 << WGM01); // Mode CTC
OCR0A = 0xF9; // Valeur pour 1 ms
TIMSK0 |= (1 << OCIE0A); // Interruption sur compare match
sei(); // Interruptions globales
TCCR0B |= (1 << CS01) | (1 << CS00); // Prescaler 64
}
void loop() {
if (timer >= 1000) { // 1000 * 1 ms = 1 s
state = !state;
timer = 0;
}
digitalWrite(13, state);
}
ISR(TIMER0_COMPA_vect) {
timer++; // Incrémenté chaque 1 ms
}
Schéma de câblage

Processus de fabrication
- Construire un Spybot Arduino piloté par Bluetooth
- FlickMote : Télécommande IR à gestes pour maison connectée
- TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Solutions d'alimentation optimisées pour projets Arduino
- Morpion sur matrice LED MAX7219 avec boîtier en carton
- Construire un robot quadrupède Arduino intelligent : guide étape par étape
- Volant Joystick Arduino Personnalisé pour Jeux Vidéo