Hardware
O display de quatro dígitos simplifica as ligações entre os módulos, já que os segmentos estão interligados internamente. O Arduino utilizado é um Nano, que pode ser colocado diretamente na protoboard. Embora seja possível (e até preferível do ponto de vista de desempenho) usar a interface SPI do ATmega, nesta montagem liguei o MAX7219 a três saídas digitais quaisquer e gerei "na mão" os sinais de comunicação (com uma pequena ajuda da biblioteca do Arduino).
O circuito possui somente três componentes discretos: o resistor que define a corrente nos segmentos e dois capacitores. A finalidade destes capacitores é filtrar as interferências geradas na alimentação pelo liga/desliga dos LEDs.
Software
O software é bastante simples mas ilustra o básico do uso do MAX7219 no comando de displays de 7 segmentos.
// Conecões ao MAX7219
#define PIN_LOAD 6
#define PIN_DIN 5
#define PIN_CLK 4
#define LED 13
// Registradores do MAX7219
#define MAX7219_NOP 0x00
#define MAX7219_DIG0 0x01
#define MAX7219_DIG1 0x02
#define MAX7219_DIG2 0x03
#define MAX7219_DIG3 0x04
#define MAX7219_DIG4 0x05
#define MAX7219_DIG5 0x06
#define MAX7219_DIG6 0x07
#define MAX7219_DIG7 0x08
#define MAX7219_MODE 0x09
#define MAX7219_INT 0x0A
#define MAX7219_LIM 0x0B
#define MAX7219_SHUT 0x0C
#define MAX7219_TEST 0x0F
// CONEXOES DOS LEDS
#define DIG1 MAX7219_DIG0
#define DIG2 MAX7219_DIG1
#define DIG3 MAX7219_DIG2
#define DIG4 MAX7219_DIG3
uint8_t cont [4];
// Iniciação
void setup ()
{
pinMode (LED, OUTPUT);
pinMode (PIN_LOAD, OUTPUT);
pinMode (PIN_DIN, OUTPUT);
pinMode (PIN_CLK, OUTPUT);
digitalWrite (PIN_LOAD, HIGH);
digitalWrite (PIN_CLK, LOW);
digitalWrite (PIN_DIN, LOW);
write7219 (MAX7219_SHUT, 0x00);
write7219 (MAX7219_TEST, 0x00);
write7219 (MAX7219_MODE, 0x0F);
write7219 (MAX7219_INT, 0x0F);
write7219 (MAX7219_LIM, 0x03);
write7219 (DIG1, 12); // H
write7219 (DIG2, 11); // E
write7219 (DIG3, 13); // L
write7219 (DIG4, 14); // P
write7219 (MAX7219_SHUT, 0x01);
delay (2000);
for (int i = 0; i < 4; i++)
cont[i] = 0;
}
// Loop Principal
void loop ()
{
// Mostra o contador atual
write7219 (DIG1, cont[0]);
write7219 (DIG2, cont[1]);
write7219 (DIG3, cont[2]);
write7219 (DIG4, cont[3]);
// Soma 1 no contador
for (int i = 3; i >= 0; i--)
{
if (cont[i] < 9)
{
cont[i]++;
break;
}
cont[i] = 0;
}
delay (100);
}
// Escreve um dado no registrador addr do MAX7219
void write7219 (uint8_t addr, uint8_t data)
{
digitalWrite (PIN_LOAD, LOW);
shiftOut (PIN_DIN, PIN_CLK, MSBFIRST, addr);
shiftOut (PIN_DIN, PIN_CLK, MSBFIRST, data);
digitalWrite (PIN_LOAD, HIGH);
}
ResultadoO vídeo abaixo mostra a montagem funcionando.


12 comentários:
DEMAIS! E se eu quisesse que aparecesse o valor de uma leitura de um pino analógica (A0) como eu colocaria no código?
Outra coisa que não aparece no código é a biblioteca, sabe me informar qual é?
A biblioteca é a que está automaticamente disponível para os programas do Arduino (no caso pinMode, digitalWrite, delay e shiftOut). Para mostrar a leitura do A0 você precisaria substituir o código em loop(). Primeiro você faz a leitura e depois coloca cada dígito no seu lugar:
void loop()
{
int x = analogRead(A0);
write7219 (DIG1, x/1000);
write7219 (DIG2, (x / 100) % 10);
write7219 (DIG3, (x / 10) % 10);
write7219 (DIG4, x % 10);
delay(100);
}
Obs: não testei o código acima!
Obrigado =D
Fica bem mais simplificado que ligar diretamente no arduino o display sem o driver!
Ola.
Sera que vc pode me ajudar, meu display provavelmente tem a disposição dos pinos diferente do seu. Quando executo o codigo, os numeros aparecem todos 'embaralhados' e nao consigo fazer uma combinação que funcione corretamente. Meu display nao tem identificação e por isso nao sei exatamente qual eh o seu datasheet. Provavelmente é esse: http://html.alldatasheet.com/html-pdf/683804/FORYARD/FYQ-2841BX-20/912/3/FYQ-2841BX-20.html
O 2841B.
Como altero a combinação dos pinos entre o MAX7219 e o display para que funcione exibindo os digitos corretamente ? Nao consigo entender como é feita essa combinação.
Valeu
Luiz, a combinação dos pinos é feita pelos fios interligando os dois. Dê uma olhada na primeira parte desta série (http://dqsoft.blogspot.com.br/2014/04/max7219-display-driver-introducao.html). O MAX7219, no modo 7 segmentos, requer um display do tipo catodo comum. O 2841B é anodo comum, neste caso não dá para usar o modo 7 segmentos. Dá para usar como se fossem LEDs discretos, mas é mais complicado. O jeito mais fácil de conferir a pinagem do display é fazer testes ligando os pinos a 5V através de um resistor de 1K (isto é fácil de fazer na protoboard).
Alguem um projeto de um Placar Simples de dois times? Com acréscimo e decréscimo de pontos?
se eu quizer colocar um botão pra fazer a contagem e outro pra zerar, como eu faria?
Basta ligar os botões a entradas digitais, usar digitalRead para testar se um dos botões está apertado e tratar adequadamente.
Obrigado "Daniel Quadros" Testei aqui e Deu Certo!
copiei o projeto exatamente igual e não funcionou, o display ficou maluco.
SuB, provavelmente o seu display tem uma pinagem diferente do que eu usei. O display precisa ser do tipo catodo comum, veja na parte 1 qual pino do 7219 corresponde a qual dígito e qual segmento. Por exemplo, o pino 2 do 7219 precisa ser ligado ao catodo comum do primeiro dígito do display e o pino 14 do 7219 ao segmento A dos displays.
Postar um comentário