🛠 Bouton poussoir et retour dans la console
Objectifs
Lire une entrée numérique : un bouton poussoir câblé vers GND avec pull-up interne, et afficher l'état dans la console à chaque appui. Vous apprendrez la logique inversée (appui = niveau bas), le rebond mécanique (bounce) et le polling simple en shell.
Matériel
- Carte type Raspberry Pi 3 Model B+ sous Raspberry Pi OS
- 1 bouton poussoir
- 2 fils Dupont (pas de résistance externe nécessaire : pull-up interne)
- Accès terminal (SSH ou écran clavier)
Code complet
Câblage : broche 13 (GPIO27) → une patte du bouton ; autre patte → broche 9 (GND). Le pull-up interne garde la ligne à 1 au repos.
#!/usr/bin/env bash
# bouton.sh — affiche un message à chaque appui (GPIO27, broche 13)
# Active le pull-up interne puis boucle sur la lecture de la ligne.
sudo gpioset --quiet --hold-period 0ms gpiochip0 27=0 2>/dev/null || true
echo "Appuyez sur le bouton (Ctrl-C pour quitter)..."
while true; do
# gpiodetect/gpiget : lecture de la ligne ; 0 = bouton pressé (logique inversée)
état=$(sudo gpiget gpiochip0 27 2>/dev/null || echo 1)
if [ "$état" = "0" ]; then
echo "Bouton pressé à $(date +%T)"
sleep 0.3 # anti-rebond logiciel grossier
while [ "$(sudo gpiget gpiochip0 27 2>/dev/null || echo 1)" = "0" ]; do
sleep 0.05 # attend le relâchement
done
fi
sleep 0.02
done
Vérification attendue
Chaque appui affiche une ligne « Bouton pressé » avec l'heure, une seule fois par appui malgré le rebond mécanique. Au repos, la ligne se lit 1 grâce au pull-up interne ; appuyé, elle tombe à 0.
Erreurs fréquentes
- Oublier le pull-up : la ligne flotte, l'état change tout seul (comptage fantôme).
- Se tromper de logique : ici pressé = 0, pas 1 ; câbler le bouton vers 3,3 V au lieu de GND inverse la logique.
- Pas d'anti-rebond : un appui unique déclenche 5 à 20 détections.
- Confondre broche 13 (GPIO27) avec GPIO13 : vérifiez la correspondance sur le schéma du connecteur.
- Utiliser une broche PWM/I2C déjà revendue par un overlay : choisir une broche GPIO libre.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython