🛠 Bouton poussoir avec anti-rebond
Objetivos
Leer un botón pulsador en PA0 y controlar el LED PC13 cambiando de estado en cada pulsación, filtrando el rebote mecánico por software (antirrebote temporal). Aprenderás la configuración de una entrada, la lógica activa-ALTA de un botón cableado con resistencia de pull-down, y la limitación de un antirrebote basado en millis frente a pulsaciones rápidas.
Material
- Placa GD32F103C8T6 / GD32F103CBT6 compatible Blue Pill
- Botón pulsador entre 3,3 V y PA0, con resistencia de pull-down hacia masa (el pinout verificado de la ficha utiliza PA0, pulsación = nivel ALTO) >
- LED integrado en PC13 (activo-BAJO)
- Alimentación de 3,3 V (el circuito funciona entre 2,6 y 3,6 V)
Código completo
// bouton_antirebond.ino — GD32F103C8, core CommunityGD32Cores
#include <Arduino.h>
const uint8_t BTN = PA0; // appui = HIGH (pull-down externe)
const unsigned long DEBOUNCE_MS = 50;
bool etatStable = false; // état filtré du bouton
bool dernierLu = false; // dernière lecture brute
unsigned long dernierChangement = 0;
bool ledAllumee = false;
void setup {
pinMode(BTN, INPUT_PULLDOWN); // pull-down interne : pas obligatoire si R externe
pinMode(PC13, OUTPUT);
digitalWrite(PC13, HIGH); // LED éteinte (active-LOW)
}
void loop {
bool brut = digitalRead(BTN);
unsigned long maintenant = millis;
if (brut != dernierLu) {
dernierChangement = maintenant; // le signal bouge : on repart
dernierLu = brut;
} else if (maintenant - dernierChangement >= DEBOUNCE_MS
&& brut != etatStable) {
etatStable = brut; // état confirmé après 50 ms stables
if (etatStable) { // front montant = appui
ledAllumee = !ledAllumee;
}
}
digitalWrite(PC13, ledAllumee ? LOW : HIGH);
}
Verificación esperada
Una pulsación clara enciende el LED (si estaba apagado), una segunda lo apaga, un solo cambio de estado por pulsación. Al mover suavemente el botón, el LED no debe «parpadear»: el antirrebote está haciendo su trabajo. Puedes añadir una salida Serial para contar las pulsaciones y verificar que nunca se cuentan dos por un solo gesto.
Errores frecuentes
- El botón cuenta de 2 a 5 pulsaciones: antirrebote ausente o demasiado corto; 30 a 50 ms es un buen rango para un botón mecánico.
- Lógica invertida: sin pull-down (interno o externo), la entrada PA0 queda flotante y el estado cambia solo; añade INPUT_PULLDOWN o una resistencia de 10 kΩ hacia masa.
- Confusión de pin: la ficha verificada documenta el botón en PA0; si tu placa tiene su botón de usuario en PA1 (cableado Blue Pill clásico), adapta el pin. >
- Desbordamiento de
millis: compara siempre conahora - ultimoCambio >= Dy no conahora >= ultimoCambio + D, que falla al desbordarse después de 49 días. - LED activo-BAJO olvidado: escribir HIGH para encender deja el LED apagado.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinopotentiometre.inoArduinopont-uart.inoArduinooled-i2c.inoArduino