17 julho 2013

Display 7 segmentos

Hoje vou falar de outro display bastante comum utilizado nos projetos do Arduino : o display de 7 segmentos, como esse abaixo :

Display 7 segmentos FJ5101AH

O display de 7 segmentos, como o próprio nome diz, tem 7 partes, ou segmentos, que podem ser agrupados de modo a formar números e letras.

Display 7 segmentos - letras e numeros

Os segmentos são organizados de A a F :
Display 7 segmentos - Disposição dos segmentos
Imagem : Wikipedia
Assim, se você quiser mostrar o número 1, basta ativar os segmentos B e C. Para mostrar o número 3, os segmentos A, B, C, D e G, e assim por diante.

A ligação ao Arduino usa os pinos de 2 a 9, mais o GND,  na seguinte sequencia :

Pino 2 do Arduino ====> Pino segmento A
Pino 3 do Arduino ====> Pino segmento B
Pino 4 do Arduino ====> Pino segmento C
Pino 5 do Arduino ====> Pino segmento D
Pino 6 do Arduino ====> Pino segmento E
Pino 7 do Arduino ====> Pino segmento F
Pino 8 do Arduino ====> Pino segmento G
Pino 9 do Arduino ====> Pino segmento PONTO
Pino GND do Arduino => Pino 3 do display

Um ponto importante é a utilização dos resistores de 220 ohms para cada pino. Como o display trabalha com 2V, é necessário limitar a corrente, evitando queimar o componente :

Circuito Arduino Display 7 segmentosPara o modelo de display que estou utilizando (FJ5101AH, catodo comum), a disposição dos pinos é mostrada na próxima imagem. Se o seu display for de outro modelo, basta descobrir qual pino corresponde a cada segmento. Isso pode ser feito utilizando-se um multimetro ou até mesmo uma pilha, tomando o cuidado de respeitar a voltagem máxima que comentei acima : 2 volts.

Display catodo comum
Imagem : Parallax
Finalmente o programa, baseado no código desenvolvido pelo site hacktronics. Fiz algumas alterações no mesmo, para que o display mostre não só os números de 0 a 9, mas também as letras de A a F, em ordem crescente :

 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
// Programa : Contador crescente 0 a F
// Modificacoes e comentarios : Arduino e Cia
// Baseado no programa:
// Arduino 7 segment display example software
// http://www.hacktronics.com/Tutorials/arduino-and-7-segment-led.html
// License: http://www.opensource.org/licenses/mit-license.php (Go crazy)
// Define a ordem de ligação dos segmentos, dos digitos 0 a F
// Este padrão é para display de catodo comum
// Para display de anodo comum, modifique os valores de 0 para 1 e 
// de 1 para 0
// 1 = LED ligado, 0 = LED desligado, nessa ordem :
//                   Arduino pinos: 2,3,4,5,6,7,8

byte seven_seg_digits[16][7] = { { 1,1,1,1,1,1,0 },  // = Digito 0
                                 { 0,1,1,0,0,0,0 },  // = Digito 1
                                 { 1,1,0,1,1,0,1 },  // = Digito 2
                                 { 1,1,1,1,0,0,1 },  // = Digito 3
                                 { 0,1,1,0,0,1,1 },  // = Digito 4
                                 { 1,0,1,1,0,1,1 },  // = Digito 5
                                 { 1,0,1,1,1,1,1 },  // = Digito 6
                                 { 1,1,1,0,0,0,0 },  // = Digito 7
                                 { 1,1,1,1,1,1,1 },  // = Digito 8
                                 { 1,1,1,0,0,1,1 },  // = Digito 9
                                 { 1,1,1,0,1,1,1 },  // = Digito A
                                 { 0,0,1,1,1,1,1 },  // = Digito B
                                 { 1,0,0,1,1,1,0 },  // = Digito C
                                 { 0,1,1,1,1,0,1 },  // = Digito D
                                 { 1,0,0,1,1,1,1 },  // = Digito E
                                 { 1,0,0,0,1,1,1 }   // = Digito F
                                 };


void setup() 
{  
  pinMode(2, OUTPUT); //Pino 2 do Arduino ligado ao segmento A  
  pinMode(3, OUTPUT); //Pino 3 do Arduino ligado ao segmento B
  pinMode(4, OUTPUT); //Pino 4 do Arduino ligado ao segmento C
  pinMode(5, OUTPUT); //Pino 5 do Arduino ligado ao segmento D
  pinMode(6, OUTPUT); //Pino 6 do Arduino ligado ao segmento E
  pinMode(7, OUTPUT); //Pino 7 do Arduino ligado ao segmento F
  pinMode(8, OUTPUT); //Pino 8 do Arduino ligado ao segmento G
  pinMode(9, OUTPUT); //Pino 9 do Arduino ligado ao segmento PONTO
  writePonto(0);  // Inicia com o ponto desligado
}

void writePonto(byte dot)   //Funcao que aciona o ponto no display
{  
  digitalWrite(9, dot);
}

void sevenSegWrite(byte digit)  //Funcao que aciona o display
{
  byte pin = 2;

  //Percorre o array ligando os segmentos correspondentes ao digito
  for (byte segCount = 0; segCount < 7; ++segCount)  
  { 
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
    writePonto(1);  //Liga o ponto
    delay(100);   //Aguarda 100 milisegundos
    writePonto(0);  //Desliga o ponto
}

void loop() 
{
  //Contador de 0 a 15, ligando os segmentos correspondentes
  //0 a 9 = liga os segmentos correspondentes aos numeros
  //10 a 15 = Forma as letras A,B,C,D,E,F
  for (byte count = 0; count < 16; count++)
  {
     delay(500);
     sevenSegWrite(count);
  }
  delay(4000);
}

Não encontrei o datasheet específico desse display FJ5101AH.Procurando modelos similares, encontrei as informações abaixo, que podem ser utilizadas como base :

Display 7 Segmentos - Pinagem e dimensões

Display 7 segmentos - Dados técnicos
No próximo artigo vou usar esse mesmo display de 7 segmentos com o Arduino, mas gerenciado por um circuito integrado específico para trabalhar com displays : o Max7219.

Atualizado : Controlando display 7 segmentos com o Max7219

Atualizado : Ligando 2 displays 7 segmentos ao Max7219

Até lá !


20 comentários:

  1. Não precisa de 8 resistores. Basta um no pino 8, indo para o terra

    ResponderExcluir
    Respostas
    1. E qual o valor do resistor? É calculado para o total de sete LEDs ou oito (DP)? Obrigado

      Excluir
    2. Ta errado precisa de 8 resistores sim.

      Excluir
    3. Graças ao valor de queda de tensão dos segmentos, pode ser que a corrente ache somente um caminho para o terra, sendo assim, ligando só um led, pode funcionar msm, mas tem esse risco.

      Excluir
    4. Se colocar apenas um resistor no pino 8 a luminosidade do display vai variar com a quantidade de segmentos acessos. Funciona mas não é a melhor solução.

      Excluir
    5. Boa noite, existe uma solução simplificada que exige apenas um resistor no pino comum. Basta você acender um segmento do display por vez, em um intervalo de tempo curto, logo não haverá diferenciação da intensidade luminosa do display de acordo com o número de segmentos ligados. É questão de prioridade essa solução que lhes apresento consome mais memória de programação e a solução proposta no artigo consome menos memória de programação. Em contrapartida o modelo com um resistor apenas no comum que lhes apresento utiliza menos componentes, simplificação de PCB e tempo de montagem, como informei, depende da prioridade, pois ambas são válidas.

      Excluir
    6. Oi Marcelo!

      Excelente explicação. :)

      Abraço!

      Excluir
  2. Nao funfou no meu...

    ResponderExcluir
    Respostas
    1. Acho que você esqueceu de falar da SevSeg library, não imoprtou no cabeçalho

      Excluir
    2. Boa tarde,

      Esse programa não usa a SevSeg. Criei algumas funções com o nome parecido, mas não dependem da biblioteca.

      Abraço !

      Excluir
  3. Realmente 1 único resistor é suficiente entre a ligação da terra e o pino correspondente
    Rodolfo

    ResponderExcluir
    Respostas
    1. Obrigado pela informação. Abraço !

      Excluir
    2. Verdade, um resistor seria capaz de alimentar o display...porem não esqueça que estamos tratando de protótipos em placa Arduino então todo cuidado é pouco ao utilizar as saídas do Arduino como alimentação.

      Excluir
    3. Verdade, Wellington... :)

      Abraço!

      Excluir
  4. no meu não funcionou ele diz este erro \/

    Arduino: 1.7.7 (Windows 7), Placa:"Arduino Uno"

    sketch_oct16a.ino: In function 'void setup()':

    sketch_oct16a.ino:78:6: error: redefinition of 'void setup()'

    sketch_oct16a.ino:33:6: error: 'void setup()' previously defined here

    sketch_oct16a.ino: In function 'void loop()':

    sketch_oct16a.ino:83:6: error: redefinition of 'void loop()'

    sketch_oct16a.ino:66:6: error: 'void loop()' previously defined here

    Erro compilando.

    Este relatório deveria ter mais informações
    "Mostrar saída verbosa durante a compilação"
    habilitado em Arquivo > Preferências.

    ResponderExcluir
  5. olá , utilizei o tutorial acima para ligar o meu display q retirei d um ar condicionado , porem o display é duplo , tendo 2 gns um para cada lado , ai vem a duvida, como ligar os dois displays , com cada um mostrando letras diferentes...

    ResponderExcluir
  6. Olá, eu preciso fazer um circuito com um display de 7 segmentos em um arduino nano. O nano tem 6 entradas pra PWM, isso quer dizer que eu não consigo fazer essa ligação? Obrigada.

    ResponderExcluir