Inicio » Componentes para Arduino » Interruptores para Arduino » Contador con un pulsador y Arduino

En el anterior tutorial vimos cómo conectar un pulsador de membrana con Arduino. Si no lo viste te recomiendo que lo veas antes de seguir porque necesitamos el mismo circuito, así que es importante que lo tengas claro.

Te dejo aquí el enlace para que lo puedas ver: “Como conectar un pulsador de membrana con Arduino“.

Si ya tienes claro cómo conectar un pulsador con Arduino vamos a ir un paso más allá y vamos a implementar un contador.

Materiales

Una placa Arduino (Yo usaré Arduino UNO)
Un pulsador de membrana
Un condensador de 0,1uF
Una resistencia de 10kΩ
Cables (hembra-macho y macho-macho)
Una protoboard
Un ordenador con el IDE de Arduino instalado

Conexiones

Como puedes ver en la siguiente imagen, el circuito es exactamente el mismo que el del anterior tutorial de pulsadores:

Pulsador de membrana conectado con Arduino con resistencia de pull down

Recuerda que este tipo de pulsador tiene los pines conectados internamente 2 a 2, por lo que los dos pines de la derecha (en la imagen) están conectados entre si internamente, así que se comportan como el mismo pin. Ocurre lo mismo con los dos de la izquierda (en la imagen).

Teniendo en cuenta esto, vamos a revisar las conexiones. El pin de la derecha está conectado a la línea roja de la protoboard. Fíjate que hay un cable rojo conectado en el pin de 5V de Arduino que va hacia esa línea. Esto implica que toda esa línea está alimentada con 5V, incluido el pulsador por estar conectado a ella.

Con eso conseguimos que llegue alimentación al pulsador, ahora vamos a revisar el pin izquierdo.

El pin izquierdo del pulsador va conectado a tierra (GND) y a un pin digital del Arduino. En este ejemplo va conectado al pin 2 (cable verde).

Fíjate que el pin GND de Arduino va conectado a la línea negra de la protoboard haciendo que toda esta línea sea tierra.

Como puedes ver en la imagen, la conexión que va a tierra desde el pulsador tiene una resistencia de 10kΩ. Al hacer la conexión de esta forma estamos usando una resistencia de pull down. Esto implica que el valor que recibe el Arduino cuando está el pulsador en reposo es 0 (LOW) y 1 (HIGH) cuando esté pulsado.

Circuito mejorado

Para mejorar el circuito conecta un condensador de 0.1uF al pulsador tal y como se ve en la siguiente imagen. Esto ayudará a reducir los rebotes:

pulsador con resistencia y condensador Arduino

Puedes saber más sobre esto aquí: Cómo eliminar rebotes con Arduino.

Sketch

El sketch que necesitamos para hacer un contador con un pulsador y Arduino es el siguiente:

//declaraciones:
const int PULSADOR = 2;
int contador = 0;

//configuración
void setup()
{
  Serial.begin(9600);
  pinMode(PULSADOR, INPUT);
}

//función loop:
void loop()
{
  while(digitalRead(PULSADOR)==LOW);
  contador++;
  Serial.println(contador);
  while(digitalRead(PULSADOR)==HIGH);
}

Declaraciones

Por un lado he declarado una constante entera que he llamado PULSADOR a la que he dado valor 2. Es el pin digital en el que está conectado el pulsador:

const int PULSADOR = 2;

Por otro lado, he declarado una variable entera que he llamado contador. Esta variable nos será útil para contar las veces que se presiona el pulsador. La tenemos que inicializar a 0 porque posteriormente la iremos incrementando en una unidad cada vez que se haga una pulsación:

int contador = 0;

Configuración

Dentro de la función loop tenemos que inicializar el puerto serie y configurar el pin digital en el que está conectado el pulsador.

El puerto serie lo necesitamos porque mostraremos en el monitor serie el valor del contador cada vez que se presione el pulsador. Para inicializar el puerto serie usamos esta instrucción:

Serial.begin(9600);

En cuanto al pin digital en el que está conectado el pulsador, lo tenemos que configurar como entrada, puesto que queremos recibir una señal cada vez que se presione el pulsador. Para eso usamos la función pinMode:

pinMode(PULSADOR, INPUT);

Recuerda que pulsador es la constante que definimos antes con valor 2, por lo que le estamos diciendo a Arduino que el pin 2 es una entrada (INPUT).

Función loop

Llegamos a la función principal donde comprobaremos si se presiona el pulsador e incrementaremos el contador cuando eso ocurra.

Fíjate en el primera instrucción dentro de la función loop:

while(digitalRead(PULSADOR)==LOW);

Se trata de un bucle while con un punto y coma al final. Está hecho así porque no queremos que haga nada, solo que se repita mientras se cumpla la condición. Hacerlo así nos permite que el código no avance mientras la condición sea cierta. En este caso, la condición es que el pulsador esté en reposo, es decir, que no haya sido presionado: digitalRead(PULSADOR)==LOW.

Cuando el valor devuelto por digitalRead(PULSADOR) sea HIGH significará que se ha presionado el pulsador, por lo que la condición del while será falta y las repeticiones se detendrán, permitiendo que la siguiente instrucción se ejecute:

contador++;

Esta instrucción incrementa el valor de la variable contador en una unidad. Recuerda que el bucle while se paró porque se presionó el pulsador, por lo que necesitamos contar esa pulsación.

Una vez incrementado el contador, lo siguiente es mostrar su valor en el monitor serie, de eso se encarga la siguiente instrucción:

Serial.println(contador);

La función Serial.println envía al puerto serie lo que indiquemos entre paréntesis, en este caso el valor de la variable contador. Todo lo que se envía al puerto serie se puede visualizar a través del monitor serie, de esa forma podremos ver cómo se van contando las pulsaciones.

En principio puede parecer que con esto es suficiente, pero debes tener en cuenta que los pulsadores producen rebotes, y si no aplicas ninguna técnica para controlarlos el resultado no será el esperado. Lo que ocurrirá en este ejemplo es que el contador se incrementará varias veces por cada pulsación y tendrás una salida como esta:

monitor serie Arduino con rebotes

He presionado solo una vez el pulsador y sin embargo ha contado 697 pulsaciones.

Para evitar los rebotes (o al menos reducirlos de forma considerable) vamos a incluir la última instrucción dentro de la función loop:

while(digitalRead(PULSADOR)==HIGH);

Este while se estará repitiendo mientras entre valor HIGH por el pin digital 2, que es en el que está el pulsador conectado.

Recuerda que pusimos un while similar al inicio de la función loop para esperar una pulsación. Si la ejecución ha llegado hasta aquí es porque la pulsación se produjo, por lo que está entrando valor HIGH por el pin digital.

Este while esperará a que esa pulsación termine, y no solo eso, también esperará que los rebotes posteriores finalicen, puesto que por cada rebote también entrará valor HIGH por el pin digital.

En el momento en el que entre un valor LOW estable a través del pin 2 la condición digitalRead(PULSADOR)==HIGH dejará de ser cierta y el bucle while se detendrá, permitiendo que la ejecución continúe.

Como esta instrucción es la última dentro de la función loop, y esta función siempre se repite, volveríamos al while inicial a la espera de una nueva pulsación.

Y ahora si estaría completo el sketch. Si todo va bien la salida que verás en el monitor serie será similar a esta:

monitor serie Arduino sin rebotes

En este caso he presionado el pulsador 5 veces y por cada pulsación se ha ido mostrando el contador con el valor correcto, en la primera pulsación el 1, en la siguiente el 2 y así sucesivamente.

Ahora carga el sketch en tu Arduino y haz una prueba poniendo y quitando la última instrucción para que veas el efecto de los rebotes.

Videotutorial

Por si te quedan dudas aquí te dejo el videotutorial en el que explico todo el proceso paso a paso:


Te avisaré cuando publique nuevo contenido en paraarduino.com y en mi canal de YouTube (@ParaArduino).

No hemos podido validar tu suscripción.
¡Se ha realizado tu suscripción!

Newsletter

Suscríbete para que te avise cuando publique nuevo contenido.

Usamos Brevo como plataforma de marketing. Al hacer clic a continuación para enviar este formulario, consiente que la información proporcionada sea transferida a Brevo para su procesamiento de acuerdo con sus términos de uso