Cómo conectar un pulsador a Arduino: pull-up, pull-down y antirrebote
¿Cómo se conecta un pulsador a Arduino? Interior del pulsador de 4 patas, resistencias pull-up y pull-down, INPUT_PULLUP, antirrebote y un ejemplo para encender y apagar un LED.
El pulsador es la pieza más sencilla para llevar el toque del usuario a un proyecto con Arduino. Al pulsarlo une dos contactos y al soltarlo los separa. Aunque parece simple, mal conectado da lecturas aleatorias o cuenta una pulsación varias veces. En esta guía explicamos cómo conectarlo y leerlo correctamente.

Interior de un pulsador de 4 patas
El pulsador táctil de 6×6 mm que más usarás en la protoboard tiene 4 patas pero solo 2 puntos de conexión: las parejas de patas opuestas ya están unidas por dentro. Al pulsar se unen las dos parejas. Si colocas el pulsador sobre el canal central de la protoboard, cada pareja queda en filas distintas y es fácil acertar con la orientación.
¿Por qué hace falta una resistencia pull-up o pull-down?
Cuando el pulsador no está pulsado, el pin de entrada del Arduino no está conectado a nada; es una entrada flotante. Ese pin capta ruido eléctrico y lee HIGH o LOW al azar. La solución es llevar el pin a un nivel fijo mediante una resistencia:
| Método | Conexión | Sin pulsar | Pulsado |
|---|---|---|---|
| Pull-down | 10 kΩ pin → GND, pulsador pin → 5V | LOW | HIGH |
| Pull-up (externa) | 10 kΩ pin → 5V, pulsador pin → GND | HIGH | LOW |
| INPUT_PULLUP (interna) | Pulsador pin → GND, sin resistencia | HIGH | LOW |
Lo más práctico es usar pinMode(pin, INPUT_PULLUP): se activa la resistencia interna del Arduino, de unos 20–50 kΩ, y solo conectas el pulsador entre el pin y GND. La única diferencia es que la lógica se invierte: al pulsar se lee LOW.
Antirrebote: ¿por qué una pulsación cuenta varias veces?
En el instante en que se tocan los contactos metálicos, vibran durante unos milisegundos y el circuito se abre y se cierra muchas veces. Como el Arduino lee tan rápido, puede ver una pulsación como 3–5. A esto se le llama rebote de contactos. Para resolverlo por software, se ignoran los cambios durante unos 50 ms después del último cambio.
const int BUTTON_PIN = 2; // buton pin ile GND arasında / button between pin and GND
const int LED_PIN = 13; // karttaki LED / onboard LED
bool ledOn = false;
int lastReading = HIGH;
int stableState = HIGH;
unsigned long lastChange = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP); // dahili pull-up / internal pull-up
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int reading = digitalRead(BUTTON_PIN);
if (reading != lastReading) lastChange = millis(); // değişti / changed
if (millis() - lastChange > 50 && reading != stableState) {
stableState = reading; // 50 ms kararlı / stable for 50 ms
if (stableState == LOW) { // basıldı / pressed
ledOn = !ledOn; // LED'i değiştir / toggle LED
digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
}
}
lastReading = reading;
}Este código cambia el LED una vez por pulsación; mantener el botón pulsado no lo sigue cambiando. Como usa millis() en lugar de delay(), el bucle nunca espera y puede hacer otras tareas a la vez.
Errores frecuentes
- Colocar el pulsador al revés: si usas una pareja de patas ya unida, el botón se lee siempre pulsado. Gíralo 90°.
- No usar resistencia: sin pull-up ni pull-down la lectura cambia al azar.
- Esperar la lógica equivocada con INPUT_PULLUP: al pulsar se lee LOW, no HIGH; escribe las condiciones en consecuencia.
- Usar un delay() largo como antirrebote: el programa no puede hacer nada durante ese tiempo; temporizar con millis() es mejor.
- Usar los pines 34–39 en la ESP32: no tienen pull-up interna; añade una resistencia externa o elige otro pin.
Para colocar bien el pulsador y la resistencia en la protoboard, lee ¿Qué es una protoboard?; para entender los valores de pull-up, ¿Qué es una resistencia?.
Preguntas frecuentes
¿Qué resistencia necesito para un pulsador?
10 kΩ es lo estándar para pull-up o pull-down. Con INPUT_PULLUP no necesitas ninguna resistencia externa.
¿Por qué el pulsador lee LOW al pulsarlo?
Con INPUT_PULLUP o una pull-up externa, el pin está normalmente en HIGH; el pulsador lo une a GND, así que al pulsar lee LOW. Es el comportamiento esperado.
¿Cuánto debe durar el antirrebote?
Entre 20 y 50 ms basta para la mayoría de pulsadores. Los viejos o de baja calidad pueden necesitar 80–100 ms.
¿Cómo leo varios pulsadores?
Conecta cada uno a su propio pin y ponlos todos en INPUT_PULLUP. Para muchos botones se usa un teclado matricial (keypad) o se leen en un solo pin analógico con resistencias distintas.
Proyectos para hacer después de leer esto
Ver todos los proyectos
Quemador Led con Pulsador (Push)
Proyecto de control instantáneo (push) que enciende el LED al pulsar el botón y lo apaga al soltarlo. Enseña el uso de la lectura de botones y la expresión condicional con digitalRead.

Led Encendido con Botón (On Off)
Un proyecto de conmutación que cambia el estado del LED (encendido/apagado) cada vez que se pulsa un botón. Enseña la variable de estado y la lógica de rebote.

Piano sencillo con timbre y botón
Con 8 botones y zumbador, sencillo proyecto de piano que puede tocar notas desde Do hasta Do agudo. Enseña a simular un instrumento musical asignando distintas frecuencias a cada botón.

Pantalla de 7 segmentos y contador con botón
Proyecto de contador que aumenta, disminuye y reinicia el número en la pantalla de 7 segmentos con 3 botones. Enseña control de límites y lógica de contador interactiva con el usuario.

ESP32 LED de control con pulsador (Push)
El LED se enciende cuando se pulsa el botón y se apaga cuando se suelta. Muestra cómo se utiliza el pin de entrada digital del ESP32 y la resistencia pull-up interna. Gracias al modo INPUT_PULLUP, no se necesita ninguna resistencia externa.

ESP32 LED de control con el botón (Toggle)
Cada vez que se pulsa el botón, cambia el estado del LED: si está encendido se apaga, si está apagado se enciende. Patrón de conmutación clásico. Con debounce limpiamos el ruido mecánico del pulsador para garantizar una sola conmutación con una sola pulsación.

Raspberry Pi Pico Botón Toggle LED (GP14 + GP2)
¡Botón + LED — siguiente nivel! 🔁 A diferencia de #155, no necesitas mantener el botón presionado. Presiona y suelta → LED encendido. Presiona de nuevo → LED apagado (toggle). Mismo circuito que #155, gran diferencia de código. Aprende edge detection, state tracking y debounce.

Raspberry Pi Pico Botón Debounce: IRQ vs Software Polling (GP5 + GP4)
¿Una pulsación y el código cuenta 3-4? ¡Es contact bounce! 🔁 Compara 2 métodos de conteo en Serial: polling RAW (captura bounce, cuenta mal) vs IRQ + software debounce (preciso). Aprende física del bounce, software debounce, Pin.irq() interrupt, IRQ_FALLING trigger, ISR handlers, seguridad de variables globales en ISR.
Más artículos
Aprende por qué un pulsador solo da lecturas inestables, para qué sirve la resistencia pull-up, cómo usar INPUT_PULLUP y cómo el antirrebote cuenta bien las pulsaciones.

