Un appui que la boucle ne détecte pas
Fait partie de la section Gestion du temps sans delay du Journey Arduino de Coddy. Leçon 12 sur 18.
Un sketch est parfois occupé par une tâche lente ou un long delay(). Une boucle qui lit le bouton uniquement entre les tâches manque un appui qui commence et se termine pendant l’une d’elles.
Une interruption règle ce problème : lorsqu’une broche change d’état, la carte interrompt ce qu’elle fait, exécute une fonction que tu choisis, puis reprend. La puce surveille elle-même la broche, même pendant delay().
void onPress() {
digitalWrite(ledPin, HIGH);
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}attachInterrupt() prend trois éléments : l’interruption associée à la broche (digitalPinToInterrupt(buttonPin) la trouve), la fonction à exécuter et le moment où l’exécuter. FALLING correspond au moment où la broche passe de HIGH à LOW : avec une résistance de tirage vers le haut, c’est le moment où l’on appuie sur le bouton.
La fonction est appelée routine de service d’interruption, ou ISR. Garde-la courte : pas de delay() ni de Serial.
Défi
FacileCette alarme ne vérifie son bouton qu’une fois toutes les 2 secondes, donc une pression rapide n’est pas détectée. Fais en sorte qu’une pression allume immédiatement la LED :
- écris une ISR,
onPress(), qui allume la LED - dans
setup(), associe-la à la broche du bouton avecFALLING
Garde la tâche lente dans loop(). La LED reste allumée après une pression, comme une alarme. Appuie sur Run, appuie sur le bouton, puis sur Check.
Essayez vous-même
const int ledPin = 13;
const int buttonPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
// attache l'interruption ici
}
void loop() {
// la tâche lente : laisse-la telle quelle
Serial.println("working");
delay(2000);
// cela ne vérifie le bouton qu'une fois toutes les 2 secondes,
// donc un appui bref passe inaperçu
if (digitalRead(buttonPin) == LOW) {
digitalWrite(ledPin, HIGH);
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Gestion du temps sans delay
3Interruptions
Un appui que la boucle ne détecte pasDESCENDANT, MONTANT et CHANGEMENTPartager avec volatileCompter les appuis avec une interruptionEntraînez-vous par vous-même : Playground Arduino