Multiplexar Display 7 Segmentos

Como vimos en un articulo anterior, para controlar un Display 7 Segmentos necesitamos utilizar algun driver (por ejemplo el Registro de desplazamiento 74HC595) que nos permite controlar con pocos pines de nuestro micro controlador (arduino en nuestro caso) los 7 pines de nuestro 7 segmentos.

Índice
  1. VENTAJAS DE MULTIPLEXAR DISPLAY 7 SEGMENTOS
    1. EJEMPLO
    2. RESUMEN
  2. DESVENTAJAS DE MULTIPLEXAR DISPLAY 7 SEGMENTOS
  3. CIRCUITO PARA MULTIPLEXAR DISPLAY 7 SEGMENTOS
  4. EJEMPLO ARDUINO

VENTAJAS DE MULTIPLEXAR DISPLAY 7 SEGMENTOS

Pero entonces, ¿que es y que ventajas tengo de multiplexar?, bueno supongamos que tenemos que controlar 4 displays, según nuestro análisis anterior necesitaríamos cuatro 74HC595 para controlar cada uno de los dígitos, si por cada driver utilizamos 3 pines de nuestro micro controlador, estaríamos gastando 16 pines de nuestro micro en solo visualizar números.. la cosa se empieza a complicar.

Con la técnica de multiplexado podríamos controlar los cuatro dígitos con un solo driver, esta técnica se basa en encender y apagar cada dígito de manera muy rápida, de forma tal que este cambio sea imperceptible a los ojos, aproximadamente cada 5ms.

EJEMPLO

Supongamos que quiero visualizar el numero 1234

  • Unidad de mil = 1
  • Centena = 2
  • Decena = 3
  • Unidad = 4

Para esto tenemos que hacer lo siguiente, encendemos el dígito de la unidad de mil y enviamos a visualizar el numero 1, dejamos pasar 5ms lo apagamos y prendemos el dígito de la decena y enviamos a visualizar el numero 2, dejamos pasar 5ms lo apagamos y prendemos la Decena y enviamos a visualizar el numero 3, dejamos pasar 5ms lo apagamos y prendemos la Unidad y enviamos el numero 4.

Esto es una gran ventaja ya que reducimos considerablemente el costo de nuestra placa al ahorrarnos de 3 componentes que suelen ser caros, ganando en costo y reduciendo el espacio en la placa.

RESUMEN

  • Reducción de componentes en la placa.
  • Economizamos nuestro proyecto.
  • Menor utilización de pines.

DESVENTAJAS DE MULTIPLEXAR DISPLAY 7 SEGMENTOS

Como nada es gratis en esta vida y esto tampoco, hacer esto tiene una serie de desventajas que debemos tener en cuenta en nuestro proyecto.

  • Complicación de software.
  • Debemos estar prendiendo y apagando nuestros display cada 5ms.

¿Que pasaría si necesito ejecutar una acción que demore mas de ese tiempo y que no se pueda interrumpir?,
por ejemplo ejecutar la lectura de un sensor de temperatura que suele demorar mas de ese tiempo, veríamos un numero incorrecto en los displays.

CIRCUITO PARA MULTIPLEXAR DISPLAY 7 SEGMENTOS

Para esto debemos controlar el encendido y apagado de cada 7 Segmento, en este caso utilizo transistores como interruptores, cuando en la base del transistor le coloco un uno permito que circule corriente a masa y el display se encienda, cuando le coloco un cero en la base los display se apagaran por que el transistores esta funcionando como un circuito abierto.

multiplexar display 7 segmentos

EJEMPLO ARDUINO

Este es un ejemplo que encontré en la web y la verdad me pareció muy completo así que se los comparto

#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define F 7
#define G 8

// Pushbuttons connected to pins 9 and 10
#define BTN1 14
#define BTN2 15

// Pins driving common anodes
#define CC1 9
#define CC2 10
#define CC3 11
#define CC4 12
// Pins for A B C D E F G, in sequence
const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 };
 
// Segments that make each number
const byte numbers[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
 
int estadobtn1 = 0;
int estadobtn2 = 0;
int digit1 = 0;
int digit2 = 0;
int digit3 = 0;
int digit4 = 0;
int count = 0;
int val;
int val2;
 
void setup() {
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(BTN1, INPUT);
  pinMode(BTN2, INPUT);
  digitalWrite(BTN1, HIGH); // activa RPA 
  digitalWrite(BTN2, HIGH); // activa RPA 
  pinMode(CC1, OUTPUT);
  pinMode(CC2, OUTPUT);
  pinMode(CC3, OUTPUT);
  pinMode(CC4, OUTPUT);
  count = 0;
}
 
void loop() {
  val = digitalRead(BTN1); // lee el valor de entrada y almacénlo en val
  if (val != estadobtn1) // el estado de botón ha cambiado!
  {
    if (val == LOW) // compruebe si el botón es presionado 
    {
      count++;
      count %= 10000;
    } 
  }
  estadobtn1=val;
 
  val = digitalRead(BTN2); // lee el valor de entrada y almacénlo en val
  if (val != estadobtn2) // el estado de botón ha cambiado!
  {
    if (val == LOW) // compruebe si el botón es presionado 
    {
      if (count == 0)
    {
      count=9999;
    } else {
      count--;
      }
    }
    estadobtn2=val;
  }
// display number
digit1=count / 1000;
digit2=(count - (digit1 * 1000)) / 100;
digit3=(count - (digit1*1000) - (digit2*100)) / 10;
digit4=count % 10;
 
lightDigit1(numbers[digit1]);
  delay(2);
  lightDigit2(numbers[digit2]);
  delay(2);
  lightDigit3(numbers[digit3]);
  delay(2);
  lightDigit4(numbers[digit4]);
  delay(2);
}
 
void lightDigit1(byte number) {
  digitalWrite(CC1, LOW);
  digitalWrite(CC2, HIGH);
  digitalWrite(CC3, HIGH);
  digitalWrite(CC4, HIGH);
  lightSegments(number);
}
 
void lightDigit2(byte number) {
  digitalWrite(CC1, HIGH);
  digitalWrite(CC2, LOW);
  digitalWrite(CC3, HIGH);
  digitalWrite(CC4, HIGH);
  lightSegments(number);
}
 
void lightDigit3(byte number) {
  digitalWrite(CA1, HIGH);
  digitalWrite(CC2, HIGH);
  digitalWrite(CC3, LOW);
  digitalWrite(CC4, HIGH);
  lightSegments(number);
}
 
void lightDigit4(byte number) {
  digitalWrite(CC1, HIGH);
  digitalWrite(CC2, HIGH);
  digitalWrite(CC3, HIGH);
  digitalWrite(CC4, LOW);
  lightSegments(number);
}
 
void lightSegments(byte number) {
  for (int i = 0; i < 7; i++) {
    int bit = bitRead(number, i);
    digitalWrite(segs[i], bit);
  }
}
multiplexar display 7 segmentos

  1. Mariana dice:

    wauuuuuuuuuuuuuuuuuuuuuuuuuu

  2. Franco dice:

    Los displays son anodo o catodo común? Y los transistores?

    1. veloso dice:

      Franco

      Los display son todos ánodo común, es importante que uses ánodo común por que de lo contrario no te funcionara, tendrías que adaptar el código.

      Con respecto a los transistores son todos NPN.

      Saludos!

  3. Pablo dice:

    Hola necesito conectar 20 displays en fila, 4 grupos de 5 displays, que obviamente muestran datos diferentes, la lógica sería la misma?

    1. veloso dice:

      Pablo, básicamente seria aplicar el mismo concepto, pero tenes que tener en cuenta que al ser tantos puede ser que se comience a notar el apagado y encendido de cada uno de los display.
      Saludos!

  4. cicloide dice:

    Hola que sucede si quiero hacer mis display a un tamaño grande y los tengo que construir con led cada segmento de cada display los tendria que alimentar con un transistor?

  5. Byron Ch. dice:

    "por ejemplo ejecutar la lectura de un sensor de temperatura que suele demorar mas de ese tiempo, veríamos un numero incorrecto en los displays."
    ¿Como se corregiria eso?

    1. En ese caso, hay que tomar lecturas del sensor cada un determinado tiempo, luego mostrar el valor obtenido en el display, pero solo despues de obtenido el valor del sensor.

  6. Kenet Gálvez dice:

    Disculpa una pregunta... si únicamente necesito 3 display funciona igual con el mismo código o debo de borrar alguna parte??
    Si es así, me podrías decir cuál debe ser?

  7. cesare dice:

    Hola que sucede si quiero hacer mis display a un tamaño grande y los tengo que construir con led cada segmento ???

    1. Nada, solo tendrías que tener en cuenta la configuración de diodos interna.

  8. Cesar dice:

    porque no utilizar ub SN 7447 o cd 4511. ( de acuerdo a si es anodo o catodo comun).
    Asi se utilizarian menos pines del ARDUINO.

    Yo para display de dos digitos utilizo solo un SN 7447, de forma que uso solo cuatro pines para manejo de numeros y dos pines para multiplexar los anodos o catodos del display.
    de esta manera me estoy ahorrando cutro pines para cuaquier otro trabajo

    1. Muy bien Cesar!, el articulo explica como hacerlo con arduino, igualmente es bueno saber que existen muchas otras opciones.

      Abrazo!

  9. gustavo dice:

    estoy en un proyecto de crear un cronometro muy grande para 99seg y 99 centesimos con arduino con diplay individales de 7 segmentos
    me podrias ayudar?

    1. Hola Gustavo,

      Claro, ¿cuales son tus dudas?

      Te recomiento, si no sabes nada de arduino que te apuntes al siguiente curso paso a paso.

      Curso Arduino

      Saludos!

  10. sergio rodriguez dice:

    de cuanto son las resistencias? lo estoy haciendo en thinkerkad pero no me encienden los displays

  11. Nicolas dice:

    Consulta, yo tengo unos 7 segmentos de ánodo común pero que van a 1 2V, no a 5V. Que driver podría utilizar?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Subir

Este sitio web utiliza cookies propias y de terceros para mejorar su experiencia. Puede optar por no participar si lo desea. Mas información