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.
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.
O módulo display Max7219
Aqui no Arduino e Cia já usamos o MAX7219 para controlar tanto módulos matriz de leds 8×8 como displays 7 segmentos:
Da mesma forma que vimos nesses posts, o funcionamento do módulo de 8 dígitos é muito semelhante, 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.
Conexão do módulo display 7 segmentos Max7219 no Arduino
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:
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:
// 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); }
Vamos dar uma olhada nos principais comandos dessa biblioteca?
Principais comandos da biblioteca LedControl
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. Ele é 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.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.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).
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)
Desse modo podemos definir valores 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:
Assim, 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 mostrado acima:
Gostou? Confira mais posts usando o Max7219 aqui mesmo no Arduino e Cia!
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:
[email protected]
grato,
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 !
Boa tarde, obrigado, fico no aguardo…"ansioso" para por em prática.
grato…
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…
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 !
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)ArduinolibrariesLedControl/LedControl.h:30: error: 'byte' does not name a type
C:Program Files (x86)ArduinolibrariesLedControl/LedControl.h:52: error: 'byte' does not name a type
C:Program Files (x86)ArduinolibrariesLedControl/LedControl.h:54: error: 'byte' does not name a type
C:Program Files (x86)ArduinolibrariesLedControl/LedControl.h:64: error: 'byte' has not been declared
C:Program Files (x86)ArduinolibrariesLedControl/LedControl.h:64: error: 'byte' has not been declared
C:Program Files (x86)ArduinolibrariesLedControl/LedControl.h:131: error: 'boolean' has not been declared
C:Program Files (x86)ArduinolibrariesLedControl/LedControl.h:142: error: 'byte' has not been declared
C:Program Files (x86)ArduinolibrariesLedControl/LedControl.h:153: error: 'byte' has not been declared
C:Program Files (x86)ArduinolibrariesLedControl/LedControl.h:164: error: 'byte' has not been declared
C:Program Files (x86)ArduinolibrariesLedControl/LedControl.h:164: error: 'boolean' has not been declared
C:Program Files (x86)ArduinolibrariesLedControl/LedControl.h:179: error: 'boolean' has not been declared
Como posso resolver isso?
Edited this file and got it working, lots of errors! but this code works and still needs a function added that I commented out.
// Program: Display 7 segments – 8 digits MAX7219
// Author: Arduino e Cia
//Edited by Steve Caldwell 2/20/2019
// Load the LedControl library
#include "LedControl.h"
// Definitions of the pins and number of modules in the circuit
LedControl lc = LedControl ( 2 , 4 , 3 , 1 ); //Change first nimber to, DIN and the pin your using(int); second to, CLK and the pin your using (int); and the third to, CS and the pin your using (int).
void setup ()
{
// Initialize the module
lc.shutdown ( 0 , false);
// Display brightness adjustment
lc.setIntensity ( 0 , 3 );
// Clears the display
lc.clearDisplay ( 0 );
}
void loop ()
{
// Send Arduino and Cia to the display
writeArduinoOn7Segment ();
// Countdown
// countdown();
// Displays numbers on the left and right side of the display
separated_numbers ();
// Start counter from 0 to 1 milhao
for ( long i = 0 ; i < 1000000 ; i ++)
{
printNumber (i);
}
delay ( 500 );
}
void printNumber ( long v)
{
// Variable value digits
int digit1;
int digit2;
int digit3;
int digit4;
int digit5;
int digit6;
int digit7;
int digit8;
// Calculate the value of each digit
digit1 = v% 10 ;
digit2 = (v / 10 )% 10 ;
digit3 = (v / 100 )% 10 ;
digit4 = (v / 1000 )% 10 ;
digit5 = (v / 10000 )% 10 ;
digit6 = (v / 100,000 )% 10 ;
digit7 = (v / 1000000 )% 10 ;
digit8 = (v / 10000000 )% 10 ;
// Displays the value of each digit in the display
lc.setDigit ( 0 , 7 , (byte) digit8, false);
lc.setDigit ( 0 , 6 , (byte) digit7, false);
lc.setDigit ( 0 , 5 , (byte) digit6, false);
lc.setDigit ( 0 , 4 , (byte) digit5, false);
lc.setDigit ( 0 , 3 , (byte) digit4, false);
lc.setDigit ( 0 , 2 , (byte) digit3, false);
lc.setDigit ( 0 , 1 , (byte) digit2, false);
lc.setDigit ( 0 , 0 , (byte) digit1, false);
delay ( 00 );
}
void writeArduinoOn7Segment ()
{
// Write Arduino and Cia in the 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 , '0' , false);
lc.setChar ( 0 , i- 8 , 'e' , false);
lc.setChar ( 0 , i- 9 , '0' , 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 counting_regressive ()
{
for ( int x = 8 ; x> -1 ; x–)
{
lc.setDigit ( 0 , x, x + 1 , false);
lc.setChar ( 0 , x + 1 , '0' , false);
delay ( 300 );
}
lc.clearDisplay ( 0 );
}
void separated_numbers ()
{
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 );
}
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.
Muito bom, estou fazendo modificações! Parabéns pelo tópico bem didático!
Valeu Thomé!
Abraço! 🙂
Adilson
bom dia !
muito bom o post de vcs !
gostaria também de colocar outros caracteres, por exemplo, "y" ou "t"; até tentei modificar a lib mas não consegui.
vcs poderiam me ajudar ?
obrigado !
Bom dia!
Essa biblioteca funciona com o ESP8266? O ESP que eu uso é o NODEMCU e gostaria de saber se funciona antes de comprar.
obrigado!
bom dia sou apaixonado por eletro. porem bem leigo mas leio tudo que postam ,e vou aprender progamar arduino pois adoro construir pimbal caseiro essa é a chance de bota para marca ponto ……obrigado por posta conhecimento sou paulo gaspar de itaborai
Oi Paulo!
Muito obrigado! Aguardo a sua visita no Arduino e Cia sempre que possível e se for do seu interesse, assine a nossa newsletter para receber as novidades em primeira mão. 🙂
Abraço!
Adilson
Olá! Arduino e Cia ando pesquisando muito já aprendi algumas coisas com arduíno já não me sinto mais leigo,e sim com noções basica.quero agradecer esse apoio
E se alguém tiver conhecimento de pimbal caseiro ou uma ideia estou aberto a sugestões: ok e o Paulo de Itaborai abraço
Oi Paulo,
Parabéns, nós que agradecemos a sua dedicação! 🙂
E um projeto de pinball seria bem interessante. Vamos estudar isso.
Abraço!
Adilson
Ok Adilson acho que o mundo precisa de mas pessoa como vc q mesme tendo sua vida ainda arruma tempo para ajuda o próximo .
Tô sempre acessando o canal abraço
Oi Paulo!
Muito obrigado. É um prazer compartilhar conhecimento. 🙂
Abraço!
Adilson
Gostaria de saber ate quantos leds de auto brilho acende um arduino.pois tô construindo um pimbal o msm tem bastante leds
Grato desde já
Oi Paulo,
Não vai aguentar muito não. Você vai precisar montar algum circuito auxiliar para alimentação dos leds.
Abraço!
Adilson
Gostaria de saber se com esse programa consigo controlar 2 display sem play 1 e play 2 pois meu pombal como na foto terá 2 placar ..alg alg me ajuda
ola boa tarde, eu estou querendo fazer uma programação para mostrar a temperatura no Módulo display 7 segmentos 8 dígitos com MAX7219 e não estou conseguindo, você poderia me mandar um exemplo?
Estou tentando fazer um controle para leitura em milímetros com duas casas decimais, para adaptar na mesa de uma fresa, , para ter referencias, gostaria de usar o modulo MAX 7219 com display de 7 segmentos e oito dígitos com encoder industrial de 600 pulsos, usando arduino uno, seria possível me darem uma ajuda, já procurei no google mas não encontro, pois as réguas lineares são muito caras.Agradeço a ajuda.
oi! Hoje eu fui fazer esta programação e deu este erro: ‘lc’ was not declared in this scope
e estava referindo ao lc.shutdown(0,false);
o que aconteceu?
Oi Kael,
Esse erro geralmente aparece quando a biblioteca não está instalada. Você baixou do link mostrado no post?
Abraço!
Adilson
Boa tarde pessoal, como faço para contar milésimos de segundo? Grato
Aqui conta milésimos mas atrasa o segundo , nesse caso o segundo está mostrando 1 1/2 segundo ou um pouco mais