Dans le jalon précédent, nous avions défini la boucle comme suit :
void loop() { if(mButton.isPressed()) // J'ai appelé la fonction qui retourne l'état ''isPressed''. { Serial.print("Button is pressed\n"); // Switch on or off the internal LED ... } delay(500); }
Nous voyons que nous lisons environ toute les demi-secondes l'état du bouton.
Faire la liste des problèmes qui peuvent apparaître avec cette approche. Posez vous les questions suivantes :
Proposer une modification du code pour essayer de répondre à certaines de ces questions. On pourra envisager de réduire par exemple le délai à une valeur plus faible comme delay(50)
.
Est-ce que cela résout véritablement le problème ?
En fait nous aimerions que ce soit le système qui détecte automatiquement le changement d'état du port (passage de 0 à 1 ou passage de 1 à 0).
Il est possible d'utiliser la notion d'interruption sur les cartes ARDUINO et ce de manière assez simple. Mais qu'est ce qu'une interruption.
Une interruption est un événnement qui se produit, qui est détecté et qui est suffisament important pour pouvoir arrêté le programme qui s'exécute pour exécuter immédiatement un code prioritaire.
Typiquement quand un message arrive à l'ordinateur, votre programme s'arrête pour que le message Ethernet soit enregistré. Plus précisément :
Nous voyons donc que le mécanisme des interruptions permet de répondre immédiatement à la survenance d'un événement extérieur.
En fait c'est exactement ce que l'on aimerait faire dans le cas de notre bouton, c'est que nous soyons prévenu chaque fois que le bouton est pressé ou relâché.
La carte ARDUINO propose un mécanisme de surveillance de port qui déclenche des interruptions si jamais le signal au niveau du port est modifié. Ce mécanisme est relativement simple à mettre en oeuvre.
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
où :
pin
est le numéro du port.ISR
est le nom du fonction de type void myInterruptHandler()
, c'est à dire qui ne prendre aucun argument et ne retourne aucun résulat, c'est la fonction qui est appelé lorsque l'interruption se déclenche.mode
indique l'événement qui va déclencher l'interruption et peut avoir les valeurs suivantes :LOW
: la tension mesurée au port est 0V,HIGH
: la tension mesurée au port est 3.3V,RISING
: la tension mesurée au port passe de 0V est 3.3V,FALLING
: la tension mesurée au port passe de 3.3V à 0V.Ainsi le code suivant :
void onFalling() { Serial.print("Port 8: Falling\n"); } void setup() { attachInterrupt(digitalPinToInterrupt(8), onFalling, FALLING); }
enverra sur la console le message Port 8: Falling
chaque fois que la tension passera de 3.3V à 0V sur le port 8
de l'ARDUINO.
Proposer une modification du code pour pouvoir détecter automatiquement que le bouton a été pressé en utilisant les interruptions.
Précédent: Jalon 2: Allumer/Eteindre la diode interne à partir de ''Button''
Suivant: Jalon 4: Ajouter à la classe Button la réactivité