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));
}
}

Publicar un comentario
¡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.