====== Limite de l'approche synchone ======
[[in202:seance_6|Retour à la séance 6]]
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.
===== Question n°1 ======
Faire la liste des problèmes qui peuvent apparaître avec cette approche. Posez vous les questions suivantes :
- Que mesurons nous véritablement ?
- Pouvons nous ne pas détecter un appui sur le bouton ?
- Que se passe-t-il s'il y a plusieurs pressions succesives sur le bouton ?
===== Question n°2 ======
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 ?
===== Question n°3 ======
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 :
- La carte Ethernet recoit un message, elle émet un signal d'interruption pour indiquer qu'un message est disponible.
- Le processeur recoit le message d'interruption, il interrompt l'exécution du programme en cours.
- Le système d'exploitation est alerté de la réception du message (par exemple par la carte Ethernet),
- Le système d'exploitation stocke le message Ethernet dans la pile des messages pour qu'il ne soit pas perdu et indique ensuite au processeur qu'il peut reprendre l'exécution du programme en cours.
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.
====== Navigation ======
Précédent: ** Jalon 2: **[[.:jalon_2|Allumer/Eteindre la diode interne à partir de ''Button'']]
Suivant: ** Jalon 4: **[[.:jalon_4|Ajouter à la classe Button la réactivité]]