🛠 Bouton poussoir avec anti-rebond
Objectifs
Lire un bouton poussoir sur PA0 et commander la LED PC13 en changeant d'état à chaque appui, en filtrant le rebond mécanique par logiciel (anti-rebond temporel). Vous apprendrez la configuration d'une entrée, la logique active-HIGH d'un bouton câblé avec pull-down, et la limite d'un anti-rebond par millis face aux appuis rapides.
Matériel
- Carte GD32F103C8T6 / GD32F103CBT6 compatible Blue Pill
- Bouton poussoir entre 3,3 V et PA0, avec résistance de pull-down vers la masse (le brochage vérifié de la fiche utilise PA0, appui = niveau HAUT) >
- LED embarquée sur PC13 (active-LOW)
- Alimentation 3,3 V (le circuit fonctionne entre 2,6 et 3,6 V)
Code complet
// 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);
}
Vérification attendue
Un appui franc allume la LED (si elle était éteinte), un second l'éteint, un seul changement d'état par appui. En secouant doucement le bouton, la LED ne doit pas « papillonner » : l'anti-rebond fait son travail. Vous pouvez ajouter une sortie Serial pour compter les appuis et vérifier qu'il n'y en a jamais deux pour un seul geste.
Erreurs fréquentes
- Bouton qui compte 2 à 5 appuis : anti-rebond absent ou trop court ; 30 à 50 ms est une bonne plage pour un bouton mécanique.
- Logique inversée : sans pull-down (interne ou externe), l'entrée PA0 flotte et l'état change tout seul ; ajoutez INPUT_PULLDOWN ou une résistance 10 kΩ vers la masse.
- Confusion de broche : la fiche vérifiée documente le bouton sur PA0 ; si votre carte a son bouton utilisateur sur PA1 (câblage Blue Pill classique), adaptez la broche. >
- millis qui « déborde » : comparez toujours avec
maintenant - dernierChangement >= Det nonmaintenant >= dernierChangement + D, qui casse au débordement après 49 jours. - LED active-LOW oubliée : écrire HIGH pour allumer laisse la LED éteinte.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinopotentiometre.inoArduinopont-uart.inoArduinooled-i2c.inoArduino