interrupt-bouton.ino

Arduino Nano Every · Fichier : interrupt-bouton.ino · Langage : Arduino · Usage : Réagir à un bouton par interruption, sans polling

Sur le 4809, les interruptions externes sortent du carcan INT0/INT1 du 328P : digitalPinToInterrupt fonctionne sur la plupart des broches. Ce bouton bascule la LED sans jamais scruter son état, laissant la boucle principale entièrement disponible.

Matériel requis

Un Arduino Nano Every (ATmega4809 à 20 MHz, brochage identique au Nano, USB micro-B, convertisseur UART séparé, broches 5 V, pile de compatibilité avec le Nano classique). Nano Every, bouton poussoir sur la broche 2, LED sur 13 (ou LED_BUILTIN).

Câblage

Bouton entre D2 et GND (pull-up interne activé) ; LED via résistance 330 Ω vers D13.

Fonctionnement

L'ISR ne fait que lever un drapeau volatile avec garde anti-rebond de 50 ms ; le traitement lourd reste dans loop(), règle d'or des interruptions courtes.

Exécution

Installez le package Arduino megaAVR Boards dans l'IDE, sélectionnez Arduino Nano Every, téléversez. Le Serial USB est séparé du Serial1 matériel (broches RX/TX) : le code série classique fonctionne tel quel.

Variantes

Utilisez CHANGE pour compter les deux flancs d'un codeur simple, ou réveillez la carte en sommeil profond sur le même mécanisme.

interrupt-bouton.ino

// Interruptions externes sur le Nano Every : n'importe quelle broche
// peut generer une interruption (le 4809 n'a pas que INT0/INT1).
volatile bool appui = false;
unsigned long dernierAppui = 0;
bool etatLed = false;

const int BOUTON = 2;
const int LED = 13;

void surChangement() {
  unsigned long m = millis();
  if (m - dernierAppui > 50) { // anti-rebond 50 ms
    appui = true;
    dernierAppui = m;
  }
}

void setup() {
  pinMode(BOUTON, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
  // RISING ou FALLING ou CHANGE : ici chaque flanc compte
  attachInterrupt(digitalPinToInterrupt(BOUTON), surChangement, FALLING);
  Serial.begin(9600);
}

void loop() {
  if (appui) {
    appui = false;
    etatLed = !etatLed;
    digitalWrite(LED, etatLed);
    Serial.println(etatLed ? F("LED ON") : F("LED OFF"));
  }
  // la boucle reste libre pour l'I2C, l'UART, les mesures...
  delayMicroseconds(100);
}

← Retour à la fiche