Les interruptions permettent au microcontrôleur d’exécuter une fonction lorsqu’un évènement survient sur une des broches d’interruption. Plutôt que de lire constamment la valeur d’un capteur, le programme ne va se déclencher que lorsque la valeur du capteur va changer. Cela permet de résoudre bon nombre de problème d’agencement de tâche.
Matériel
- Arduino UNO
- bouton poussoir (ou autre capteur)
- Câble USB A/ USB B
Schéma
Sur la carte Arduino UNO, il y a deux broches qui supportent les interruptions: les broches 2 et 3. Nous allons donc relier la sortie du bouton à la broche 2 de l’Arduino.
Rappel des broches digitales compatibles avec les interruptions
Uno, Nano, Mini, other 328-based | 2, 3 |
Uno WiFi Rev.2, Nano Every | all digital pins |
Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, other 32u4-based | 0, 1, 2, 3, 7 |
Zero | all digital pins, except 4 |
MKR Family boards | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Nano 33 IoT | 2, 3, 9, 10, 11, 13, 15, A5, A7 |
Nano 33 BLE, Nano 33 BLE Sense | all pins |
Due | all digital pins |
101 | all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE) |
Code de gestion des interruptions
La syntaxe pour initialiser une interruption est la suivante:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
Avec pin, la broche utilisée, ISR, la fonction à activer lorsque l’évènement est détecté et mode, le mode de détection utilisé.
- LOW pour activer la détection lorsque la broche est à l’état BAS
- CHANGE pour activer la détection lorsque l’état de la broche change
- RISING pour activer la détection lorsque l’état de la broche passe de BAS à HAUT
- FALLING pour activer la détection lorsque l’état de la broche passe de HAUT à BAS
const byte ledPin = 13; const byte interruptPin = 2; volatile byte state = LOW; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), onEvent, CHANGE); Serial.println(F("Système intialisé")); } void loop() { digitalWrite(ledPin, state); } void onEvent() { state = !state; Serial.print(F("Switch LED 13 : ")); if(state){ Serial.println(F("ON")); }else{ Serial.println(F("OFF")); } }
Attention: Dans la fonction onEvent(), les fonctions millis() et delay(), qui dépendent des interruptions, ne fonctionneront pas.
Les fonctions à connaitre pour aller plus loin dans la gestion des interruptions
attachInterrupts
detachInterrupt(digitalPinToInterrupt(pin))
désactive l’interruption spécifiéeinterrupts()
réactive les interruptionsnoInterrupts()
pour désactiver les interruptions
Résultat
Une fois le code téléversé, si vous appuyez sur le bouton, la LED embarquée sur l’Arduino devrait s’allumer et s’éteindre.
Sources
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
très bon tuto