bouton-led.ino
Un botón entre GPIO4 y GND, elevado internamente: cada pulsación limpia se cuenta e imprime. El filtro antirrebote de 40 ms elimina el rebote mecánico que duplicaría la cuenta.
Hardware necesario
Una placa ESP32-S3 (doble núcleo Xtensa con instrucciones vectoriales, Wi-Fi + BLE 5, USB nativo) tipo DevKitC-1, XIAO o T-Display-S3, alimentada por USB. 1 botón pulsador (una pata a GPIO4, la otra a GND).
Cableado
Botón en GPIO4 a GND; la resistencia INPUT_PULLUP es interna. Evite GPIO6-11 (flash) y GPIO34-39 (solo entrada, sin pull-up).
Funcionamiento
Se guarda el último nivel leído y la hora del último cambio; un flanco solo vale si el nivel se mantiene estable 40 ms. INPUT_PULLUP invierte la lógica: pulsado = LOW. En el Arduino IDE (paquete esp32), elija « ESP32S3 Dev Module », active « USB CDC On Boot » y suba. Muchas placas ponen un WS2812 en GPIO48.
Para ir más lejos
Doble clic (medir el intervalo entre pulsaciones), o despertar profundo en ese mismo GPIO con 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;
}