14 outubro 2014

Módulo display 7 segmentos 8 dígitos com MAX7219

Uma sugestão de módulo para quem precisa utilizar display 7 segmentos sem ter que ligar um monte de fios, é esse módulo display 7 segmentos de 8 dígitos, com CI MAX7219.

display 7 segmentos 8 digitos max7219

Como você pode ver pela imagem, podemos imprimir alguns caracteres nesse display além, é claro, de mostrar os números. Uma outra maneira de acionar o display, que veremos adiante, é utilizar uma sequência de bits para acionar os segmentos correspondentes no display e criarmos nossos próprios símbolos.

Aqui no Arduino e Cia já usamos o MAX7219 para controlar tanto módulos matriz de leds 8x8 como displays 7 segmentos :


O funcionamento do módulo de 8 dígitos é muito semelhante ao que vimos nesses posts, pois ele também usa apenas três pinos (lado esquerdo) para conexão ao Arduino ou outro microcontrolador

No lado direito, encontramos os pinos que permitem a ligação de vários módulos em cascata :

Módulo display 7 segmentos - pinagem



O circuito para ligação ao Arduino fica então dessa maneira, com os pinos 5, 6 e 7 conectados respectivamente aos pinos LOAD, CLK e DIN :

Circuito Arduino Uno - Display 7 segmentos Max7219



Programa utilizando a biblioteca LedControl

A biblioteca LedControl, que pode ser baixada nesse link é quem vai controlar o acionamento do display. Comandos principais do LedControl utilizados no programa :

LedControl lc=LedControl(7, 6, 5 , 1) = Define os pinos que serão ligados ao módulo. Pino 7 do Arduino ao DIN, pino 6 ao CLK e pino 5 ao LOAD. O último valor se refere à quantidade de módulos que estão conectados ao Arduino.

lc.shutdown(0, false) = Esse comando, além de servir para inicializar o display, também serve para apagar o display sem perder os dados em memória. Esse comando é especialmente útil quando o módulo estiver sendo alimentado por baterias, já que podemos mostrar os dados no display apenas quando for acionado um botão, por exemplo. Nesse caso, basta alterar o último parâmetro para TRUE quando não quisermos que o display permaneça ligado.

lc.setIntensity(modulo, valor) = Regula o brilho do display. O primeiro parâmetro é o número do módulo, e valor pode ser um número entre 0 (mínimo) à 15 (brilho máximo).

lc.setChar(modulo, digito, caracter, false) = Imprime um caracter no display. Apesar de não termos muitos caracteres disponíveis devido à limitação do display de 7 segmentos, podemos utilizar os caracteres A, B, C, D, E, F, H, L e P.

lc.setDigit(modulo, digito, valor, ponto_decimal) = Utilizamos para enviar diretamente um número ou o valor de uma variável para determinado digito no display. O parâmetro ponto_decimal pode receber os valores TRUE (exibe o ponto decimal), ou FALSE (desativa o ponto decimal).

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Programa : Display 7 segmentos - 8 digitos MAX7219
// Autor : Arduino e Cia

// Carrega a biblioteca LedControl
#include "LedControl.h"

// Definicoes dos pinos e quantidade de modulos no circuito
LedControl lc=LedControl(7,6,5,1);

void setup() 
{
  // Inicializa o modulo
  lc.shutdown(0,false);
  // Ajuste do brilho do display
  lc.setIntensity(0,3);
  // Apaga o display
  lc.clearDisplay(0);
}

void loop()
{
  // Envia Arduino e Cia para o display
  writeArduinoOn7Segment();
  // Contagem regressiva
  contagem_regressiva();
  // Mostra numeros no lado esquerdo e direito do display
  numeros_separados();
  // Inicia contador de 0 a 1 milhao
  for (long i=0; i < 1000000; i++)
  {
    printNumber(i);
  }
  delay(500);
}
void printNumber(long v) 
{
  // Variavel valor digitos
  int digito1;
  int digito2;
  int digito3;
  int digito4;
  int digito5;
  int digito6;
  int digito7;
  int digito8;

  // Calcula o valor de cada digito
  digito1 = v%10;
  digito2 = (v / 10) % 10;
  digito3 = (v/ 100) % 10;  
  digito4 = (v/1000) %10;
  digito5 = (v/10000) %10;
  digito6 = (v/100000) %10;
  digito7 = (v/1000000) %10;
  digito8 = (v/10000000) %10;
  
  // Mostra o valor de cada digito no display
  lc.setDigit(0,7,(byte)digito8,false);
  lc.setDigit(0,6,(byte)digito7,false);
  lc.setDigit(0,5,(byte)digito6,false);
  lc.setDigit(0,4,(byte)digito5,false);
  lc.setDigit(0,3,(byte)digito4,false);
  lc.setDigit(0,2,(byte)digito3,false);
  lc.setDigit(0,1,(byte)digito2,false);
  lc.setDigit(0,0,(byte)digito1,false);
  delay(00);
}

void writeArduinoOn7Segment() 
{
  // Escreve Arduino e Cia no display
  for (int i =0; i<21; i++)
  {
    lc.setChar(0,i,'a',false);
    lc.setRow(0,i-1,0x05);
    lc.setChar(0,i-2,'d',false);
    lc.setRow(0,i-3,0x1c);
    lc.setRow(0,i-4,B00010000);
    lc.setRow(0,i-5,0x15);
    lc.setRow(0,i-6,0x1D);
    lc.setChar(0,i-7,' ',false);
    lc.setChar(0,i-8,'e',false);
    lc.setChar(0,i-9,' ',false);
    lc.setRow(0,i-10,B1001110);    
    lc.setRow(0,i-11,B0010000);  
    lc.setChar(0,i-12,'a',false);    
    lc.setChar(0,i-13,' ',false);
    delay(300);
  }
}

void contagem_regressiva()
{
  for (int x = 8; x >-1;x--)
  {
    lc.setDigit(0,x,x+1, false);
    lc.setChar(0,x+1,' ',false);
    delay(300);
  }
  lc.clearDisplay(0);
} 

void numeros_separados()
{
  for (int i =0 ; i<10 ; i++)
  {
     lc.setDigit(0,0,i,false);
     lc.setDigit(0,1,i,false);
     lc.setDigit(0,6,i,false);
     lc.setDigit(0,7,i,false);
     delay(300);
  }
  lc.clearDisplay(0);
}

Por último, para acionar apenas determinados segmentos do display, usamos o comando lc.setRow(), que tem a seguinte sintaxe :

lc.setRow(numero_modulo, digito,  valor) = Podemos definir valor em decimal, hexa ou binário, mas o comando fica mais fácil de entender se utilizarmos binário.

Veja por exemplo a letra "R", que escrevemos no display usando esse comando :

lc.setRow(0, digito, 0x05)

Em binário, o comando fica assim :

lc.setRow(0, digito, B00000101)

Que significa que estamos acionando apenas os segmentos E e G do display. A figura abaixo mostra exatamente como isso funciona :

Display 7 segmentos - Binario

Escolha os segmentos que você deseja ligar ou desligar, alterando o valor do bit correspondente para 1 ou 0.

Abaixo, vídeo mostrando o funcionamento do programa listado acima :



7 comentários:

  1. Boa tarde, parabens pelo seu trabalho, sempre tem me ajudado nas minhas dúvidas e aprendizado.
    Gostaria de saber como ficaria o codigo "sketch" para esta matrix de led " 8 segmentos / max 7219 + DS1307" para montar um relogio de tempo real. Você poderia "postar" ou enviar pata meu email:
    robertocarlosalvarenga@gmail.com

    grato,

    ResponderExcluir
    Respostas
    1. Boa noite Roberto,

      Eu vou postar nos próximos dias um artigo com RTC DS1302 e display de 7 segmentos com 4 dígitos. Creio que você pode usar praticamente o mesmo programa para uma matriz de oito dígitos e DS1307.

      Abraço !

      Excluir
    2. Boa tarde, obrigado, fico no aguardo..."ansioso" para por em prática.
      grato...

      Excluir
  2. bom dia, tem como apagar os caracteres nao utilizados? tipo se meu valor for 1919 ele aparece 0000191919, porem nao daria para desativar, pois em algum momento esse valor poderia ser por exemplo 191919...

    ResponderExcluir
    Respostas
    1. Boa noite Roberto,

      Estou sem esse display para testar no momento, mas dê uma olhada na biblioteca, especiamente nessa parte:

      void setScanLimit(int addr, int limit);

      Pelo que eu li, nesse comando você pode configurar quantos digitos serão mostrados.

      Abraço !

      Excluir
  3. Oi amigos, baixei e instalei a biblioteca, copiei o código, mas na compilação sempre dá esse erro:


    This report would have more information with
    "Show verbose output during compilation"
    enabled in File > Preferences.
    Arduino: 1.0.6 (Windows 7), Board: "Arduino Mega 2560 or Mega ADK"
    In file included from sketch_oct07a.ino:5:
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:30: error: 'byte' does not name a type
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:52: error: 'byte' does not name a type
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:54: error: 'byte' does not name a type
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:64: error: 'byte' has not been declared
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:64: error: 'byte' has not been declared
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:131: error: 'boolean' has not been declared
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:142: error: 'byte' has not been declared
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:153: error: 'byte' has not been declared
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:164: error: 'byte' has not been declared
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:164: error: 'boolean' has not been declared
    C:\Program Files (x86)\Arduino\libraries\LedControl/LedControl.h:179: error: 'boolean' has not been declared


    Como posso resolver isso?

    ResponderExcluir
  4. Coloque na linha 5:
    #include

    Baixe e instale a library ledControl:

    https://github.com/wayoda/LedControl/releases

    estou utilizando a versão 1.0.6 da IDE do arduino.


    ResponderExcluir