Como usar display 7 segmentos com Arduino
Hoje vou falar de outro display bastante comum utilizado nos mais variados projetos, mostrando como usar um display 7 segmentos com Arduino, como esse da imagem abaixo:
O display de 7 segmentos, como o próprio nome diz, tem 7 partes, ou segmentos geralmente construidos com tecnologia LED, que podem ser agrupados de modo a formar números e letras.
Os segmentos são organizados de A a F:
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.
Conexão Display 7 segmentos com Arduino
A ligação ao Arduino Uno que vamos usar será com os pinos digitais de 2 a 9, mais o GND, na seguinte sequência:
Pino Arduino | Pino Display |
2 | Pino Segmento A |
3 | Pino Segmento B |
4 | Pino Segmento C |
5 | Pino Segmento D |
6 | Pino Segmento E |
7 | Pino Segmento F |
8 | Pino Segmento g |
9 | Pino Segmento PONTO |
GND | Pino 3 do Display (GND) |
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:
Para 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.
Programa Contador crescente
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:
// 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:
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
Gostou? Confira outros posts usando displays 7 segmentos aqui mesmo no Arduino e Cia!
Não precisa de 8 resistores. Basta um no pino 8, indo para o terra
E qual o valor do resistor? É calculado para o total de sete LEDs ou oito (DP)? Obrigado
Ta errado precisa de 8 resistores sim.
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.
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.
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.
Oi Marcelo!
Excelente explicação. 🙂
Abraço!
Com oito resistores temos uma equalização do brilho do mostrador para qualquer número .
Nao funfou no meu…
Boa noite,
O que aconteceu ?
Acho que você esqueceu de falar da SevSeg library, não imoprtou no cabeçalho
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 !
Realmente 1 único resistor é suficiente entre a ligação da terra e o pino correspondente
Rodolfo
Obrigado pela informação. Abraço !
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.
Verdade, Wellington… 🙂
Abraço!
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.
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…
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.
MARAVILHA!!! OBRIGADO!!1
Valeu Daniel. Abraço! 🙂
poderia adcionar um botao para contagem crescente ??
Oi Eduardo,
É possível sim… Dë ua procurada em outros tutoriais sobre Display 7 segmentos (e contador) aqui no blog. Deve ter o que vc precisa…
abraço!
Adilson
Com um único resistor de 220R ma minha simulação funcionou muito bem. Talvez um pouco menos brilhoso, mas é só calcular para que um resistor de um brilho melhor. Obrigado a Arduino e Cia.
Legal Henry!
Obrigado. Abraço!
Adilson
funciona no tinkercad?
Funciona. 🙂
Adilson