Inicio » Displays para Arduino » Contador con display de 7 segmentos, pulsador y Arduino

En este tutorial vamos a ver cómo implementar un contador utilizando un display de 7 segmentos, un pulsador de membrana y un Arduino.

El contador empezará a contar desde 0 y cada vez que se presione el pulsador se mostrará el siguiente número en el display de 7 segmentos.

¿Entendido lo que vamos a hacer? ¡Pues al lío!

IMPORTANTE: Para seguir este tutorial correctamente debes saber cómo conectar un display de 7 segmentos y un pulsador de membrana con Arduino.
Si no sabes cómo hacerlo mira antes estos dos tutoriales:
Cómo conectar un display de 7 segmentos con Arduino
Cómo conectar un pulsador de membrana con Arduino

Materiales

Una placa Arduino (Yo usaré Arduino UNO)
Un pulsador de membrana
Display de 7 segmentos (ánodo común)
7 resistencias de 330Ω
Una resistencia de 10KΩ
Cables
Un condensador de 0.1uF
Una protoboard
Un ordenador con el IDE de Arduino instalado

Conexiones

El circuito que necesitamos para hacer el contador es el siguiente:

display de 7 segmentos, pulsador y Arduino

Estoy utilizando un display de 7 segmentos de ánodo común, si prefieres usar un display de cátodo común también lo tienes explicado aquí: Cómo conectar un display de 7 segmentos con Arduino.

Los pines que voy a usar para el display son los digitales que van consecutivos del 2 al 8 (ambos incluidos).

En cuanto al pulsador, Va conectado al pin digital 9. Como puedes ver en el circuito lleva una resistencia de pull-down de 10kΩ y un condensador de 0.1uF para evitar los rebotes. Las conexiones del pulsador están explicadas aquí: Cómo conectar un pulsador de membrana con Arduino.

Sketch

Vamos a usar como base el sketch que ya expliqué en este tutorial: Cómo conectar un display de 7 segmentos con Arduino.

Te lo dejo completo a continuación para que lo puedas copiar y trabajes sobre él. Lo único que he eliminado es el cuerpo de la función loop, puesto que implementaremos uno nuevo desde 0.

/* DECLARACIONES */
const int A = 2;
const int B = 3;
const int C = 4;
const int D = 5;
const int E = 6;
const int F = 7;
const int G = 8;

const int N = 7;
const int SEGMENTOS[N] = {A,B,C,D,E,F,G};

const int DIGITOS[10][N] = {
/*0*/ {0,0,0,0,0,0,1},
/*1*/ {1,0,0,1,1,1,1},
/*2*/ {0,0,1,0,0,1,0},
/*3*/ {0,0,0,0,1,1,0},
/*4*/ {1,0,0,1,1,0,0},
/*5*/ {0,1,0,0,1,0,0},
/*6*/ {0,1,0,0,0,0,0},
/*7*/ {0,0,0,1,1,1,1},
/*8*/ {0,0,0,0,0,0,0},
/*9*/ {0,0,0,0,1,0,0}
};
const int OFF = HIGH;

/* CONFIGURACIÓN */
void setup()
{
  for (int i=0; i<N; i++){
    pinMode(SEGMENTOS[i], OUTPUT);
    digitalWrite(SEGMENTOS[i], OFF);//apagar
  }
}

/* FUNCIONES */
void print(int d){
  for (int i=0; i<N; i++){
    digitalWrite(SEGMENTOS[i], DIGITOS[d][i]);
  }
}

void loop()
{
  //código contador
}

Falta incluir todo el código necesario para que funcione el pulsador.

Declaraciones

Empezando por las declaraciones, necesitamos una constante para indicar el pin digital en el que está conectado el pulsador, en este caso el 9. También nos hará falta una variable entera para contar las pulsaciones, la llamaremos cont:

const int PULSADOR = 9; //pin digital pulsador
int cont = 0; //contador de pulsaciones

Configuración

Siguiendo con la configuración, tenemos que configurar el pin 9 como entrada. Eso lo haremos dentro de la función setup añadiendo esta instrucción:

pinMode(PULSADOR, INPUT);

Función loop

Y por último, falta implementar la función loop para que lea el pin digital 9, incremente la variable cont y muestre su valor en el display de 7 segmentos:

void loop()
{
  print(cont); //mostrar el valor de cont en el display
  while(digitalRead(PULSADOR)==LOW); //esperar que se presione el pulsador
  
  cont ++; //incrementar cont
  if(cont>9){ //si cont supera 9 ponerlo de nuevo a 0
    cont = 0;
  }
  
  while(digitalRead(PULSADOR)==HIGH); //esperar que el pulsador deje de estar presionado
}

Fíjate que la primera instrucción dentro de la función loop es print(cont). Esto muestra en el display el valor de la variable cont que declaramos anteriormente. Cuando el Arduino arranca el valor de cont es 0, por lo que el valor que se verá en el display será 0.

La función print ya estaba definida en el código base. Es la responsable de encender los segmentos necesarios en el display para que se muestre el valor que le pasamos entre paréntesis.

Si tienes dudas sobre esto, por favor vuelve al tutorial anterior: Cómo conectar un display de 7 segmentos con Arduino.

Lo siguiente que tenemos es un bucle while (while(digitalRead(PULSADOR)==LOW)). Sirve para que la función digitalRead lea repetidamente el valor del pin digital en el que está conectado el pulsador (pin 9). Mientras este pin tenga valor LOW significa que el pulsador no ha sido presionado. El bucle deja de repetirse cuando se presiona el pulsador, puesto que entra valor HIGH, permitiendo que la ejecución continúe en la siguiente instrucción.

La siguiente instrucción es cont++. No tiene mucho misterio. Simplemente incrementa en una unidad el valor de la variable cont. Si esta tenía valor 0, pasará a tener valor 1. Si tenía 1 pasará a 2 y así sucesivamente.

¿Qué ocurre si cont pasa de 9? Esto ocurrirá si presionamos el pulsador 10 veces o más. Aquí tenemos un problema, puesto que el display de 7 segmentos solo nos permite mostrar un dígito. La solución es simple, y la tenemos justo en la siguiente instrucción.

La instrucción if comprueba si la variable cont ha superado el valor 9 tras el último incremento (if (cont>9)). Si es True, asignaremos valor 0 a la variable cont (cont = 0) para que empiece de nuevo a contar con la siguiente pulsación.

Por último, tenemos otra instrucción while (while(digitalRead(PULSADOR)==HIGH)). Esta ya la hemos visto en tutoriales anteriores. Sirve para que la ejecución no continúe mientras entre valor HIGH por el pin digital del pulsador. Esto evita que se cuenten los rebotes y las pulsaciones largas contarán como una única pulsación.

Recuerda que la función loop se repite, por lo que en la siguiente iteración se volverá a ejecutar la instrucción print(cont). Como la variable cont se incrementó en una unidad, ahora se mostrará el siguiente valor en el display.

Sketch final

A continuación puedes consultar el sketch definitivo al completo. He añadido comentarios muy llamativos para que puedas localizar fácilmente dónde debes colocar todo el código nuevo que hemos visto:

/* DECLARACIONES */
const int A = 2;
const int B = 3;
const int C = 4;
const int D = 5;
const int E = 6;
const int F = 7;
const int G = 8;

const int N = 7;
const int SEGMENTOS[N] = {A,B,C,D,E,F,G};

const int DIGITOS[10][N] = {
/*0*/ {0,0,0,0,0,0,1},
/*1*/ {1,0,0,1,1,1,1},
/*2*/ {0,0,1,0,0,1,0},
/*3*/ {0,0,0,0,1,1,0},
/*4*/ {1,0,0,1,1,0,0},
/*5*/ {0,1,0,0,1,0,0},
/*6*/ {0,1,0,0,0,0,0},
/*7*/ {0,0,0,1,1,1,1},
/*8*/ {0,0,0,0,0,0,0},
/*9*/ {0,0,0,0,1,0,0}
};
const int OFF = HIGH;

/*+++++++++++++++++++++
       PULSADOR
+++++++++++++++++++++++*/
const int PULSADOR = 9; //pin digital pulsador
int cont = 0; //contador de pulsaciones
/*+++++++++++++++++++++*/

/* CONFIGURACIÓN */
void setup()
{
  for (int i=0; i<N; i++){
    pinMode(SEGMENTOS[i], OUTPUT);
    digitalWrite(SEGMENTOS[i], OFF);//apagar
  }

//+++++ PULSADOR ++++++++
pinMode(PULSADOR, INPUT);
//+++++++++++++++++++++++
}

/* FUNCIONES */
void print(int d){
  for (int i=0; i<N; i++){
    digitalWrite(SEGMENTOS[i], DIGITOS[d][i]);
  }
}

void loop()
{
  print(cont); //mostrar el valor de cont en el display
  while(digitalRead(PULSADOR)==LOW); //esperar que se presione el pulsador
  
  cont ++; //incrementar cont
  if(cont>9){ //si cont supera 9 ponerlo de nuevo a 0
    cont = 0;
  }
  
  while(digitalRead(PULSADOR)==HIGH); //esperar que el pulsador deje de estar presionado
}

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