bouton-led.ino

ESP32-S3 · Fichier : bouton-led.ino · Langage : Arduino · Usage : Compter les appuis sur un bouton avec anti-rebond

Un bouton entre GPIO4 et GND, tiré en l'air par la résistance interne : chaque appui franc est compté et affiché. Le filtre anti-rebond de 40 ms élimine les rebonds mécaniques qui feraient compter deux fois.

Matériel requis

Une carte ESP32-S3 (double cœur Xtensa avec instructions vectorielles, Wi-Fi + BLE 5, USB natif) type DevKitC-1, XIAO ou T-Display-S3, alimentée par USB. 1 bouton poussoir (une patte GPIO4, l'autre GND).

Branchement

Bouton sur GPIO4 et GND ; la résistance de tirage INPUT_PULLUP est interne. Évitez GPIO6-11 (flash) et GPIO34-39 (entrées seules, sans pull-up).

Fonctionnement

On mémorise le dernier niveau lu et l'horodatement du dernier changement ; un front n'est validé que si le niveau reste stable 40 ms. INPUT_PULLUP inverse la logique : appui = LOW. Dans l'Arduino IDE (paquet esp32), choisissez « ESP32S3 Dev Module », activez « USB CDC On Boot », puis Téléverser. Beaucoup de cartes placent un WS2812 sur GPIO48.

Pour aller plus loin

Double-clic (mesurer l'intervalle entre appuis), ou éveil profond sur ce même GPIO avec esp_sleep_enable_ext0_wakeup.

bouton-led.ino

// Bouton sur GPIO4 (vers GND, résistance interne) + compteur anti-rebond.
const int BOUTON = 4;
const int LED = 48;
const unsigned long ANTI_REBOND = 40;  // ms

bool dernier = HIGH, stable = HIGH;
unsigned long bord = 0;
int compteur = 0;

void setup() {
  pinMode(BOUTON, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  bool lu = digitalRead(BOUTON);
  unsigned long t = millis();
  if (lu != dernier) bord = t;
  if (t - bord >= ANTI_REBOND && lu != stable) {
    stable = lu;
    if (stable == LOW) {                 // front d'appui (logique inversée)
      compteur++;
      digitalWrite(LED, HIGH);
      Serial.printf("Appui n°%d\n", compteur);
    } else {
      digitalWrite(LED, LOW);
    }
  }
  dernier = lu;
}

← Retour à la fiche