Vous pouvez le faire en utilisant des interruptions externes. La plupart des Arduinos ne prennent en charge cela que sur un nombre limité de broches. Pour plus de détails, consultez la documentation sur attachInterrupt()
.
En supposant que vous utilisez un Uno, vous pouvez le faire comme ceci:
void pinChanged()
{
//...
}
void setup()
{
pinMode(2, INPUT);
attachInterrupt(0, pinChanged, CHANGE);
}
void loop()
{
}
Cela appellera pinChanged()
chaque fois qu'un changement est détecté sur l'interruption externe 0. Sur l'Uno, cela correspond à la broche GPIO 2. La numérotation des interruptions externes est différente sur les autres cartes, il est donc important de vérifier la documentation pertinente.
Il y a cependant des limites à cette approche. La pinChanged()
fonction personnalisée est utilisée comme routine de service d'interruption (ISR). Cela signifie que le reste du code (tout ce qu'il contient loop()
) est temporairement arrêté pendant l'exécution de l'appel. Afin d'éviter de perturber un timing important, vous devriez viser à rendre les ISR aussi rapides que possible.
Il est également important de noter qu'aucune autre interruption ne s'exécutera pendant votre ISR. Cela signifie que tout ce qui s'appuie sur des interruptions (comme le noyau delay()
et les millis()
fonctions) peut ne pas fonctionner correctement à l'intérieur.
Enfin, si votre ISR doit modifier des variables globales dans l'esquisse, elles doivent généralement être déclarées comme volatile
, par exemple:
volatile int someNumber;
C'est important car il indique au compilateur que la valeur peut changer de manière inattendue, il convient donc de ne pas en utiliser de copie / cache obsolète.