Las entradas digitales en Arduino. Los pulsadores.
| Actualizado:
Comentarios: 0

En muchos de los proyectos con Arduino nos encontraremos un pulsador o botón. Aquí veremos cómo hacer para utilizar correctamente sus señales. Primero, explicaremos qué son las resistencias pull-up y pull-down, montaremos un circuito eléctrico con un pulsador y una resistencia pull-down y otro pulsador con una resistencia pull-up, veremos cómo mantener un led encendido mientras se pulsa un botón, y por último, programaremos un cronómetro con dos pulsadores y un led.
Como ya sabemos las entradas digitales son aquellas que pueden tener dos valores LOW y HIGH. Lo que realmente recibimos es un voltaje de 0V (LOW) o de 5V (HIGH). La dos funciones que se utilizan para las entradas digitales básicamente son:
- pinMode(pin, INPUT): sirve para configurar el pin digital, bien de salida o bien de entrada. INPUT, nos indica que es de entrada.
- digitalRead(pin): lee el valor de entrada del pin digital indicado. Devuelve un valor HIGH o LOW, en función del voltaje recibido.
Resistencias de pull-up y pull-down.

Sabemos entonces que estamos trabajando con 2 estados: HIGH, 5V, o LOW, 0V. Puede ocurrir que debido al ruido, a variaciones en la fuente de alimentación, la señal sea indeterminada. Para solucionar esto emplearemos las resistencias. En la siguiente imagen se pueden ver las configuraciones según donde esté colocada la resistencia:
La resistencia pull-down tiende hacia cero. La resistencia se conecta a tierra. Si el interruptor está abierto, la corriente se dirige hacia la resistencia, garantizando un valor LOW. Mientras que si el interruptor está cerrado, la corriente se dirige hacia el pin dando un valor HIGH.
La resistencia pull-up tiende a 5V. La resistencia se conecta a la fuente de alimentación. Si el interruptor está abierto, la corriente va hacia el pin y nos da un valor HIGH. Pero si el interruptor está cerrado, la corriente va a tierra, provocando un valor LOW de salida hacia el pin.
Circuito eléctrico con un pulsador y resistencia pull-down.
Vamos a realizar un circuito que es capaz de monitorizar el estado de un pulsador utilizando una resistencia Pull Down.
Material necesario:
- Arduino Uno o similar.
- Protoboard.
- Cables.
- Un pulsador.
- Resistencia de 10 KΩ
Esquema del circuito:

Las conexiones del pulsador son, por un lado, directa a la fuente de alimentación y por otro, a tierra a través de la resistencia pul-down (10KΩ). Existe un tercer cable, conectado entre el pulsador y la placa de Arduino, que va a parar al pin digital de la placa Arduino (en este caso particular, el nº 8). Este pin digital deberá configurarse como pin de entrada porque allí será donde se reciba la señal que indique el estado del pulsador.
Código:
int estadoBoton=0; //Guardará el estado del botón (HIGH ó LOW)
void setup(){
pinMode(8,INPUT); //Pin donde está conectado el pulsador
Serial.begin(9600);
}
void loop() {
estadoBoton=digitalRead(8);
Serial.println(estadoBoton);
delay (50); //Para mayor estabilidad entre lecturas
}
Circuito eléctrico con un pulsador y resistencia pull-up
En este ejemplo vamos a crear un circuito para monitorizar el estado de un pulsador usando una resistencia pull-up.
Material necesario:
- Arduino Uno o similar.
- Protoboard.
- Cables.
- Un pulsador.
- Resistencia de 10 KΩ

Aquí podemos comprobar cómo las conexiones del pulsador son, por un lado, hacia la fuente de alimentación, pero a través de la resistencia pull-up (10 KΩ) y por otro lado, la conexión es directa a tierra. Existe un tercer cable, conectado entre el pulsador y la resistencia que va a parar a un pin digital de la placa Arduino (en este caso particular, el nº 8). Este pin digital deberá configurarse como pin de entrada porque allí será donde se reciba la señal que indique el estado del pulsador.
El código que pusimos para monitorizar el pulsador en el circuito con resistencia pull-down sigue siendo válido ahora también con el circuito de resistencia pull-up; pero veremos que los valores 0 y 1 están invertidos. Si con una resistencia pull-down nos daba HIGH sin presionar el pulsador, con una resistencia pull-up nos dará un valor LOW.
int estadoBoton=0; //Guardará el estado del botón (HIGH ó LOW)
void setup(){
pinMode(8,INPUT); //Pin donde está conectado el pulsador
Serial.begin(9600);
}
void loop() {
estadoBoton=digitalRead(8);
Serial.println(estadoBoton);
delay (50); //Para mayor estabilidad entre lecturas
}
Encendido de un led mientras se mantiene pulsado un botón.
En este ejemplo trataremos de hacer que un led se encienda mientras pulsamos un botón, el led se apagará en el momento que soltemos el botón.
Material necesario:
- Arduino Uno o similar.
- Protoboard.
- Cables.
- Un pulsador.
- Un led.
- Resistencia de 10 KΩ y otra de 220 Ω
Diseñamos dos circuitos independientes: uno para el manejo del pulsador con configuración pull-down, y otro, para el encendido del led.

int estadoBoton=0; //Guardará el estado del botón (HIGH ó LOW)
void setup(){
pinMode(4,OUTPUT); //Donde está conectado el LED
pinMode(8,INPUT); //Donde está conectado el pulsador
}
void loop() {
estadoBoton=digitalRead(8);
//Si se detecta que el botón está pulsado, se enciende el LED
if (estadoBoton == HIGH) {
digitalWrite(4,HIGH);
} else {
digitalWrite(4,LOW);
}
}
Ahora con el mismo esquema de conexión vamos a programar un botón de apagado y encendido, es decir, cuando se pulse el botón se mantendrá encendido el led y cuando se le vuelva a pulsar, se apagará.
int estadoActual=0; //Guarda el estado actual del botón
int estadoUltimo=0; //Guarda el último estado del botón
int contador=0; //Guarda las veces que se pulsa el botón
void setup(){
pinMode(4,OUTPUT); //Donde está conectado el LED
pinMode(8,INPUT); //Donde está conectado el pulsador
Serial.begin(9600);
}
void loop(){
//Leo el nuevo estado actual del botón
estadoActual=digitalRead(8);
//Si éste cambia respecto el estado justo anterior…
if (estadoActual != estadoUltimo){
/* lo notifico. Ojo, tengo que comprobar que el cambio sea una
pulsación y no una liberación. Si hubiéramos usado una resistencia
pull-up, el valor a comprobar de "estadoActual" sería LOW */
if (estadoActual == HIGH) {
contador = contador + 1;
Serial.print ("Ésta es la pulsación nº ");
Serial.println(contador);
}
}
//Guardo el estado actual para la siguiente comprobación
estadoUltimo= estadoActual;
/*Cambiamos el estado del LED contando las veces que se ha pulsado el
botón, de forma alternativa (número par = LED apagado, número impar =
LED encendido) ¡Ojo, no contamos cuando se suelta!)*/
if (contador % 2 == 0 ) {
digitalWrite(4, LOW);
} else {
digitalWrite(4, HIGH);
}
}
¿Cómo hacer un cronómetro con Arduino? Dos pulsadores y un led.
En este ejemplo trabajaremos con dos pulsadores: uno de ellos para comenzar a contar, y otro para parar. Añadiremos un led que se iluminará mientras cuenta.
Material necesario:
- Arduino Uno o similar.
- Protoboard.
- Cables.
- Dos pulsadores.
- Un led.
- Dos resistencia de 10 KΩ y otra de 220 Ω

El esquema consta de dos pulsadores independientes con resistencias pull-up. El pulsador uno lo conectaremos en el pin digital 2, y el pulsador dos en el pin digital 3. También montaremos un led que estará conectado al pin digital 4.
unsigned long inicio, fin, tiempo;
boolean contando;
void setup() {
Serial.begin(9600);
pinMode(4,OUTPUT); // Led que nos indica si esta contando
pinMode(2, INPUT); // Boton de cominezo
digitalWrite(2, HIGH); // se activa la resistencia de pull up
pinMode(3, INPUT); // boton de finalización
digitalWrite(3, HIGH); // se activa la resistencia de pull up
Serial.println ("Botón 1 para iniciar y 2 para terminar");
contando = false;
}
void resultados(){
float h, m, s, ms;
unsigned long over;
tiempo = fin - inicio;
h = int(tiempo / 3600000);
over = tiempo % 360000;
m = int(over / 60000);
over = over % 60000;
s = int(over / 1000);
ms = over % 1000;
Serial.print("Tiempo trancurrido en lilis: ");
Serial.println(tiempo);
Serial.print("Tiempo transcurrido: ");
Serial.print(h, 0);
Serial.print("h ");
Serial.print(m, 0);
Serial.print("m ");
Serial.print(s, 0);
Serial.print("s ");
Serial.print(ms, 0);
Serial.println("ms ");
Serial.println();
}
void loop() {
if(digitalRead(2) == LOW){ // ESTAMOS EN PULL-UP
if(contando){
Serial.println("Ya hemos comenzado ");
digitalWrite(4,HIGH);
}else{
contando = true;
inicio = millis();
delay(200); // por seguridad
Serial.println("Empezamos...");
}
}
if(digitalRead(3) == LOW){ // ESTAMOS EN PULL-UP
if(contando){
digitalWrite(4,LOW);
contando = false;
fin = millis();
delay(200); // por seguridad
resultados();
}else{
Serial.println("Pulse comenzar antes de finalizar...");
}
}
}