interrupt-bouton.ino

Arduino Nano Every · Archivo : interrupt-bouton.ino · Lenguaje : Arduino · Uso : Réagir à un bouton par interruption, sans polling

En el 4809, las interrupciones externas salen del corsé INT0/INT1 del 328P: digitalPinToInterrupt funciona en la mayoría de pines. Este botón alterna el LED sin escrutar nunca su estado, dejando el bucle principal enteramente disponible.

Hardware

Un Arduino Nano Every (ATmega4809 a 20 MHz, mismo formato que el Nano, USB micro-B, chip UART separado, pines de 5 V, compatibilidad directa con el Nano clásico). Nano Every, botón pulsador en el pin 2, LED en 13 (o LED_BUILTIN).

Cableado

Botón entre D2 y GND (pull-up interno activado); LED con resistencia de 330 Ω a D13.

Funcionamiento

La ISR solo levanta un flag volatile con guarda antirrebote de 50 ms; el tratamiento pesado se queda en loop(), regla de oro de las interrupciones cortas.

Ejecución

Instala el paquete Arduino megaAVR Boards en el IDE, selecciona Arduino Nano Every y carga. El Serial USB está separado del Serial1 de hardware (pines RX/TX): el código serie clásico funciona tal cual.

Variantes

Usa CHANGE para contar ambos flancos de un codificador simple o despierta la placa en sueño profundo con el mismo mecanismo.

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);
}

← Volver a la ficha