Exercice : Utilisation des interruptions
Cahier des charges
On se propose de réaliser un programme très simple pour piloter le schéma ci-contre : à chaque action sur le bouton poussoir, l'état de la diode change. Cependant, la fonction loop()
sera vide !
Principe de gestion des interruptions sur Arduino
Deux fonctions permettent d'initialiser les interruptions :
attachInterrupt() : fixe le numéro de l'interruption, la fonction à appeler en cas d'interruption et le mode de fonctionnement de l'interruption (sur état, sur front ou sur changement d'état)
detachInterrupt() : désactive une source d'interruption
Deux fonctions permettent d'inhiber/désinhiber les interruptions :
noInterrupts() : inhiber une interruption (il faut que la source d'interruption ait été initialisée préalablement avec la fonction attachInterrupt() )
interrupts() : désinhiber une interruption (préalablement inhibée avec noInterrupts() )
Question
Réalisez un programme permettant de répondre au cahier des charges (avec void loop() {}
)
Solution
//On utilise obligatoire le port 2 ou 3 pour les interruptions
bool etatLed=LOW;//Stocke l'état de la LED
void setup(){
Serial.begin(9600);
pinMode(PORT_LED, OUTPUT);
pinMode(PORT_BOUTON, INPUT);
attachInterrupt(digitalPinToInterrupt(PORT_BOUTON), TraitementBP, RISING ); //Déclenchement sur front montant
}
void loop(){
}
void TraitementBP(){ //Traitement de l'interruption
Serial.print("Etat led avant : ");
Serial.print(etatLed);
etatLed = !etatLed;
Serial.print(" - Etat led apres : ");
Serial.println(etatLed);
digitalWrite(PORT_LED, etatLed);
}