Menu
CoddyTech

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.

challenge icon

Défi

Facile

Cette 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 avec FALLING

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);
  }
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Arduino