03. Pulsador con antirrebote y LED conmutado
Un botón que enciende y apaga un LED a cada pulsación. Aprende entradas digitales, resistencias pull-up y el rebote de contactos.
🧰 Lista de materiales
🎯 Qué vas a aprender
Leer un botón parece trivial, pero esconde dos trampas clásicas: el estado flotante de una entrada sin conectar y el rebote mecánico de los contactos. Resolverlas bien es lo que separa un código que «a veces funciona» de uno fiable.
📚 Teoría: pull-up interna y rebote
Un pin de entrada sin nada conectado «flota»: capta ruido y lee HIGH o LOW al azar. Para fijarlo usamos una resistencia pull-up que lo mantiene en HIGH cuando el botón está suelto. El ATmega328P trae pull-ups internas: se activan con INPUT_PULLUP y nos ahorran un componente.
Con pull-up, la lógica se invierte: botón suelto = HIGH, botón pulsado = LOW (conecta el pin a GND).
El rebote: al pulsar, los contactos metálicos chocan y abren-cierran varias veces en pocos milisegundos. Sin filtrarlo, una pulsación cuenta como cinco. Lo resolvemos ignorando cambios durante ~50 ms tras detectar uno.
🔌 Conexiones
| Desde | Hasta |
|---|---|
| Pulsador pata A | D2 |
| Pulsador pata B (diagonal) | GND |
| LED ánodo | D8 a través de 220 Ω |
| LED cátodo | GND |
💻 Código completo
// Toggle de LED con pulsador y antirrebote
const int PIN_BOTON = 2;
const int PIN_LED = 8;
bool estadoLed = false;
bool ultimaLectura = HIGH;
unsigned long ultimoCambio = 0;
const unsigned long REBOTE = 50; // ms
void setup() {
pinMode(PIN_BOTON, INPUT_PULLUP); // pull-up interna
pinMode(PIN_LED, OUTPUT);
}
void loop() {
bool lectura = digitalRead(PIN_BOTON);
if (lectura != ultimaLectura) {
ultimoCambio = millis(); // empezó un posible cambio
}
if (millis() - ultimoCambio > REBOTE) {
// la señal lleva estable > 50 ms: es real
static bool estadoEstable = HIGH;
if (lectura != estadoEstable) {
estadoEstable = lectura;
if (estadoEstable == LOW) { // flanco de pulsación
estadoLed = !estadoLed;
digitalWrite(PIN_LED, estadoLed);
}
}
}
ultimaLectura = lectura;
}🛠️ Montaje paso a paso
- Inserta el pulsador a caballo del canal central de la breadboard.
- Conecta una pata a D2 y la diagonal a GND.
- Monta el LED con su resistencia entre D8 y GND.
- Sube el sketch y pulsa: cada pulsación cambia el LED.
🧩 Resolución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
| El LED cambia varias veces por pulsación | Rebote no filtrado | Sube REBOTE a 80 ms |
| No responde | Botón en patas del mismo lado | Usa patas en diagonal |
| Cambia solo | Falta pull-up | Confirma INPUT_PULLUP |
🚀 Para ir más lejos
- Detecta pulsación larga vs. corta midiendo cuánto tiempo está LOW.
- Usa la librería
OneButtonpara dobles clics.