interrupt-bouton.ino
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);
}