Ir al contenido
← Volver a Formación Arduino Principiante

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.

Dificultad: Principiante · Tiempo: 35 min · Cerebro: Arduino Uno

🧰 Lista de materiales

Arduino Uno R3 (ATmega328P)
Arduino Uno R3 (ATmega328P)
Lee el botón, conmuta el LED
sin foto
Pulsador táctil 12×12 mm
Entrada del usuario
LED 5 mm verde difuso
LED 5 mm verde difuso
Indicador de estado
sin foto
Resistencias película metálica 1/4 W
220 Ω para el LED
Breadboard 830 puntos
Breadboard 830 puntos
Montaje

🎯 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

DesdeHasta
Pulsador pata AD2
Pulsador pata B (diagonal)GND
LED ánodoD8 a través de 220 Ω
LED cátodoGND
NotaEl pulsador de 4 patas conecta sus patas por pares. Usa dos patas en diagonal para asegurarte de cruzar el contacto.

💻 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

  1. Inserta el pulsador a caballo del canal central de la breadboard.
  2. Conecta una pata a D2 y la diagonal a GND.
  3. Monta el LED con su resistencia entre D8 y GND.
  4. Sube el sketch y pulsa: cada pulsación cambia el LED.

🧩 Resolución de problemas

SíntomaCausaSolución
El LED cambia varias veces por pulsaciónRebote no filtradoSube REBOTE a 80 ms
No respondeBotón en patas del mismo ladoUsa patas en diagonal
Cambia soloFalta pull-upConfirma INPUT_PULLUP

🚀 Para ir más lejos

  • Detecta pulsación larga vs. corta midiendo cuánto tiempo está LOW.
  • Usa la librería OneButton para dobles clics.
← Volver a Formación Arduino