bouton-led.ino
El botón se lee por interrupción externa: no se pierde ninguna pulsación aunque loop() esté ocupada. Un filtro de 30 ms dentro de la ISR elimina el rebote, y la sección noInterrupts garantiza una lectura coherente del contador.
Hardware
Un Teensy 4.0 (NXP i.MX RT1062, Cortex-M7 @ 600 MHz, lógica de 3,3 V) alimentado por USB. 1 botón pulsador hacia GND.
Cableado
Botón entre el pin 2 y GND (resistencia interna activada por INPUT_PULLUP). Todos los pines son interrumpibles en Teensy.
Funcionamiento
attachInterrupt() engancha el flanco de bajada; la ISR incrementa un contador volatile. loop() imprime el contador y enciende el LED en cada número impar.
Ejecución
Con Teensyduino en el Arduino IDE, elige « Teensy 4.0 », Subir y confirma en el Teensy Loader. Los pines son de 3,3 V; el 4.0 es compatible en pines con el 3.2.
Variantes
Añade un botón de «reset», o envía el contador por MIDI (Note On) como disparador de caja de ritmos.
bouton-led.ino
// Compteur d'appuis : bouton sur interruption externe (EXTI).
const int BOUTON = 2; // broche interruptible (tout pin Teensy l'est)
const int LED = 13;
volatile unsigned long compteur = 0;
volatile unsigned long dernierFront = 0;
void surAppui() {
unsigned long maintenant = millis();
if (maintenant - dernierFront < 30) return; // anti-rebond 30 ms
dernierFront = maintenant;
compteur++;
}
void setup() {
pinMode(BOUTON, INPUT_PULLUP);
pinMode(LED, OUTPUT);
attachInterrupt(digitalPinToInterrupt(BOUTON), surAppui, FALLING);
Serial.begin(9600);
Serial.println(F("Compteur d'appuis pret"));
}
void loop() {
static unsigned long derniereAffichage = 0;
if (millis() - derniereAffichage < 200) return;
derniereAffichage = millis();
noInterrupts(); // lecture atomique de la variable 32 bits
unsigned long n = compteur;
interrupts();
digitalWrite(LED, (n % 2) ? HIGH : LOW);
Serial.print(F("appuis = ")); Serial.println(n);
}