🛠 Lire le bouton BOOT sur GPIO0 sans se piéger
Objetivos
Aprender a leer una entrada digital en el ESP32-S3 utilizando el botón BOOT (GPIO0), comprendiendo al mismo tiempo por qué este pin es especial: GPIO0 es un pin de *strapping* que determina el modo de arranque (flash o ejecución). Escribirás un programa que detecta las pulsaciones con antirrebote por software, y entenderás la regla de oro: nunca forzar GPIO0 a nivel BAJO durante el reinicio, so pena de hacer creer a la placa que queremos flashearla.
Material
- 1 placa ESP32-S3 (el botón BOOT está presente en todas: DevKitC-1, XIAO, T-Display-S3)
- 1 cable USB de datos
- Opcional: 1 botón pulsador externo entre GPIO1 y GND para comparar
Código completo
// GPIO0 = bouton BOOT embarque (vers GND), pull-up interne obligatoire
// GPIO1 = bouton externe optionnel, entre GPIO1 et GND
const uint8_t BTN_BOOT = 0;
const uint8_t BTN_EXT = 1;
unsigned long dernierAppui = 0;
const unsigned long ANTI_REBOND = 60; // ms
void setup {
Serial.begin(115200);
pinMode(BTN_BOOT, INPUT_PULLUP);
pinMode(BTN_EXT, INPUT_PULLUP);
}
void loop {
if (digitalRead(BTN_BOOT) == LOW && millis - dernierAppui > ANTI_REBOND) {
dernierAppui = millis;
Serial.println("Bouton BOOT (GPIO0) presse !");
}
if (digitalRead(BTN_EXT) == LOW && millis - dernierAppui > ANTI_REBOND) {
dernierAppui = millis;
Serial.println("Bouton externe (GPIO1) presse !");
}
delay(5);
}
Verificación esperada
Abre el monitor serie a 115200 baudios: cada pulsación del botón BOOT imprime una línea única, sin duplicados debidos al rebote. El segundo botón (si está conectado entre GPIO1 y GND) se comporta de manera idéntica. La placa se reinicia normalmente tras un reset: GPIO0 nunca se ha mantenido en nivel BAJO durante el reinicio.
Errores frecuentes
- Entrada flotante: olvidar INPUT_PULLUP y leer estados aleatorios; el S3 posee resistencias de pull-up/pull-down internas, úsalas.
- Conectar una carga en GPIO0: si este pin se mantiene en nivel BAJO durante el reinicio, la placa entra en modo de descarga y parece «muerta»; es la trampa clásica de los pines de *strapping* (GPIO0, GPIO3, GPIO45, GPIO46).
- Confundir pulsación y mantenimiento: el código anterior detecta el nivel, no el flanco; para un conteo estricto, memoriza el estado anterior.
- Antirrebote demasiado corto: por debajo de 30 ms los rebotes mecánicos crean pulsaciones fantasma; 50 a 60 ms es un buen compromiso.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino