▷ Cómo hacer un contador de 0 a 99 con y sin pulsador usando Arduino

En este post les voy a explicar paso a paso como hacer un contador ascendente de 0 a 99 manual y automático.


Materiales:


Diagrama de conexiones:


Los pines de conexión de los displays van puenteados: a con a , b con b, c con c , etc.



Contador con pulsador:

Al momento de presionar el pulsador, ira contando en forma ascendente desde el 0 al 99, cuando llegue a 99 el contador volverá a 0.A.


Explicación del código.

Primero declaramos los pines en donde irán conectados los pines de los displays.

int pines [] = {0, 1, 2, 3, 4, 5, 6};(g, f, e, d, c, b, a)   

Definimos tr1 (pin donde ira conectada la base del transistor1), tr2 (pin donde ira conectada la base del transistor2) y pulsador(pin donde ira conectado el pulsador en configuración pull-down).

#define tr1 8
#define tr2 10
#define pulsador A0

Agregamos las siguientes variables:

  • estadop: la vamos a utilizar para realizar un antirrebote.
  • n1: almacenara la posicion del array para mostrar la unidad.
  • n2: almacenara la posicion del array para mostrar la decena.
  • pausa: variable de pausa ente activación de los displays para la multiplexación.
bool estadoP = 0;
byte n1 = 0;
byte n2 = 0;
short pausa = 50;

Definimos un array en el cual almacenaremos los valores de los números en código binario con orden ascendente de 0 a 9, este array lo ocupamos si estamos utilizando displays de ánodo común

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

Este array lo ocupamos si estamos utilizando displays de cátodo común.

byte numerosCatodo[] {
 B1111110,//0
 B0110000,//1
 B1101101,//2
 B1111001,//3
 B0110011,//4
 B1011011,//5
 B1011111,//6
 B1110000,//7
 B1111111,//8
 B1111011,//9
};

En el void setup declaramos entradas y salidas.

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

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);
 }
}
void loop() {
 bool  pul = digitalRead(pulsador); 

Cada vez que presionamos el pulsador, la variable n1 (variable que lleva el valor del numero que aparecerá en el display de la unidad) se suma. Si n1 = 10; n1 = 0 y n2 (lleva el valor del numero que aparecerá ;en el display de la decena) se suma. Cuando n2 = 10 entonces n2 = 0.

if (pul != estadoP) {
   if (pul == HIGH) {

     n1++;

     if (n1 == 10 ) {
       n1 = 0;
       n2++;
     }
     if (n2 == 10){
       n2 = 0;
     }
  }
 }
estadoP = pul;
A continuacion realizamos la multiplexación:

La multiplexación nos permite visualizar los dos números a la vez conectando los displays a los mismos pines. Esto lo logramos apagando un display y prendiendo el otro. El control de la activación de los displays lo hacemos con los transistores.


Primero, activamos el display de las decenas, desactivamos el display de las unidades y mostramos el valor de la variable con la condición, PORTD = numerosAnodo[n2];. PORTD nos permite mostrar los datos en el display mediante los números binarios que declaramos anteriormente en el array. Establecemos una pausa, 

  digitalWrite(tr1, HIGH);
 digitalWrite(tr2, LOW);
 PORTD = numerosAnodo[n2];
 delay(pausa);

Activamos el display de las unidades, desactivamos el display de las decenas y mostramos el valor de la variable con la condición, PORTD = numerosAnodo[n1];.


Establecemos una pausa,

  digitalWrite(tr2, HIGH);
 PORTD = numerosAnodo[n1];
 delay(pausa);
 
}
QUE ES UN ARRAY (MATRIZ) Y COMO UTILIZARLO EN LA PROGRAMACION DE ARDUINO

Código completo del contador con pulsador.

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

#define tr1 8
#define tr2 10
#define pulsador A0

bool estadoP = 0;
byte n1 = 0;
byte n2 = 0;
short pausa = 50;

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

byte numerosCatodo[] {
 B1111110,//0
 B0110000,//1
 B1101101,//2
 B1111001,//3
 B0110011,//4
 B1011011,//5
 B1011111,//6
 B1110000,//7
 B1111111,//8
 B1111011,//9
};


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

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

void loop() {
 
 
 bool  pul = digitalRead(pulsador);

 if (pul != estadoP) {
   if (pul == HIGH) {

     n1++;

     if (n1 == 10 ) {
       n1 = 0;
       n2++;
     }
     if (n2 == 10){
       n2 = 0;
     }
  }
 }
 
 estadoP = pul;

 digitalWrite(tr1, HIGH);
 digitalWrite(tr2, LOW);
 PORTD = numerosAnodo[n2];
 delay(pausa);
 digitalWrite(tr1, LOW);
 digitalWrite(tr2, HIGH);
 PORTD = numerosAnodo[n1];
 delay(pausa);
 }

Contador sin pulsador:


Este contador empezara a contar automáticamente cuando energicemos la placa de arduino.


Explicación del código.

Primero declaramos los pines en donde irán conectados los pines los displays.

int pines [] = {0, 1, 2, 3, 4, 5, 6};
               (g, f, e, d, c, b, a)   

Definimos tr1 (pin donde ira conectada la base del transistor1) y tr2 (pin donde ira conectada la base del transistor2).

#define tr1 8
#define tr2 10

Agregamos las siguientes variables:

  • n1: almacenara la posicion del array para mostrar la unidad.
  • n2: almacenara la posicion del array para mostrar la decena.
  • pausa: variable de pausa ente activación de los displays para la multiplexasion.
  • velocidad: controlamos la velocidad del contador.
byte n1 = 0;
byte n2 = 0;
short pausa = 50;
short velocidad= 50;

Definimos un array en el cual almacenaremos los valores de los números en código binario con orden ascendente de 0 a 9, este array lo ocupamos si estamos utilizando displays de ánodo común.

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

Este array lo ocupamos si estamos utilizando displays de cátodo común.

byte numerosCatodo[] {
 B1111110,//0
 B0110000,//1
 B1101101,//2
 B1111001,//3
 B0110011,//4
 B1011011,//5
 B1011111,//6
 B1110000,//7
 B1111111,//8
 B1111011,//9
};

En el void setup declaramos entradas y salidas

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);
 }
}
void loop() {

La variable n1 (variable que lleva el valor del numero que aparecerá en el display de la unidad) se suma. Si n1 = 10 entonces n1 = 0, n2 (lleva el valor del numero que aparecerá en el display de la decena) se suma. Cuando n2 = 10 entonces n2 = 0.

      n1++;

     if (n1 == 10 ) {
       espacio = 0;
       i++;
     }
     if ( n2 == 10){
       n2 = 0;
     }

Iniciamos un ciclo for, este nos ayudara a controlar la velocidad del contador

  for (int z = 0; z < velocidad; z++ ){

La siguiente parte es igual a la del contador con pulsador:

 digitalWrite(tr1, HIGH);  digitalWrite(tr2, LOW);  PORTD = numerosAnodo[n2];  delay(pausa);  digitalWrite(tr1, LOW);  digitalWrite(tr2, HIGH);  PORTD = numerosAnodo[n1];  delay(pausa);    } }

Código completo del contador sin pulsador.

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

#define tr1 8
#define tr2 10
byte n1 = 0;
byte n2 = 0;
short pausa = 50;
short velocidad = 2;

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

byte numerosCatodo[] {
 B1111110,//0
 B0110000,//1
 B1101101,//2
 B1111001,//3
 B0110011,//4
 B1011011,//5
 B1011111,//6
 B1110000,//7
 B1111111,//8
 B1111011,//9
};




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

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

void loop() {

     n1++;

     if (n1 == 10 ) {
       n1 = 0;
       n2++;
     }
     if ( n2 == 10){
       n2 = 0;
     }

 for (int z = 0; z < velocidad; z++ ){
 digitalWrite(tr1, HIGH);
 digitalWrite(tr2, LOW);
 PORTD = numerosAnodo[n2];
 delay(pausa);
 digitalWrite(tr1, LOW);
 digitalWrite(tr2, HIGH);
 PORTD = numerosAnodo[n1];
 delay(pausa);
 
 }
}

0/Post a Comment/Comments