Étiquettes : ,

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.

Arduino-pushbutton-interrupt_bb Utilisation des interruptions avec Arduino

Rappel des broches digitales compatibles avec les interruptions

Uno, Nano, Mini, other 328-based2, 3
Uno WiFi Rev.2, Nano Everyall digital pins
Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21
Micro, Leonardo, other 32u4-based0, 1, 2, 3, 7
Zeroall digital pins, except 4
MKR Family boards0, 1, 4, 5, 6, 7, 8, 9, A1, A2
Nano 33 IoT2, 3, 9, 10, 11, 13, 15, A5, A7
Nano 33 BLE, Nano 33 BLE Senseall pins
Dueall digital pins
101all 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ée
  • interrupts() réactive les interruptions
  • noInterrupts() 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.

Arduino-pushbutton-interrupt-result Utilisation des interruptions avec Arduino

Sources

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie