ARDUINO: MOSTRAR DATOS EN DISPLAY DE 7 SEGMENTOS



En esta y última práctica del libro se enseñará a mostrar datos numéricos en un Display de 7 segmentos de 4 dígitos ánodo común, usando el multiplexeo.

Materiales:

  • 1x Arduino
  • 1x Display  de 7 segmentos 
  • 1x Potenciómetro de 10K
  • 1x Protoboard
  • Jumpers

Esquema de montaje

Código

Primero definimos el pin del potenciómetro que usaremos ya que visualizaremos ese valor en el Display de 7 segmentos, después se definen los pines de cada Display, o sea para que se activen y desactiven (multiplexeo).

Se crea un arreglo del tipo entero llamado segs de tamaño 7 con los datos 2, 3, 4, 5, 6, 7, 8 ya que esos serán los pines de Arduino donde se conectarán las letras de nuestro Display, la letra A al 2, la B al 3, etc.

Después creamos de nuevo otro arreglo, esta vez del tipo byte llamado numbers ya que guardaremos en byte la formación de números del Display de 7 segmentos, como se vio al principio del capítulo, esta vez se ordena al revés de G a A.

No entraremos en mucho detalle para la explicación del uso de arreglos, pero aquí agregamos una imagen para que se entienda un poco mejor:

Ya en el setup inicializamos los pines tanto de entrada que será el del potenciómetro como de salida que serán los Display y también sus letras, estos los ponemos como salidas usando un for como hicimos en las primeras prácticas.

Ahora nos saltamos a la función MostrarNum, esta función recibe como parámetro cualquier número entero para que lo mostremos en el Display de 7 segmentos, aquí usamos operaciones matemáticas para descomponer el número y obtener las unidades que se le asigna a la variable digit4, obtenemos también las decenas, centenas y las unidades de millar, esta última se le asigna a la variable digit1, todas estas deben de ser del tipo entero.

Después estos valores se les asignan al índice del arreglo numbers y esto a su vez se le asigna a las funciones Digito1, Digito2 y así sucesivamente, también usamos un delay de dos milisegundos, esto se llama multiplexeo, ya se mencionó que, lo que esto hace es pasarle el mismo número a todos los Display pero se apagan los Display donde no se necesita ver ese número, aunque se hace muy rápidamente que no se puede ver cuando se apagan, si usted quiere ver el proceso de multiplexeo cambie el tiempo del delay de dos milisegundos a mil milisegundos.

Ahora, para que funcione eso tenemos las funciones Digito1, Digito2, etc., todas similares,  que reciben un parámetro del tipo byte, pero este parámetro se usa en otra función que se explica más adelante.

Como ya se explicó, dentro de estas funciones enviamos un LOW al Display que queremos que se prenda ya que usamos transistores PNP y a los demás les enviamos un HIGH para que estén apagados.

Dentro de estas funciones tenemos la función segmentos, esta función servirá para que se prendan los segmentos del Display, o sea las letras, esta función recibe un parámetro del tipo byte, dentro de esta función tenemos un for de 0 a 6 que son el número de segmentos de nuestro Display, después en una variable del tipo int llamada bit se le asigna un valor usando la función bitRead, en simples palabras, esta función entrega el valor dado un byte y el índice que se le pasa como segundo parámetro, por ejemplo:

Tenemos el byte 10101001 que se encuentra en la variable x y usando la función bitRead(x, 5) se lo asignamos a la variable y, entonces en y vamos a tener el valor de 1, ya que se lee de derecha a izquierda.

Después usamos digitalWrite para prender los segmentos de cada Display, pasamos como parámetro el arreglo segs y bit, que hará que prendan los segmentos de cada Display conectados de los pines 2 a 8.

#define POT A0

#define D1 9
#define D2 10
#define D3 11
#define D4 12

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

const byte numbers[] = {
  0b1000000, //0
  0b1111001, //1
  0b0100100, //2
  0b0110000, //3
  0b0011001, //4
  0b0010010, //5
  0b0000010, //6
  0b1111000, //7
  0b0000000, //8
  0b0010000 //9
};

void setup() {
  pinMode(POT, INPUT);
  pinMode(D1, OUTPUT);
  pinMode(D2, OUTPUT);
  pinMode(D3, OUTPUT);
  pinMode(D4, OUTPUT);
  for (int i = 2; i < 9; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  int Val = analogRead(POT);

  MostrarNum(Val);
}

void MostrarNum(int num) {
  int digit1 = (num / 1000) % 10;
  int digit2 = (num / 100) % 10;
  int digit3 = (num / 10) % 10;
  int digit4 = num % 10;

  Digito1(numbers[digit1]);
  delay(2);
  Digito2(numbers[digit2]);
  delay(2);
  Digito3(numbers[digit3]);
  delay(2);
  Digito4(numbers[digit4]);

  delay(2);
}

void Digito1(byte n) {
  digitalWrite(D1, LOW);
  digitalWrite(D2, HIGH);
  digitalWrite(D3, HIGH);
  digitalWrite(D4, HIGH);
  segmentos(n);
}

void Digito2(byte n) {
  digitalWrite(D1, HIGH);
  digitalWrite(D2, LOW);
  digitalWrite(D3, HIGH);
  digitalWrite(D4, HIGH);
  segmentos(n);
}

void Digito3(byte n) {
  digitalWrite(D1, HIGH);
  digitalWrite(D2, HIGH);
  digitalWrite(D3, LOW);
  digitalWrite(D4, HIGH);
  segmentos(n);
}

void Digito4(byte n) {
  digitalWrite(D1, HIGH);
  digitalWrite(D2, HIGH);
  digitalWrite(D3, HIGH);
  digitalWrite(D4, LOW);
  segmentos(n);
}

void segmentos(byte n) {
  for (int i = 0; i < 7; i++) {
    int bit = bitRead(n, i);
    digitalWrite(segs[i], bit);
  }
}







ArduinoErick Méndezdisplay