bouton-led.ino
Le bouton est lu par interruption externe : aucun appui perdu même si loop() est occupée. Un filtre de 30 ms dans l'ISR supprime les rebonds, et la section noInterrupts garantit une lecture cohérente du compteur.
Matériel requis
Un Teensy 3.2 (NXP Kinetis MK20DX256, Cortex-M4 @ 72 MHz, logique 3,3 V) alimenté par USB. 1 bouton poussoir vers GND.
Câblage
Bouton entre la broche 2 et GND (résistance interne activée par INPUT_PULLUP). Broches toutes interruptibles sur Teensy.
Fonctionnement
attachInterrupt() attache surFront descendant ; l'ISR incrémente un compteur volatile. loop() affiche le compteur et allume la LED pour chaque nombre impair.
Exécution
Installer le plugin Teensyduino dans l'Arduino IDE, choisir la carte « Teensy 3.2 », cliquer sur Téléverser puis sur le bouton du Teensy Loader. Attention : broches en 3,3 V.
Variantes
Ajouter un bouton « remise à zéro », ou envoyer le compteur en MIDI (Note On) pour un déclencheur de boîte à rythmes.
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);
}