Si alguna vez has conectado un pulsador a un Arduino y el pin cambiaba solo entre HIGH y LOW sin tocar nada, el culpable era un pin flotante. En esta guía verás qué es una resistencia pull-up o pull-down, qué valor elegir y cómo resolverlo con una sola línea de código gracias a INPUT_PULLUP.
En resumen
- Un pin de entrada sin nada conectado flota: lee ruido y cambia al azar.
- Una pull-up lo fija a
HIGHen reposo; una pull-down, aLOW.- El valor típico es 10 kΩ; en buses I2C se usan valores menores, como 4,7 kΩ.
pinMode(pin, INPUT_PULLUP)activa la pull-up interna del Arduino: no necesitas resistencia externa, pero la lógica queda invertida.
Por qué un pin «flota»
Un pin configurado como entrada tiene una impedancia altísima: apenas consume corriente. Eso es bueno para leer señales, pero tiene un efecto secundario.

Si el pin no está conectado ni a VCC ni a GND, su tensión queda indefinida. Cualquier cosa la mueve: el campo eléctrico de tu mano, un cable cercano o la propia red eléctrica. El microcontrolador lee entonces valores aleatorios.
El caso típico es un pulsador conectado entre el pin y 5 V:
- Pulsado: el pin está a 5 V y lee
HIGH. Correcto. - Suelto: el pin no está conectado a nada y flota. Puede leer cualquier cosa.
La solución es dar al pin un estado por defecto con una resistencia.
Pull-up y pull-down: las dos opciones

| Pull-up | Pull-down | |
|---|---|---|
| Resistencia entre | Pin y VCC | Pin y GND |
| Pulsador entre | Pin y GND | Pin y VCC |
| Lectura en reposo | HIGH | LOW |
| Lectura al pulsar | LOW | HIGH |
| Lógica | Invertida (activo a nivel bajo) | Directa (activo a nivel alto) |
| Interna en Arduino AVR | Sí (INPUT_PULLUP) | No |
Cómo funciona una pull-up
Con el pulsador suelto, la resistencia «tira» del pin hacia VCC. Como la entrada casi no consume corriente, apenas cae tensión en la resistencia y el pin ve prácticamente 5 V.
Al pulsar, el pin queda conectado directamente a GND. La resistencia limita la corriente que circula de VCC a GND; sin ella, pulsar el botón sería un cortocircuito.
Cómo funciona una pull-down
Es el mismo principio al revés: la resistencia mantiene el pin en GND y el pulsador lo lleva a VCC. Es más intuitiva (pulsado = HIGH), pero en un Arduino Uno necesita una resistencia externa.
Qué valor elegir
La resistencia debe ser lo bastante baja para fijar el pin con firmeza frente al ruido, y lo bastante alta para no desperdiciar corriente cuando el pulsador está cerrado.
La corriente con el pulsador pulsado sale de la ley de Ohm, I = V / R:
| Resistencia | Corriente a 5 V | Corriente a 3,3 V | Comentario |
|---|---|---|---|
| 1 kΩ | 5 mA | 3,3 mA | Muy firme, pero gasta bastante |
| 4,7 kΩ | ~1,1 mA | ~0,7 mA | Habitual en buses I2C |
| 10 kΩ | 0,5 mA | 0,33 mA | El valor por defecto para pulsadores |
| 47 kΩ | ~0,1 mA | ~0,07 mA | Bajo consumo, más sensible al ruido |
| 100 kΩ o más | 0,05 mA | 0,03 mA | Solo en proyectos a pilas y cables cortos |
Reglas prácticas:
- Pulsadores e interruptores: 10 kΩ.
- Cables largos o entornos ruidosos: baja a 4,7 kΩ o 2,2 kΩ.
- Bus I2C: 4,7 kΩ es el valor más habitual; muchos módulos ya los llevan soldados. Más detalles en I2C, SPI y UART.
- Proyectos con batería: valores altos (47–100 kΩ) si el pulsador puede quedar cerrado mucho tiempo.
Si no sabes leer el valor de una resistencia, tienes el código de colores de resistencias.
INPUT_PULLUP en Arduino
Los microcontroladores AVR (Uno, Nano, Mega) llevan una resistencia pull-up interna en cada pin digital. Según la documentación de Arduino, en la mayoría de placas AVR su valor está entre 20 kΩ y 50 kΩ.

Se activa así:
pinMode(2, INPUT_PULLUP);
Con eso basta con conectar el pulsador entre el pin y GND. Sin resistencias externas.
Ejemplo: pulsador que enciende el LED integrado
Montaje:
- Una pata del pulsador al pin 2.
- La otra pata a GND.
const int PULSADOR = 2;
const int LED = LED_BUILTIN;
void setup() {
pinMode(PULSADOR, INPUT_PULLUP);
pinMode(LED, OUTPUT);
}
void loop() {
// Con pull-up, pulsado = LOW
if (digitalRead(PULSADOR) == LOW) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}
Fíjate en la comparación con LOW: es la lógica invertida típica de las pull-up.
Ejemplo: pull-down externa
Si prefieres que pulsado sea HIGH:
- Pulsador entre el pin 2 y 5 V.
- Resistencia de 10 kΩ entre el pin 2 y GND.
const int PULSADOR = 2;
void setup() {
pinMode(PULSADOR, INPUT);
Serial.begin(9600);
}
void loop() {
if (digitalRead(PULSADOR) == HIGH) {
Serial.println("Pulsado");
}
delay(50);
}
Pull-up y pull-down en el ESP32
El ESP32 tiene resistencias internas de pull-up y de pull-down en la mayoría de sus pines:
pinMode(4, INPUT_PULLUP); // pull-up interna
pinMode(5, INPUT_PULLDOWN); // pull-down interna
Ojo con una excepción importante: según la documentación de Espressif, los pines GPIO34 a GPIO39 del ESP32 original solo funcionan como entrada y no tienen pull-up ni pull-down internas. Si conectas un pulsador ahí, necesitas una resistencia externa.
Recuerda también que el ESP32 trabaja a 3,3 V: la pull-up externa debe ir a 3,3 V, nunca a 5 V.
Errores habituales
| Error | Síntoma | Solución |
|---|---|---|
Pulsador sin resistencia ni INPUT_PULLUP | Lecturas aleatorias, el LED parpadea solo | Activa INPUT_PULLUP o añade 10 kΩ |
Usar INPUT_PULLUP y comparar con HIGH | Funciona al revés | Con pull-up, pulsado es LOW |
Pulsador entre pin y VCC con INPUT_PULLUP | El pin lee siempre HIGH | Con pull-up, el pulsador va a GND |
| Pull-up interna en el pin 13 del Uno | El pin se queda a unos 1,7 V | El LED de la placa tira del pin hacia abajo; usa otro pin |
| Pull-up a 5 V en un ESP32 | Riesgo de dañar el pin | Usa siempre 3,3 V |
| Leer varias pulsaciones con un solo toque | Rebotes mecánicos | Añade un retardo (debounce) por software o un condensador |
Un apunte sobre los rebotes
Los contactos de un pulsador rebotan durante unos milisegundos al cerrarse, generando varios cambios rápidos. Las resistencias pull-up no lo evitan. La solución más sencilla es ignorar los cambios durante 20–50 ms después de detectar uno, o usar una librería como Bounce2.
Preguntas frecuentes
¿Es mejor la pull-up interna o una externa?
Para pulsadores con cables cortos, la interna es suficiente y te ahorra componentes. Con cables largos o ruido eléctrico, una externa de 4,7–10 kΩ es más fiable porque su valor es más bajo y conocido.
¿Puedo poner pull-up y pull-down a la vez?
No tiene sentido: formarían un divisor de tensión y el pin quedaría a una tensión intermedia, que puede no leerse ni como HIGH ni como LOW.
¿Las salidas también necesitan pull-up?
Las salidas normales no, porque fijan su nivel ellas mismas. Sí las necesitan las salidas en drenador abierto (como el bus I2C), que solo pueden tirar hacia GND.



