🛠 Bouton poussoir et retour dans la console
Objetivos
Leer una entrada digital: un botón pulsador conectado a GND con pull-up interno, y mostrar el estado en la consola en cada pulsación. Aprenderás la lógica inversa (pulsación = nivel bajo), el rebote mecánico (bounce) y el polling simple en shell.
Material
- Placa tipo Raspberry Pi 3 Model B+ con Raspberry Pi OS
- 1 botón pulsador
- 2 cables Dupont (no se necesita resistencia externa: pull-up interno)
- Acceso a terminal (SSH o pantalla y teclado)
Código completo
Cableado: pin 13 (GPIO27) → una pata del botón; la otra pata → pin 9 (GND). El pull-up interno mantiene la línea en 1 en reposo.
#!/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)
etat=$(sudo gpiget gpiochip0 27 2>/dev/null || echo 1)
if [ "$etat" = "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
Verificación esperada
Cada pulsación muestra una línea «Botón pulsado» con la hora, una sola vez por pulsación a pesar del rebote mecánico. En reposo, la línea se lee como 1 gracias al pull-up interno; al pulsar, cae a 0.
Errores frecuentes
- Olvidar el pull-up: la línea queda flotante, el estado cambia solo (conteo fantasma).
- Equivocarse de lógica: aquí pulsado = 0, no 1; cablear el botón hacia 3,3 V en lugar de GND invierte la lógica.
- Sin antirrebote: una única pulsación provoca de 5 a 20 detecciones.
- Confundir el pin 13 (GPIO27) con GPIO13: verifique la correspondencia en el esquema del conector.
- Utilizar un pin PWM/I2C ya reclamado por un overlay: elija un pin GPIO libre.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython