27 julho 2013

Ligando 2 displays 7 segmentos ao Max7219

No primeiro artigo sobre o display 7 segmentos, vimos como ligar um display diretamente no Arduino. No segundo artigo, ligamos o display à um CI controlador de displays, o Max7219, que por sua vez se comunica com o Arduino utilizando apenas 3 portas da placa.

Neste terceiro artigo, vou continuar utilizando o Max7219 e usá-lo para controlar 2 displays de 7 segmentos, gerando o resultado abaixo :



Observe no circuito abaixo que a ligação ao segundo display é a mesma, ou seja, os mesmos fios que usei para ligar o CI nos segmentos A,B,C, etc, serão utilizados para ligação aos segmentos A,B,C, etc do 2o. display.

Outra alteração no circuito é a ligação do pino D1 (pino 11 do Max7219) ao pino 8 (comum) do segundo display :

Circuito Max7219 e 2 displays 7 segmentos
Essas são as alterações no circuito, tirando uma eventual mudança na resistência, para controlar a corrente nos displays, e essa é a vantagem de usar um CI como o Max7219 : você controla até 8 displays de 7 segmentos, continua usando apenas uma resistência para controlar a corrente em todos os displays, e o resto do "serviço" é feito pelo programa do Arduino.

E falando em programa, vou utilizar praticamente o mesmo do artigo anterior, fazendo um contador de 0 a 99. A mudança no programa está na linha que envia os dados para o display, com o comando lc.setdigit, que tem a seguinte sintaxe :

lc.setDigit( numero_do_chip, display , valor , pontodecimal )

numero_do_chip = Podemos usar até 8 chips MAX7219 em cascata, e esse número determina para qual chip estamos enviando os dados. Para o primeiro chip, o valor deste parametro será 0, para o segundo chip, o valor será 1, e assim sucessivamente.

display = é o número do display com o qual estamos trabalhando. O valor 0 envia os dados para o primeiro display, o valor 1 envia para o segundo display, e assim sucessivamente

valor = é o valor a ser mostrado no display selecionado

pontodecimal = Recebe o valor "true" se quisermos ligar o ponto decimal do display selecionado, ou "false" se quisermos desligá-lo

 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
// Programa : Controlando 2 displays 7 segmentos usando CI Max7219
// Alteracoes / comentarios  : Arduino e Cia
// Baseado no programa exemplo da biblioteca LedControl

#include "LedControl.h" 

// Pino 4 do Arduino ao pino 1 (DIN) do CI
// Pino 5 do Arduino ao pino 13 (CLK) do CI
// Pino 6 do Arduino ao pino 12 (LOAD) do CI
// Ultimo parametro se refere a qtde de MAX7219 utilizados no circuito
LedControl lc=LedControl(4,5,6,1); 

boolean pontodecimal; 

void setup() 
{ 
  // Inicializa o Max7219
  lc.shutdown(0,false); // Habilita o display 
  // Define o nivel de luminosidade (0 minimo, 15  maximo)
  lc.setIntensity(0,10); 
  lc.clearDisplay(0); // Apaga o display
  Serial.begin(9600); // Inicializa a serial
  pontodecimal = false;  //Define o ponto decimal como DESLIGADO
} 

void loop() 
{ 
  for(int i=0; i < 100 ; i++)  //Loop variando valor de i de 0 a 99
  { 
    //Mostra o valor de i/10 no display 1
    lc.setDigit(0,0,i/10,pontodecimal);  
    //Inverte o estado do ponto decimal
    pontodecimal = !pontodecimal;   
    //Mostra o valor de i%10 no display 2
    lc.setDigit(0,1,i%10,pontodecimal);  
    Serial.println(i);
    delay(1000);  //Aguarda 1 segundo e mostra o próximo valor
  } 
delay(1000);  //Aguarda 1 segundo e reinicia a contagem
}

71 comentários:

  1. Teria como dar um exemplo de como seria para mostrar números com 3 ou mais dígitos.
    Não entendi o que esta linha faz.
    lc.setDigit(0,1,i%10,pontodecimal);

    ResponderExcluir
  2. Bom dia Luiz !

    Estou esperando chegar mais displays e vou montar um projeto com mais dígitos. O que esta linha faz é simplesmente mostrar o ponto decimal no display. Troquei o valor, no final da linha, por uma variavel chamada "pontodecimal". Abraços.

    ResponderExcluir
  3. Copiei seu programa e coloquei no arduino mas ele da o seguinte erro:
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:30: error: 'byte' does not name a type
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:52: error: 'byte' does not name a type
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:54: error: 'byte' does not name a type
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:64: error: 'byte' has not been declared
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:64: error: 'byte' has not been declared
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:131: error: 'boolean' has not been declared
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:142: error: 'byte' has not been declared
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:153: error: 'byte' has not been declared
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:164: error: 'byte' has not been declared
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:164: error: 'boolean' has not been declared
    D:\Meus\arduino-1.0.4\libraries\LedControl/LedControl.h:179: error: 'boolean' has not been declared

    saberia me informar qual o problema?

    ResponderExcluir
    Respostas
    1. Boa tarde ! Isso parece ser algum erro na instalação da biblioteca. Você saiu e entrou novamente na IDE para ver se o problema persiste ?

      Excluir
    2. Siim, sai e entrei e instalei a biblioteca certo, sabe algum outro jeito de eu ligar o vários 7segmentos usando apenas 3 saídas de sinais do arduino?

      Excluir
    3. Você pode utilizar o CI 74HC595. Qual versão da IDE você está usando ? Eu uso a 1.0.5.

      Excluir
    4. Estou tendo problema com a mesma coisa, ja fiz mudança da biblioteca, reinstalei ela, mas não da certo :(

      Excluir
  4. Usei a 1.0.4 e a 1.0.5 e com as duas deu o mesmo erro, tentarei com o 74HC595 mesmo, mas eu queria com o 7219, obrigado pela atenção

    ResponderExcluir
  5. Antes de Tudo gostaria de parabenizar pelo post muito bem feito, eu gostaria de saber se é possivel colocar uma entrada de sinal(que seria um sensor de presença) para alterar a numeração desses displays ? como se cada movimento do sensor somasse +1. Agradeço !!

    ResponderExcluir
    Respostas
    1. Boa tarde Gabriel, e obrigado pela visita !

      É possível sim. Dê uma olhada nesse artigo, por favor :

      http://www.arduinoecia.com.br/2013/10/contador-display-7-segmentos-3-digitos.html

      Acho que faz exatamente o que você precisa, talvez com algumas alterações para funcionar com os displays ligados ao Max7219, mas funciona.

      Abraço !

      Excluir
    2. Ahh Muito obrigado mesmo !!

      Vou precisar para o meu TCC !!

      Parabéns pelo trabalho !!

      Se precisar de alguma dica venho até aqui !!

      Obrigado !!

      Excluir
    3. Valeu Gabriel ! Qualquer coisa entre em contato. Abraço !

      Excluir
  6. Fala Galera.

    Gostaria de pedir ajuda na programação com base nesta deste post, porém o meu contador terá 6 displays individuais sete segmentos catodo comum.

    O meu segundo display em diante conta até 9 e depois faz as letras a,b,c,d,e,f, gostaria de saber o porque.

    #include "LedControl.h"

    // Pino 4 do Arduino ao pino 1 (DIN) do CI
    // Pino 5 do Arduino ao pino 13 (CLK) do CI
    // Pino 6 do Arduino ao pino 12 (LOAD) do CI
    // Ultimo parametro se refere ao numero de MAX7219 utilizados no circuito
    LedControl lc=LedControl(4,5,6,1);

    boolean pontodecimal;

    void setup()
    {
    // Inicializa o Max7219
    lc.shutdown(0,false); // Habilita o display
    lc.setIntensity(0,10); // Define o nivel de luminosidade (0 minimo, 15 maximo)
    lc.clearDisplay(0); // Apaga o display
    Serial.begin(9600); // Inicializa a serial
    pontodecimal = false; //Define o ponto decimal como DESLIGADO
    }

    void loop()
    {
    for(int i=0; i < 1000000 ; i++) //Loop variando valor de i de 0 a 99
    {
    lc.setDigit(0,5,i/100000,pontodecimal);
    lc.setDigit(0,4,i/10000,pontodecimal);
    lc.setDigit(0,3,i/1000,pontodecimal);
    lc.setDigit(0,2,i/100,pontodecimal);
    lc.setDigit(0,1,i/10,pontodecimal);
    lc.setDigit(0,0,i%10,pontodecimal);
    Serial.println(i);
    delay(200); //Aguarda 1 segundo e mostra o próximo valor
    }
    delay(1000); //Aguarda 1 segundo e reinicia a contagem
    }

    Obrigado desde já !

    ResponderExcluir
    Respostas
    1. Oi Gabriel !

      Dei uma olhada no seu código e fiz algumas modificações. Não tenho 6 displays disponíveis, mas mandei as saídas para o serial monitor. O que eu fiz foi alterar os cálculos dos dígitos, e também mudar o tipo de valor de int (que vai até 32.767) para long (que vai até 2,147,483,647), senão o display iria mostrar valores estranhos depois que o valor de i fosse maior do que 32.767.

      Talvez não seja a melhor solução, mas foi o que eu consegui por enquanto, espero que ajude. Se puder, por favor me avise se funcionou :

      #include "LedControl.h"

      // Pino 4 do Arduino ao pino 1 (DIN) do CI
      // Pino 5 do Arduino ao pino 13 (CLK) do CI
      // Pino 6 do Arduino ao pino 12 (LOAD) do CI
      // Ultimo parametro se refere ao numero de MAX7219 utilizados no circuito
      LedControl lc=LedControl(4,5,6,1);

      boolean pontodecimal;

      void setup()
      {
      // Inicializa o Max7219
      lc.shutdown(0,false); // Habilita o display
      lc.setIntensity(0,10); // Define o nivel de luminosidade (0 minimo, 15 maximo)
      lc.clearDisplay(0); // Apaga o display
      Serial.begin(9600); // Inicializa a serial
      pontodecimal = false; //Define o ponto decimal como DESLIGADO
      }

      void loop()
      {
      for(long i=0; i < 1000000 ; i++) //Loop variando valor de i de 0 a 100000
      {
      long digito5 = i%1000000;
      long num5 = digito5/100000;
      Serial.print(num5);
      lc.setDigit(0,5,num5,pontodecimal);

      long digito4 = i%100000;
      long num4 = digito4/10000;
      Serial.print(num4);
      lc.setDigit(0,4,num4,pontodecimal);

      int digito3 = i%10000;
      int num3 = digito3/1000;
      Serial.print(num3);
      lc.setDigit(0,3,num3,pontodecimal);

      int digito2 = i%1000;
      int num2 = digito2/100;
      Serial.print(num2);
      lc.setDigit(0,2,num2,pontodecimal);

      int digito1 = i%100;
      int num1 = digito1/10;
      Serial.print(num1);
      lc.setDigit(0,2,num1,pontodecimal);

      int num0 = i%10;
      Serial.print(num0);
      lc.setDigit(0,0,num0,pontodecimal);

      Serial.print(" Num: ");
      Serial.println(i);
      delay(200); //Aguarda 1 segundo e mostra o próximo valor
      }
      delay(1000); //Aguarda 1 segundo e reinicia a contagem
      }

      Abraço !

      Excluir
    2. Bom dia Arduino e Cia
      Não estou conseguindo compilar este programa.
      Erro: LedControl lc=LedControl(4,5,6,1);

      sketch_nov27a.ino:1:24: error: LedControl.h: No such file or directory
      sketch_nov27a:7: error: 'LedControl' does not name a type
      sketch_nov27a.ino: In function 'void setup()':
      sketch_nov27a:14: error: 'lc' was not declared in this scope
      sketch_nov27a.ino: In function 'void loop()':
      sketch_nov27a:28: error: 'lc' was not declared in this scope

      Excluir
    3. Bom dia!

      Me parece ser algum erro na instalação da biblioteca.

      Abraço!

      Excluir
    4. email para contato
      tiagoposmatematica@gmail.com
      abs

      Excluir
  7. Nossa Agradeço Muito mesmo pela atenção !!

    Funcionou direitinho !!

    A única coisa que eu alterei foi:

    int digito1 = i%100;
    int num1 = digito1/10;
    Serial.print(num1);
    lc.setDigit(0,2,num1,pontodecimal);

    Para

    int digito1 = i%100;
    int num1 = digito1/10;
    Serial.print(num1);
    lc.setDigit(0,1,num1,pontodecimal);

    Mais de resto tudo perfeito !!

    Muito Obrigado mesmo !!

    Abraço !!

    ResponderExcluir
    Respostas
    1. Opa ! legal Gabriel !

      Verdade, copiei essa parte do código e esqueci de mudar. rs.

      Qualquer coisa, estamos aí. Abraço !

      Excluir
  8. Fala pessoa!

    Seguinte, segui o tutorial e deu tudo certo, mas estou usando displays maiores de 1,5 polegadas e eles estão com a iluminação baixa, em locais com luz ficam quase apagados.

    O que devo fazer para que fiquem mais brilhantes? Não manjo nada das voltagens, liguei como no tutorial:

    Aqui o datasheet do display: http://pdf1.alldatasheet.com/datasheet-pdf/view/233059/KINGBRIGHT/SC15-11EWA.html

    Valeu! =D

    ResponderExcluir
    Respostas
    1. Boa tarde Cleiton ! Tudo bem ?

      Olha, eu tive o mesmo problema que você com alguns displays, e consegui resolver mudando a resistência do circuito. Tente colocar uma resistência mais alta.

      Neste tutorial, por exemplo, eu usei um resistor de 100 K. Tente aumentar o valor aos poucos, até chegar na iluminação ideal para o seu projeto. Em alguns displays eu cheguei a usar resistor de 1 Mega, mas recomendo que você aumente o valor aos poucos para não danificar o display.

      Abraço e, se puder, depois me conte se funcionou. ;-)

      Excluir
    2. Cara muito obrigado por sua resposta, estava preocupado já pensando que teria que trocar algum componente que mudaria o circuito, já estou com as PCBs impressas e tudo mais, aliviado.

      Vou comprar alguns resistores pra testar amanha e com certeza retorno aqui pra informar.

      Muito obrigado mais uma vez, abraço!

      Excluir
  9. Amigo, fiquei com uma dúvida: Por que eu devo diminuir a resistência no circuito? Se diminuir não acontece um efeito contrário com os displays ficando com os leds mais fracos? Entra 5V e passa pelo resistor de 100k, se aumentar esse resistor não diminuiria ainda mais a voltagem que alimenta os leds dos displays?

    Obrigado pela ajuda!

    ResponderExcluir
    Respostas
    1. Oi Cleiton,

      Então, eu tinha a mesma dúvida, mas acabei achando um gráfico em um dos datasheets do Max7219 que mostrava exatamente o contrário.

      Vou tentar achar essa informação novamente, mas fique tranquilo. Nos testes que eu fiz, quando maior a resistência, maior o brilho dos displays.

      Abraço !

      Excluir
    2. Opa, fiz alguns testes aqui com potenciômetro, e realmente, quanto mais aumentamos a resistência, mais os displays ficam "fracos". O MAX7219 tem uma limitação de voltagem de 5V, e permite um resistor mínimo de aproximadamente 10K, se diminuir disso ele "desarma".

      Fiz pesquisas na internet e vi algumas pessoas usando o MAX7219 com displays de 12V ou até mais, usando mais alguns CI's que são: 74HC540, ULN2803A e UDN2981A em conjunto com o MAX.

      Então para que meu projeto fique da forma que é preciso que fique, tive que comprar esses CI's, vou perder 2 PCBs, mas vou dar uma refatorada em todo projeto e acredito que ficará satisfatório, vou confeccionar uma pcb somente para os CI's e deixar conectores já disponíveis para que plugue os displays.

      Se quiser eu posto aqui o esquema do MAX com esses CI's, blz?

      De qualquer forma veja se consegue novamente essa informação, pois pode ser importante.

      Abraço!

      Excluir
    3. Oi Cleiton !

      Legal, valeu pelas informações. Realmente comigo deu um resultado diferente, e eu recomendei a solução de aumentar a resistência para outros usuários, que testaram e me falaram que funcionou. Talvez isso esteja relacionado ao tipo de display, não sei, preciso fazer mais testes.

      Se puder contribuir com essa informação do Max com os CI´s, seria legal sim. Vai ajudar bastante gente.

      Abraço !

      Excluir
    4. bom dia cleiton, estou montando circuito com o mesmo display grande que vc usou , teria como voce me mandar o esquema de como ficou pra aumentar o brilho do mesmo ? meu email atilabg@yahoo.com.br. valeu

      Excluir
  10. Fala Arduino & Cia !

    To eu aqui de novo !! kkkkk

    Gostaria de um empurrão na programação do max7219 com o sensor óptico TCRT5000, tem como fazer por essa ledcontrol ou você me sugeria uma outra biblioteca, tentei uma programação aqui mais não rolou, nem sinal do display acender....

    Gostaria de aprender a mexer nesse danado kkkkk

    Obrigado pela atenção !!

    ResponderExcluir
    Respostas
    1. Fala Gabriel !

      Bom retorno. 8-)

      Posta o código pra gente dar uma olhada. Estou sem Max7219 aqui agora, mas vamos ver no que posso ajudar.

      Abraço !

      Excluir
  11. Bom Vamos lá

    #include "LedControl.h"

    int contador = 0;
    int pinosensor = 19; //Ligado ao pino "coletor" do sensor óptico - Porta A5 ao Arduino
    int leitura; //Armazena o valor lido pelo sensor

    // Pino 4 do Arduino ao pino 1 (DIN) do CI
    // Pino 5 do Arduino ao pino 13 (CLK) do CI
    // Pino 6 do Arduino ao pino 12 (LOAD) do CI
    // Ultimo parametro se refere ao numero de MAX7219 utilizados no circuito
    LedControl lc=LedControl(4,5,6,1);

    boolean pontodecimal;

    void setup()
    {
    pinMode(pinosensor, INPUT); //Define o pino do sensor optico como entrada
    // Inicializa o Max7219
    lc.shutdown(0,false); // Habilita o display
    lc.setIntensity(0,10); // Define o nivel de luminosidade (0 minimo, 15 maximo)
    lc.clearDisplay(0); // Apaga o display
    Serial.begin(9600); // Inicializa a serial
    pontodecimal = false; //Define o ponto decimal como DESLIGADO

    }

    void loop()
    {
    leitura = digitalRead(pinosensor); //Le as informações do pino do sensor
    if (leitura != 1); //Verifica se o objeto foi detectado
    contador = contador++; //Incrementa o valor do contador
    while(digitalRead(pinosensor) != 1); //Loop caso o objeto pare sobre o sensor
    {
    for(long i=0; i < 1000000 ; contador++) //Loop variando valor de i de 0 a 100000
    {
    long digito5 = i%1000000;
    long num5 = digito5/100000;
    Serial.print(num5);
    lc.setDigit(0,5,num5,pontodecimal);

    long digito4 = i%100000;
    long num4 = digito4/10000;
    Serial.print(num4);
    lc.setDigit(0,4,num4,pontodecimal);

    int digito3 = i%10000;
    int num3 = digito3/1000;
    Serial.print(num3);
    lc.setDigit(0,3,num3,pontodecimal);

    int digito2 = i%1000;
    int num2 = digito2/100;
    Serial.print(num2);
    lc.setDigit(0,2,num2,pontodecimal);

    int digito1 = i%100;
    int num1 = digito1/10;
    Serial.print(num1);
    lc.setDigit(0,1,num1,pontodecimal);

    int num0 = i%10;
    Serial.print(num0);
    lc.setDigit(0,0,num0,pontodecimal);

    Serial.print(" Num: ");
    Serial.println(i);
    delay(100); //Aguarda 1 segundo e mostra o próximo valor
    }
    delay(1000); //Aguarda 1 segundo e reinicia a contagem
    }
    }

    Bom eu tentei interpretar as programações e saiu isso ai... dei uma vasculhada na net e vi que alguns programas usavam o ++ para adicionar um numero no contador, também no livro arduino básico tinha um programa que falava que o Pino Din do Max7219 era o que recebia e enviava o sinal...

    Muito Obrigado pela atenção !!

    Abraço !!

    ResponderExcluir
  12. bom dia, estou fazendo um timer countdown de 4 digitos , e queria usar o max7219, como faço pra começar a contar de um numero alto e decrescer ate zero? obrigado

    ResponderExcluir
    Respostas
    1. Bom dia, você vai utilizar algum tipo de botão ? ou vai rodar em loop ? Você pode usar o mesmo esquema deste post, ligando os outros 2 dígitos aos pinos Dig2 e Dig3 do Max7219. Se tiver dúvida na pinagem, dê uma olhada nesse artigo :

      http://www.arduinoecia.com.br/2013/07/controlando-display-7-segmentos-com-o.html

      Abraço !

      Excluir
  13. Estou precisando de um projeto de contador até 10.000. Alguem viu algo parecidopor ai?

    ResponderExcluir
    Respostas
    1. Bom dia Bruno,

      Não tenho nada parecido no momento, mas creio que não seja difícil montar. Você está pensando no mesmo esquema ? Com display 7 segmentos ?

      Abraço !

      Excluir
    2. Fala Bruno é mais ou menos isso ai !!

      #include "LedControl.h"

      // Pino 4 do Arduino ao pino 1 (DIN) do CI
      // Pino 5 do Arduino ao pino 13 (CLK) do CI
      // Pino 6 do Arduino ao pino 12 (LOAD) do CI
      // Ultimo parametro se refere ao numero de MAX7219 utilizados no circuito
      LedControl lc=LedControl(4,5,6,1);

      boolean pontodecimal;

      void setup()
      {
      // Inicializa o Max7219
      lc.shutdown(0,false); // Habilita o display
      lc.setIntensity(0,10); // Define o nivel de luminosidade (0 minimo, 15 maximo)
      lc.clearDisplay(0); // Apaga o display
      Serial.begin(9600); // Inicializa a serial
      pontodecimal = false; //Define o ponto decimal como DESLIGADO
      }

      void loop()
      {
      for(long i=0; i < 10001 ; i++) //Loop variando valor de i de 0 a 100000
      {
      long digito4 = i%100000;
      long num4 = digito4/10000;
      Serial.print(num4);
      lc.setDigit(0,4,num4,pontodecimal);

      int digito3 = i%10000;
      int num3 = digito3/1000;
      Serial.print(num3);
      lc.setDigit(0,3,num3,pontodecimal);

      int digito2 = i%1000;
      int num2 = digito2/100;
      Serial.print(num2);
      lc.setDigit(0,2,num2,pontodecimal);

      int digito1 = i%100;
      int num1 = digito1/10;
      Serial.print(num1);
      lc.setDigit(0,1,num1,pontodecimal);

      int num0 = i%10;
      Serial.print(num0);
      lc.setDigit(0,0,num0,pontodecimal);

      Serial.print(" Num: ");
      Serial.println(i);
      delay(100); //Aguarda 1 segundo e mostra o próximo valor
      }
      delay(1000); //Aguarda 1 segundo e reinicia a contagem
      }

      Conta até 10.000 Sozinho !

      Ainda não sei como colocar o sensor ou algo do tipo.

      Abraço !!

      Excluir
  14. Tentei montar esse projeto mas os Displays não estão acendendo. Também tinha tentado ligar o MAX7219 em uma matriz de LEDs 8x8 seguindo as instruções do livro Arduíno Básico - Projeto 21, mas a matriz ficou com todos os LEDs acesos. Estou achando que meu MAX7219 está com problema, você sabe se tem alguma maneira de testa-lo?

    ResponderExcluir
    Respostas
    1. Oi Rodrigo,

      Talvez seja alguma outra coisa. Vc viu se os displays não estão acendendo, ou se estão apenas muito fracos ? Tente trocar o valor da resistência. Comigo aqui deu certo quando eu troquei por uma resistência de valor maior.

      Abraço !

      Excluir
    2. Obrigado! Troquei o resistor de 10K por um de 1M e funcionou! Engraçado quanto maior a resistência maior o brilho, mas mesmo com o resistor de 1M o brilho ficou um pouco fraco. Agora não sei porque minha matriz 8x8 não está funcionando, ela só acende todos os LEDs, já verifiquei a pinagem várias vezes, troquei os resistores e nada! Você já utilizou uma matriz 8x8 com o MAX7219?

      Excluir
    3. Boa tarde Rodrigo !

      Legal ter funcionado. Tente outros valores de resistência, se puder.

      Quanto à matriz 8x8, já usei sim, inclusive o exemplo do livro Arduino Básico, e funcionou direitinho.

      Geralmente esse problema de acender todos os leds acontece quando vc liga a matriz ao contrário...

      Abraço !

      Excluir
    4. Boa tarde!

      Consegui fazer funcionar, a pinagem do datasheet que eu peguei estava errada, tive ir descobrindo os pinos na tentativa e erro... Deu trabalho mas funcionou! Obrigado pelas dicas!

      Abraço!

      Excluir
    5. Bom dia Rodrigo !

      Obrigado pelo retorno. Só não gostei dessa parte do datasheet com pinagem errada. :-(

      Abraço !

      Excluir
  15. Gostaria de saber como posso incrementar dois botões nesse projeto.... sendo um botão para incrementar um numero e o outro para decrementar, igual a um placar eletrônico. Obrigado a quem disponibilizar ajuda....

    ResponderExcluir
    Respostas
    1. Boa tarde Cleuber,

      Acho que nesse post aqui tem o que você precisa :

      http://www.arduinoecia.com.br/2013/10/contador-display-7-segmentos-3-digitos.html

      Você pode trocar o sensor óptico por um botão, e incrementar o valor do contador. Depois alterar o código e adicionar mais um botão, para decrementar o valor do contador.

      Abraço !

      Excluir
  16. Boa noite equipe Arduino e Cia,
    No meu projeto estou fazendo um placar eletrônico com display duplo de 7 segmentos e gostaria de saber se posso usar o MAX 7219 para economizar portas no arduino utilizando essa mesma biblioteca? A lógica dos botões seria para essa aplicação?

    ResponderExcluir
    Respostas
    1. Boa noite Cleuber,

      Exato, você pode usar esse mesmo circuito, e implementar os 2 botões para mostrar os valores desejados.

      Abraço !

      Excluir
  17. Bom dia, na compilação está gerando os seguintes erros:
    In file included from sketch_jun25a.ino:1:
    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

    minnha IDE é a 1.0.5 - r2
    existe uma outra biblioteca que poderia usar?

    ResponderExcluir
    Respostas
    1. Boa noite Cleuber,

      Você quis dizer versão 1.5.6-r2 ? Se for essa, realmente pode ser alguma incompatibilidade da biblioteca. Você consegue testar em outra versão da IDE ?

      Abraço.

      Excluir
  18. Obrigado pelo artigo!
    Estou montando um projeto que utiliza 3 sensores de efeito hall para medir rotação, velocidade e nível de combustível.
    Para indicar velocidade eu estou utilizando 2 displays de 7 segmentos com o Max7219, e LEDs para indicar rpm(6 leds) e combustível(4 leds). Estou pensando em utilizar um 74HC595 para cada uma dessas 2 indicações. Gostaria de uma opinião a respeito.
    Grato!

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Bacana o seu projeto. E se você usasse um display LCD ? Você poderia colocar na parte superior a indicação de RPM, e na inferior o medidor de combustível.

      Usar o 74HC595 também não é problema, mas se a questão for o número de portas, talvez um LCD seja a melhor opção.

      Abraço !

      Excluir
    2. Obrigado pela resposta!
      Eu optei por essa configuração pela facilidade na visualização do motorista.
      Agora estou com dúvida quanto a programação, como fazer essas três operações funcionarem ao mesmo tempo. Estou testando com o Proteus e sem utilizar os sensores, mas as indicações não funcionam ao mesmo tempo, só em sequencia.
      Grato.

      Excluir
    3. Entendi... Você tem razão, realmente dá um certo trabalho programar os sensores para ter os dados em tempo real, que acho que é o seu caso.

      Não tive a oportunidade de mexer com o Proteus, mas ele sendo um simulador, pode ter algumas limitações, e você só vai conseguir ver o tamanho da "encrenca" de verdade quando montar o circuito.

      Se tiver novidades e quiser compartilhar aqui no site, agradeço.

      Abraço !

      Excluir
    4. Eu consegui fazer um esboço no Proteus utilizando o Arduino UNO e um CI MAX7219 para as indicações.
      Segue o link para o esboço no Proteus > http://i.imgur.com/Jl1QQbb.png?1

      Eu vou precisar de mais algum componente?
      E com relação a programação, fica mais complexo de ser feito dessa forma?
      Tem alguma forma mais simples para a programação!?

      Assim que der eu vou tentar montar em uma protoboard!

      Obrigado.

      Excluir
    5. Boa noite,

      A principio não falta muita coisa, apenas algumas resistências para os leds, que eu imagino que você não tenha esquecido. :-)

      Só não sei se o Max7219 vai dar conta de acionar tudo isso. Como eu te falei anteriormente, você só vai ver o tamanho da encrenca na hora de montar. rs

      Abraço !

      Excluir
  19. Boa noite minha duvida é se eu posso trocar o pino 4 do arduino pelo pino 2.
    ficaria assim:
    Pino 2 do Arduino ao pino 1 (DIN) do CI
    Pino 5 do Arduino ao pino 13 (CLK) do CI
    Pino 6 do Arduino ao pino 12 (LOAD) do CI

    ResponderExcluir
    Respostas
    1. Bom dia,

      Sem problemas. Altere o circuito e também essa linha do programa, que define os pinos que você está utilizando :

      LedControl lc=LedControl(4,5,6,1);

      Abraço !

      Excluir
  20. Boa tarde,

    Estou tendo problema com a biblioteca, está dando o mesmo erro que já vi nos comentários anteriores, baixei uma IDE novo, eu uso a 1.0.6 e baixei a 1.0.5, mas não obtive sucesso. Você descobriu o que pode está causando isso ou se acaso tem alguma outra biblioteca que posso usar??

    Obrigado

    ResponderExcluir
    Respostas
    1. Boa tarde João,

      Sinceramente não sei o que pode estar acontecendo. Aqui compila normalmente com essa mesma biblioteca, tanto na IDE 1.0.5 como na 1.0.6.

      Eu ainda penso que seja algum conflito com outra biblioteca. Tente fazer uma instalação "limpa" da IDE, apenas com a biblioteca LedControl.

      Abraço !

      Excluir
  21. Olá, pode me dizer se os displays são Anodo ou Catodo?
    Onde ficam os GND dos displays conectados?

    ResponderExcluir
    Respostas
    1. Boa tarde Waltenio,

      Os displays são de catodo comum, eu utilizei o esquema de ligação deste post :

      http://www.arduinoecia.com.br/2013/07/display-7-segmentos.html

      Quanto ao GND, é o pino 3 do display, sendo que o primeiro display eu liguei ao pino 2 (Digito 0) do Max7219, e o segundo display eu liguei ao pino 11 (digito 1) do Max7219.

      Abraço !

      Excluir
  22. Para resolver o problema do Cleuber Ferreira basta ele abaixar a ultima versão do arduino e fazer o passos abaixo:
    I took a quick look at the library, well libraries since there are two LedControl libraries. The first one compiled straight away but the second modified one gave the errors you mentioned.

    Did you update to the Arduino 1.0 IDE?

    If you didn't update the IDE are you sure your using the same one as before and not accidently swapped it for the modified one?

    If you updated the IDE and are sure its the correct LedControl library try opening LedControl.h and replace #include "WConstants.h" with #include "Arduino.h" and also open LedControl.cpp and replace #include "WProgram.h" with #include "Arduino.h"

    ResponderExcluir
  23. Teria como dar um exemplo de como seria para mostrar números com 3 ou mais dígitos.
    Não entendi o que esta linha faz.
    lc.setDigit(0,1,i%10,pontodecimal);
    Mais precisamente a função i%10 e i/10

    ResponderExcluir
    Respostas
    1. Bom dia Luiz,

      A função i%10 calcula o resto da divisão de i por 10, eu uso isso para isolar o número que vou mostrar. A mesma coisa com o i dividido por 10 (i/10). Por exemplo, vamos supor que o contador chegou a 56

      primeiro digito = i/10 = 56/10 = 5 (apenas a parte inteira)
      segundo digito = i%10 = 6 (resto da divisão acima)

      Quando ao display com 3 dígitos, por favor dê uma olhada neste link:

      http://www.arduinoecia.com.br/2013/10/contador-display-7-segmentos-3-digitos.html

      Abraço !

      Excluir
  24. Necessito de ajuda ! sou novo com arduino, e preciso de auxilio com meu projeto da faculdade, que é um placar eletrônico. No meu projeto com arduino, estou usando 12 displays catodos de 7 segmentos , usando 2 max7219, em um max7219 quero implementar 6 displays precisam de 7.2-7.4V de tensão (display de 2 polegadas) e no outro max7219 tem 6 displays precisam de 8.5-10V de tensão (display de 4 polegadas). Como devo proceder com essas diferentes tensões, já que o max7219 suporta apenas até 5V de tensão ? Grato!

    ResponderExcluir
    Respostas
    1. Boa noite Felipe,

      Você pode usar o Max7219, mas vai precisar de mais alguns componentes. Dê uma olhada neste link, por favor:

      http://embedded-lab.com/blog/?p=7628

      Abraço!

      Excluir
  25. oi boa noite a todos :
    estou querendo uma ajudar de meus amigos sou um iniciantes em programação mais já tenho bastante experiencia em eletrônica
    estou querendo montar um painel pra chamadas com três dígitos e estou querendo usar um outro Ci DC4014 ou 74hc165 para multiplexa as portas pq o ardunio ñ vai dar para supre muitas entradas são 40 e cada pino vou chamar um numero os amigos tem uma ideia posso usar a mesma ideia do colegar que usou um sensor

    ResponderExcluir
  26. Boa Tarde!
    Estou não conheço muito do arduino, mas como faço pra conseguir contar até 20 e contar também duas casa decimais depois da virgula.

    Obrigado

    ResponderExcluir
  27. Boa Tarde!!
    Eu estou a tentar realizar um projecto para a minha PAP que e fazer um placar desportivo mas para ja quero fazer em dois displays o mesmo representado no video, so que com o CI uln2003an so que eu coloco a programação a cima exposta e ela compila direito e envia mas nao da nada nos dois displays.

    Alguem me sabe dizer o que se passa?

    ResponderExcluir
  28. Boa Tarde

    Eu quero fazer um contador com dois displays de 7 segmentos em que consiste em fazer a contagem de 0 ate 99 mas ainda so consegui por um dos displays a contar ate 9 o outro esta descontrolado.
    Como e que consigo resolver o problema e por os dois a contar??

    ResponderExcluir
  29. Poderia me ajudar, preciso de um projeto com 13 displays de 7 segmentos e 4 LEDs. Vou fazer mais ou menos uma demonstração de como é a ordem, [] vale como display e : como leds, assim:

    [][][] [][] [][][][] : [][] : [][]

    Se puder me ajudar, passar um e-mail, ou entrar em contato comigo: leandro_bona@hotmail.com

    ResponderExcluir