▷ Mostrar en displays de 7 segmentos números recibidos por el puerto serial (Arduino)

En este post les voy a explicar como mostrar en displays de 7 segmentos números recibidos través del puerto serial.


MATERIALES:

  • 1 Arduino UNO
  • 2 resistencias de 1 kohm
  • 2 resistencias de 220 ohms
  • 2 displays de 7 segmentos
  • 2 transistores 2N3904

DIAGRAMA DE CONEXIONES:

FUNCIONAMIENTO:

Para mostrar los números en los displays de 7 segmentos vamos a utilizar el monitor serial, en este caso solo podemos enviar valores de 2 dígitos como máximo. Después de haber ingresado el numero y haber presionado enter, se muestra automáticamente el numero en los displays.


CODIGO EXPLICADO:

Declaramos en un array los pines de conexión de los displays, de la siguiente manera:

byte pines [] = {2, 3, 4, 5, 6, 7, 8}; 
              // G, F, E, D, C, B, A

Definimos los pines de conexión de los transistores

#define decenaTr 11 // display decena
#define unidadTr 12 // display unidad

Declaramos unas variables

int numero; // almacena numero recibido a través del puerto serial
byte unidad; // almacena el valor de la unidad
byte decena; // almacena el valor de la decena
byte pausa = 5; // pausa del multiplexado
byte digitos[2]; // array con el numero de dígitos
bool numeroCompleto = false; // bandera para comprobar si se a recibido un numero

Definimos un array en el cual almacenaremos los valores de los números en código binario con orden ascendente de 0 a 9.

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

Void Setup:

Inicializamos el puerto serial y definimos los pines de conexión de los transistores y de los displays como salidas.

void setup() {

  Serial.begin(9600);
  delay(1000);
  pinMode(decenaTr, OUTPUT);
  pinMode(unidadTr, OUTPUT);

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

Void loop:

Creamos una variable

  byte n; // nos va a servir para seleccionar las posiciones del array digitos[]

Creamos una función para leer los datos recibidos por el puerto serial: lecturaPuertoSerial(), almacenamos esos datos en la variable: numeroPuertoSerial.

  int numeroPuertoSerial = lecturaPuertoSerial();

Dentro de la función lecturaPuertoSerial(), tenemos lo siguiente:

int lecturaPuertoSerial() {
  while (Serial.available()) { //Cada vez que nos llegue un dato:
    // leemos el string hasta que presionemos la tecla enter
    // almacenamos el dato en forma de string en la variable numero
    String numero = Serial.readStringUntil('\n'); 
    // como el dato esta completo, cambiamos el estado de la bandera a verdadero
    numeroCompleto = true; 
    // con el siguiente codigo evitamos que se puedan ingresar números de mas de dos dígitos
    if (numero.length() > 2) {
    } else {
      return numero.toInt(); // retornamos el valor de la variable numero, transformado en entero
    }
  }
}

Regresamos al void loop en donde comprobamos con la bandera , si se ha ingresado un nuevo dato.

 if (numeroCompleto) { // si se ingreso un nuevo dato:
    // le asignamos a la variable numero el valor de el dato 
    //ingresado a través del puerto serial.
    numero = numeroPuertoSerial; 
    numeroCompleto = false; // cambiamos el estado de la bandera a falso.
  }

En este punto ya tenemos el numero ingresado, lo que tenemos que hacer ahora es separar ese numero en unidades y decenas, para poder mostrar las unidades en un display y las decenas en otro. Para separar el numero creamos la funcion:separarNumero(), a esta función le enviamos como parámetro el numero a separar. De la siguiente manera.

  separarNumero(numero);

Dentro de la función separarNumero() tenemos lo siguiente

void separarNumero(int numero) {// ingresamos como parámetro el numero a separar 
  // dividimos el numero entre 10 para obtener la decena
  decena = numero / 10; 
  // (sacamos el resto de la división de el numero entre 10) 
  //lo dividimos entre 1 y así obtenemos la unidad
  unidad = (numero % 10) / 1;
}

Regresamos al void loop en esta parte del programa:


Seleccionamos del array numerosAnodo[] el valor correspondiente a la posición determinada por el valor de la variable unidad y la almacenamos en la posición 0 del array digitos[].

 digitos[0] = numerosAnodo[unidad];

Seleccionamos del array numerosAnodo[] el valor correspondiente a la posición determinada por el valor de la variable decena y la almacenamos en la posición 1 del array digitos[].

  digitos[1] = numerosAnodo[decena];

Ejemplo:

si el numero ingresado es 57 el valor de la variable unidad es 7 y el de la decena es 5, por lo tanto:

  digitos[0] = numerosAnodo[7]; 
  digitos[1] = numerosAnodo[5];
  
  digitos[0] =  B0001111,//7
  digitos[1] =  B0100100,//5

Ya teniendo el numero separado y almacenado en en las diferentes posiciones del array digitos[]lo que vamos a hacer es realizar el multiplicado para mostrar primero el numero de la decena y luego el de la unidad. para ello hacemos lo siguiente:

 digitalWrite(decenaTr, 1); // activamos el transistor de las decenas
  digitalWrite(unidadTr, 0);// desactivamos el transistor de las unidades
  // llamamos a la función mostrarDigito()
  // le enviamos como parámetro el valor de la variable n
  mostrarDigito(n); // mostramos el numero de la decena
  n = 1;
  delay(pausa); // pausa para poder visualizar el numero
  digitalWrite(decenaTr, 0); // desactivamos el transistor de las decenas
  digitalWrite(unidadTr, 1); // activamos el transistor de las unidades
  // llamamos a la función mostrarDigito()
  // le enviamos como parámetro el valor de la variable n
  mostrarDigito(n);
  n = 0;
  delay(pausa); // pausa para poder visualizar el numero

Dentro de la función mostrarDigito(): se va a llevar a cabo el encendido de los leds del display, formando así el numero previamente definido.

void mostrarDigito(byte n) { // n es el index para el array digitos[]
  // creamos un ciclo for el cual nos dará el index para el array pines[]
  for (int i = 6; i >= 0; i--) { 
    //Encendemos o apagamos los leds dependiendo del código binario del numero ingresado
    digitalWrite(pines[i], (digitos[n] & (1 << i) ? 1 : 0));
  }
}

CODIGO COMPLETO:

byte pines [] = {2, 3, 4, 5, 6, 7, 8};

#define decenaTr 11
#define unidadTr 12

int numero;
byte unidad;
byte decena;
byte pausa = 5;
byte digitos[2];
bool numeroCompleto = false;

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

void setup() {
  Serial.begin(9600);
 
  pinMode(decenaTr, OUTPUT);
  pinMode(unidadTr, OUTPUT);

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

void loop() {
  
  byte n;
  int numeroPuertoSerial = lecturaPuertoSerial();

  if (numeroCompleto) {
    numero = numeroPuertoSerial;
    numeroCompleto = false;
  }
  
  separarNumero(numero);

  digitos[0] = numerosAnodo[unidad];
  digitos[1] = numerosAnodo[decena];
    
  digitalWrite(decenaTr, 1);
  digitalWrite(unidadTr, 0);
  mostrarDigito(n);
  n = 1;
  delay(pausa);
  digitalWrite(decenaTr, 0);
  digitalWrite(unidadTr, 1);
  mostrarDigito(n);
  n = 0;
  delay(pausa);
}

int lecturaPuertoSerial() {
  
  while (Serial.available()) {
    
    String numero = Serial.readStringUntil('\n');
    numeroCompleto = true;

    if (numero.length() > 2) {
    } else {
      return numero.toInt();
    }
  }
}

void separarNumero(int numero) {
  decena = numero / 10;
  unidad = (numero % 10) / 1;
}

void mostrarDigito(byte n) {
  
  for (int i = 6; i >= 0; i--) {
    digitalWrite(pines[i], (digitos[n] & (1 << i) ? 1 : 0));
  }
}

ARCHIVOS DEL PROYECTO:

0/Deja un comentario/Comentarios

¡Hola! Nos alegra mucho que hayas llegado hasta aquí y que estés leyendo este artículo en Edeptec.
Este formulario es un espacio abierto para ti: puedes dejar un comentario con tus dudas, sugerencias, experiencias o simplemente tu opinión sobre el tema tratado.

» ¿Te resultó útil la información?
» ¿Tienes alguna experiencia personal que quieras compartir?
» ¿Se te ocurre algún tema que te gustaría ver en próximos artículos?

Recuerda que este espacio es para aprender y compartir, por eso te animamos a participar de manera respetuosa y constructiva. Tus comentarios pueden ayudar a otros lectores que están en el mismo camino, ya sea en electrónica, programación, deportes o tecnología.

¡Gracias por ser parte de esta comunidad de aprendizaje! Tu participación es lo que hace crecer este proyecto.