▷ Contador ascendente y descendente con displays de 7 segmentos - Arduino

En este post veremos como hacer un contador ascendente y descendente de 0 a 99 utilizando arduino y displays de 7 segmentos.

MATERIALES:

Los materiales que utilizaremos para este proyecto, son los siguientes:

DIAGRAMA DE CONEXIONES

EXPLICACION PARTE POR PARTE:

Declaramos los pines en donde irán conectados los displays de 7 segmentos.

int pines [] = {0, 1, 2, 3, 4, 5, 6};

Realizamos las conexiones de la siguiente manera:

  • Pin 6 con a
  • Pin 5 con b
  • Pin 4 con c
  • Pin 3 con d
  • Pin 2 con e
  • Pin 1 con f
  • Pin 0 con g

Definimos los pines en donde irán conectados los transistores.

- El transistor conectado al display de las decenas ira conectado al pin 8 de Arduino y el de las unidades al pin 10.

#define decenaTr 8
#define unidadTr 10

Creamos un array.

En este array almacenaremos los valores de los números en código binario con orden ascendente de 0 a 9, (añadimos una posición antes del 0 ya que la necesitaremos para el conteo descendente) este array lo ocupamos si estamos utilizando displays de ánodo común.

byte numerosAnodo[] {
 B0000000,//NA - posición 0
 B0000001,//0 - posición 1
 B1001111,//1 - posición 2
 B0010010,//2 - posición 3
 B0000110,//3 - posición 4
 B1001100,//4 - posición 5
 B0100100,//5 - posición 5
 B0100000,//6 - posición 7
 B0001111,//7 - posición 8
 B0000000,//8 - posición 9
 B0000100,//9 - posición 10
};

Declaramos variables:

- Las variables: estadoUp y estadoDown las utilizaremos para hacer el antirebote.

- Las variables: decena y unidad las utilizaremos para indicar el index del array.

- La variable pausa la utilizaremos para el tiempo de activación y desactivacion de los transistores (multiplexacion).

bool estadoUp = 0;
bool estadoDown = 0;

byte decena = 0;
byte unidad = 0;

short pausa = 5;

Void setup.

En el void setup declaramos entradas, salidas e igualamos las unidades y las decenas a 1 porque recordemos que la posicion numero 1 del array numerosAnodo, nos mostrara en el display de 7 segmentos el numero 0.

void setup() {
  pinMode(tr1, OUTPUT);
  pinMode(tr2, OUTPUT);

Creamos este ciclo for para declarar los pines que van conectados a los displays (como van en orden, de 0 a 6 lo podemos hacer de esta forma)

  for (int led = 0; led < 8; led++) {
    pinMode(pines[led], OUTPUT);
  }
  decena = 1;
  unidad = 1;
}

Void loop:

En el void loop creamos dos variables las cuales almacenaran los estados logicos de los pulsadores.

EL pulsador para la cuenta ascendente ira conectado al pin A0 y el pulsador para la cuenta descendente al pin A1.

bool  pUp = digitalRead(A0);
bool  pDown = digitalRead(A1);

Hacemos un multiplexado.

El multiplexado es una técnica que permite que  múltiples flujos de información compartan un único medio de transmisión. Gracias a esta técnica podemos reducir el numero de pines utilizados para este tipo de circuitos, funciona de la siguiente manera.

Para visualizar dos números diferentes en displays diferentes lo que hacemos es:

Activar un display, mostrar el numero y a continuación activar el otro display y mostrar un numero diferente.

En este caso primero activamos el display de las unidades y desactivamos el display de las decenas(esto lo hacemos utilizando transistores, las bases de los transistores van conectadas a los pines de Arduino, el colector lo conectamos a VCC y el emisor lo conectamos a los pines de activación de los displays), mostramos el numero ubicado en una posición x del array por el puerto D, establecemos una pausa y hacemos lo mismo para el display de las decenas.

Dependiendo del valor de las variables: unidad y decena; nos mostrara en el display un numero u otro. Ejemplo:

Si la variable unidad = 4, podremos observar en el display el numero "3".

digitalWrite(decenaTr, HIGH);
digitalWrite(unidadTr, LOW);
PORTD = numerosAnodo[unidad];
delay(pausa);
digitalWrite(decenaTr, LOW); 
digitalWrite(unidadTr, HIGH);
PORTD = numerosAnodo[decena];
delay(pausa);

Al presionar el pulsador de conteo ascendente ocurre lo siguiente:

Primero comprobaremos con el sistema anti rebote si el pulsador fue presionado

-Si el pulsador fue presionado entonces:

*Comprobamos: Si el conteo llega a 99, entonces se quedara en 99. Caso contrario se sumara el valor de las decenas.

-Si el valor de la decena es igual a 11, decena sera igual a 1 y sumamos las unidades.(ponemos 11 porque como sabemos el array tiene 10 posiciones y la posición 10 es igual al numero 9, hacemos la igualdad con 10 entonces cuando el contador llegue a 9 el valor de decena sera igual a 1 si hacemos esto, no podremos observar valores como el 10, 20, 30 , etc. Igualamos la decena a 1 porque el valor del numero 0 se encuentra en esa posición del array ).

if (pUp != estadoUp) {
  if (pUp == HIGH) {
      
    if (unidad == 10 && decena == 10){
      decena = 10;
      unidad = 10;    	    
    } else {
      decena++;
    }

    if (decena == 11 ) {
      decena = 1;
      unidad++;
    } 
  }
} 
Al presionar el pulsador de conteo descendente ocurre lo siguiente:

Primero comprobaremos con el sistema anti rebote si el pulsador fue presionado

-Si el pulsador fue presionado entonces:

* Restamos el valor de la decena: si la decena es igual a 0 (posición 0 del arrar = No impota) , el valor de la variable decena sera igual a 10 y restamos el valor de la unidad.

if (pDown != estadoDown) {
  if (pDown == HIGH) {

    decena--;

    if (decena == 0) {
      decena = 10;
      unidad--;
    }
  }
}

Agregamos una condición para que el el numero del contador no sea menor a 00 e igualamos estadoUp y estadoDown con los valores de pUp y pDown respectivamente esto es para el sistema anti rebote.

if (decena == 10 && unidad == 0){
  decena = 1;
  unidad = 1;
}
      
  
estadoUp = pUp;
estadoDown = pDown;

CODIGO COMPLETO:

int pines [] = {0, 1, 2, 3, 4, 5, 6};

#define decenaTr 8
#define unidadTr 10
 
bool estadoUp = 0;
bool estadoDown = 0;
 
byte decena = 0;
byte unidad = 0;
 
short pausa = 5;
 
byte numerosAnodo[] {
  B0000000,//NA
  B0000001,//0
  B1001111,//1
  B0010010,//2
  B0000110,//3
  B1001100,//4
  B0100100,//5
  B0100000,//6
  B0001111,//7
  B0000000,//8
  B0000100,//9
};
 
byte numerosCatodo[] {
 
  B0000000,//NA
  B1111110,//0
  B0110000,//1
  B1101101,//2
  B1111001,//3
  B0110011,//4
  B1011011,//5
  B1011111,//6
  B1110000,//7
  B1111111,//8
  B1111011,//9
};
 
 
void setup() {
 
  pinMode(decenaTr, OUTPUT);
  pinMode(unidadTr, OUTPUT);
 
  for (int led = 0; led < 8; led++) {
    pinMode(pines[led], OUTPUT);
  }
  decena = 1;
  unidad = 1;
}
 
void loop() {
 
  bool  pUp = digitalRead(A0);
  bool  pDown = digitalRead(A1);
 
  if (pUp != estadoUp) {
    if (pUp == HIGH) {
     
      if (unidad == 10 && decena == 10){
        decena = 10;
        unidad = 10;           
      } else {
        decena++;
      }
 
      if (decena == 11 ) {
        decena = 1;
        unidad++;
      }
    }
  }
 
  if (pDown != estadoDown) {
    if (pDown == HIGH) {
 
      decena--;
 
      if (decena == 0) {
        decena = 10;
        unidad--;
      }
    }
  }
 
  if (decena == 10 && unidad == 0){
    decena = 1;
    unidad = 1;
  }
     
  estadoUp = pUp;
  estadoDown = pDown;
 
  digitalWrite(decenaTr, HIGH);
  digitalWrite(unidadTr, LOW);
  PORTD = numerosAnodo[unidad];
  delay(pausa);
  digitalWrite(decenaTr, LOW);
  digitalWrite(unidadTr, HIGH);
  PORTD = numerosAnodo[decena];
  delay(pausa);
  
}

0/Post a Comment/Comments