15 outubro 2013

Contador Display 7 segmentos - 3 dígitos

Quem quer iniciar com o Arduino geralmente fica em dúvida sobre quais componentes comprar. Eu mesmo comprei algumas coisas que não usei até hoje... :-)

Pensando nisso, a FILIPEFLOP , parceira aqui do site, criou kits de componentes com tudo o que você precisa para montar seus primeiros experimentos. O kit básico, por exemplo, vem com o Arduino Uno, sensor ultrasonico, relé, push-button, leds, protoboard, jumpers, display LCD, fonte, potenciômetro, display 7 segmentos...e muito mais. Dê uma olhada nesse link e veja todos os kits disponíveis.

E falando em kit, no último artigo eu abordei o sensor óptico TCRT5000, mostrando o acionamento de um led com a aproximação de um objeto do sensor óptico, e hoje vou usar esse mesmo sensor óptico, mas juntamente com o display 7 segmentos 3 dígitos, que também vem no kit básico, para criar um contador.

O display 7 segmentos - 3 dígitos CPS03631BR é um display de anodo comum com 12 pinos, conforme mostrado no esquema abaixo (6 pinos na parte superior, 5 pinos na parte inferior, o pino 6 não é utilizado), e que você pode conferir no datasheet. São sete pinos para os segmentos A, B, C, D, E, F, G, um pino para o ponto decimal (DP), e um pino para cada dígito :

contador display 7 segmentos

Em um display 7 segmentos de apenas um dígito, é possível deixar o anodo sempre em estado alto, e ir acionando os segmentos conforme a necessidade, formando os  números. Nesse display de 3 dígitos, se eu deixar todos os anodos em estado alto, vou mostrar os mesmo números em todos os dígitos.

Como eu evito isso ? Usando um procedimento chamado multiplexação, que consiste no seguinte : aciono o anodo do dígito 1, e ligo os segmentos desejados, desligo o anodo do digito 1, ligo o anodo do digito 2 e aciono os segmentos desejados, e faço o mesmo procedimento com o digito 3, e depois repito o processo. Desta forma, uso os mesmo pinos do Arduino para a ativação dos segmentos de todos os dígitos. Dê uma olhada nessa animação abaixo, que mostra como isso acontece :

Animação multiplexação display 7 segmentos
Mostrando assim, parece que o display vai "piscar", não é mesmo ? Mas o segredo é fazer isso numa frequencia tão alta que o olho humano nem vai perceber, devido à um fenômeno conhecido como persistência da visão.

Antes de entrar na parte do circuito e do programa, gostaria de fazer um parênteses sobre a parte eletrônica. Eu verifiquei vários tutoriais e artigos diferentes, que mostram displays com 2 ou mais dígitos. Em alguns deles , são usadas resistências para ligar os pinos do Arduino diretamente ao anodo dos dígitos. Outros utilizam transistores, para não sobrecarregar e/ou ultrapassar a corrente máxima suportada pelo Arduino. Eu utilizei apenas um resistor de 1K em cada ligação dos anodos. Também liguei diretamente os pinos do Arduino aos pinos dos segmentos do display. Isso talvez reduza a vida útil do display, então recomendo que, dependendo da aplicação, esse procedimento seja revisto.

Vamos então à lista de materiais que utilizei :
  • 3 resistores de 1 K (um para cada dígito/anodo)
  • 1 resistor de 220 ohms (led IR do sensor óptico)
  • 1 resistor de 10 k (ligado ao sensor óptico - receptor)
  • Display 7 segmentos de 3 dígitos CPS03631BR
  • Sensor óptico reflexivo TCRT5000
Circuito contador com sensor óptico

Achei na internet vários exemplos de códigos usando multiplexação, e até criei um próprio (que não funcionou muito bem, diga-se de passagem), mas no final acabei utilizando a biblioteca SevSeg , que faz todo o serviço pesado : basta definir qual informação você quer mandar para o display (nesse programa exemplo, a varíavel CONTADOR), e a biblioteca faz o resto :

 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
// Programa : Contador utilizando display 7 segmentos e TCRT5000  
// Alterações e adaptações : Arduino e Cia  
//  
// Baseado no exemplo da biblioteca SevSeg, de Dean Reading  
// deanreading@hotmail.com  
   
#include "SevSeg.h" //Carrega a biblioteca SevSeg  
   
SevSeg sevseg;  
   
//Cria variaveis globais  
int contador = 0;  

//Ligado ao pino "coletor" do sensor óptico - Porta A5 ao Arduino  
int pinosensor = 19; 
int leitura; //Armazena o valor lido pelo sensor  
   
void setup() 
{  
  //Utilizando display de anodo comum, pinos dos digitos : 10 a 13  
  //Pino dos segmentos : 2 a 9  
  sevseg.Begin(1,13,10,11,12,2,3,4,5,6,7,8,9);  
  //Controla a luminosidade - 0 a 100  
  sevseg.Brightness(20);  
  //Define o pino do sensor optico como entrada 
  pinMode(pinosensor, INPUT);  
}  
   
void loop() 
{  
  //Produce an output on the display  
  sevseg.PrintOutput();  
  sevseg.NewNum(contador,(byte) 2);

  //Le as informações do pino do sensor  
  leitura = digitalRead(pinosensor);   
  if (leitura != 1) //Verifica se o objeto foi detectado  
  {  
    contador = contador++; //Incrementa o valor do contador  

    //Loop caso o objeto pare sobre o sensor 
    while(digitalRead(pinosensor) != 1)  
    {  
      sevseg.PrintOutput();  
     sevseg.NewNum(contador,(byte) 2);  
    }  
  }   
}  

Se você precisa de um botão de reset para zerar o contador, veja o artigo Contador com botão de reset, aqui mesmo no Arduino e Cia.

Em breve publicarei um vídeo mostrando o funcionamento desse circuito. Até lá !

Atualizado : Contador Display 7 segmentos - Vídeo


81 comentários:

  1. Olá, tenho aqui um display de 4 segmentos, 12 pinos, CAI5416AH, e ainda não o consegui fazer funcionar. Tem algum tuto pra fazer ele acender e poder usar como mostrador?

    ResponderExcluir
    Respostas
    1. Bom dia ! Você pode usar, para teste, o esquema deste artigo mesmo, utilizando o pino 6 para endereçar o 4o. digito. Repare que quando eu coloco as definições do display, sobra um pino no Arduino (pino 13) :

      sevseg.Begin(1,13,10,11,12,2,3,4,5,6,7,8,9);

      Se a pinagem do seu display seguir um certo padrao, basta você ligar o pino 6 do display ao pino 13 do Arduino e fazer os testes. Se não conseguir, volte aqui que eu tento te ajudar. Abraço !

      Excluir
    2. Grato! Estava sem tempo de verificar, baixei o PDF deles, a pinagem é a mesma mas tenho um digito a mais. Todo o resto é igual. Vou tentar e te retornar

      Excluir
    3. Legal ! Agradeço se puder retornar, assim ajudamos todos que tem a mesma dúvida. Obrigado !

      Excluir
  2. Ola tem como substituir o Display 7 segmentos de 3 dígitos CPS03631BR por um de display de lcd 16x2

    ResponderExcluir
    Respostas
    1. Boa tarde Marcos. Tem sim, e acaba ficando mais simples do que esse circuito com display de 7 segmentos. Tente utilizar as informações deste artigo :

      http://www.arduinoecia.com.br/2013/03/display-lcd-winstar-wh1602a.html

      No caso, você teria que enviar para a tela as informações da variável CONTADOR.

      Se precisar de ajuda, entre em contato. Abraço !

      Excluir
    2. Boa tarde!
      Preciso de ajuda não consegui

      Excluir
    3. Oi Marcos !

      Vamos lá. O que você tem aí ? Que tipo de Arduino e que tipo de display ?

      Excluir
  3. Respostas
    1. Blz. Você chegou a montar o circuito com o LCD ?

      Excluir
    2. A do lcd sim ja mandei ate um texto esta ok

      Excluir
    3. Legal. Agora faça o seguinte. Adicione o sensor óptico, ligando à porta A5, como foi feito neste tutorial. Depois, use esse código aqui :

      // Programa : Teste de Display LCD 16 x 2
      // Alteração / revisão : Arduino & Cia

      #include //Carrega a biblioteca LiquidCrystal

      //Define os pinos que serão utilizados para ligação ao display
      LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
      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

      void setup() {
      //Define o número de colunas e linhas do LCD:
      lcd.begin(16, 2);
      //Envia o texto entre aspas para o LCD :
      lcd.setCursor(0,0);
      lcd.print("Contador : ");
      pinMode(pinosensor, INPUT); //Define o pino do sensor optico como entrada
      }

      void loop() {
      //Produce an output on the display
      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
      {
      lcd.setCursor(11,0);
      lcd.print(contador);

      }
      }
      }

      O código está um pouco bagunçado, porque nada mais é do que uma mistura do código usado para mandar caracteres para o display LCD 16 x 2, e o código desse artigo, usando o sensor óptico.

      Depois me fale se funcionou.

      Abraço !

      Excluir
    4. Ola não deu setor o contador fica parado comprei ate outro sensor deu na mesma nao conta, fiz ate o outro projeto seu este e tembem nao deu serto Sensor óptico reflexivo TCRT5000 sera que estou fazendo algo errado

      Excluir
    5. Oi Marcos, você está usando o resistor de 10 K no receptor do TCRT5000 ? Pergunto isso porque quando eu montei o projeto e usei um resistor de menor valor, o receptor não foi acionado. Abraço.

      Excluir
  4. estou usando o de 10k no receptor e no transmissor 220 homs

    ResponderExcluir
    Respostas
    1. Entendi, está correto. Isso parece ser algum problema de conexão dos componentes. Você já verificou com uma câmera digital ou mesmo com o celular se o led infravermelho do sensor está acendendo ?

      Excluir
  5. Sim esta aceso e foi a primeira coisa que fiz

    ResponderExcluir
  6. Ola!
    Troquei o resistor transmissor 220 homs para 560 homs e deu serto

    ResponderExcluir
    Respostas
    1. Oi Marcos. Legal, bom saber. No meu funcionou com um de 220 ohms mesmo, eu até refiz o circuito pra testar. Abraço.

      Excluir
  7. no código como faço para contar ate 100 e zera e começa a conta de novo ate 100

    ResponderExcluir
    Respostas
    1. Abaixo desta linha :

      contador = contador++; //Incrementa o valor do contador

      Coloque :

      if (contador == 101)
      {
      contador = 0;
      }

      Abraço !

      Excluir
  8. Se no lugar do sensor eu colocasse um potenciometro a forma de ligação seria a mesma ?

    Grata,
    Iohanna

    ResponderExcluir
    Respostas
    1. Bom dia Iohanna. Não, se você fosse ligar um potenciometro, uma das extremidades iria no positivo, a outra no negativo, e o pino do meio seria o pino de sinal, ligado ao Arduino. Também seriam necessárias algumas alterações no código, mas seria perfeitamente possível. Abraço !

      Excluir
    2. Ah sim, muito obrigada. Mas ainda estou com dúvida no código poderia me ajudar ?

      Excluir
    3. Posso sim, apenas me conte o que você tem aí. É um display de 3 dígitos também ? E que tipo de informação você precisaria ter no display ? Abraço.

      Excluir
  9. Eu tenho um display de 4 dígitos, inicialmente fiz um trabalho onde a entrada captava as batidas do coração e mostrava o led piscando, a ideia era jogar essa frequencia de batimentos em um display. Tive problemas de mal contato na minha entrada do sensor, e fui orientada a apenas simular esse projeto com um potenciômetro. Porém estou com muita dúvida nessa parte. E também nao entendi a biblioteca "SevSeg sevseg" , pois o programa nao roda, é um pacote extra ? Aagradeço desde já a atenção. Abraços

    ResponderExcluir
    Respostas
    1. Boa noite Iohanna,

      Acho que entendi o seu projeto. O potenciômetro vai ser o "coração", e você vai mostrar os batimentos dele no display. Podemos limitar os batimentos de 60 a 180, por exemplo, para não "matarmos" o paciente. rs. O que acha ?

      O SevSeg é uma biblioteca que você tem que baixar e colocar na pasta libraries do Arduino. Você pode baixar a biblioteca nesse link :

      https://docs.google.com/file/d/0Bwrp4uluZCpNdE9oWTY0M3BncTA/edit?usp=sharing

      Vamos nos falando.

      Abraço !

      Excluir
  10. Boa tarde amigo !
    você teria um codigo com esquema para fazer um contador de 0 a 1000 com botões de avanço e regresso ?
    obrigado !

    ResponderExcluir
    Respostas
    1. Boa tarde !

      Eu ainda não tenho, mas daria um bom post. 8-)

      Qual esquema você estava pensando ? A cada toque no botão ele acrescenta (ou diminui) 1 do contador ? Ou por tempo ?

      Abraço.

      Excluir
  11. Olá, bom dia.
    Antes de mais nada, parabéns pelo site, é uma referência, sem dúvidas!
    Eu pretendo usar esse circuito para montar um contador em um esteira (um projeto de faculdade), e está complicado de encontrar o display de 3 dígitos usado no projeto. Vi que há a possibilidade de usar um display de 4 dígitos com driver MAX 7219, usando os pinos 10, 11 e 12 do Arduino. Minha dúvida é, a ligação do sensor seria a mesma? Pelo que vi, a ligação seria mais simples, mas sou leigo no assunto. Desde já, meu muito obrigado!

    ResponderExcluir
    Respostas
    1. Obrigado Fernando !

      Sim, com o Max7219 você vai usar apenas 3 pinos do Arduino, e os outros ficarão livres para você colocar o tipo de sensor que precisar. A propósito, no seu projeto você também vai utilizar sensor óptico ?

      Abraço !

      Excluir
    2. Olá Pessoal, bom dia.
      Sim, sim, vamos usar sensor ótico. O projeto é praticamente igual a este, mudando apenas o tipo de display. E mais uma vez, obrigado!

      Excluir
  12. Oláa boa noite
    Como fazer para um display de 7 segmentos de um digito ?

    ResponderExcluir
    Respostas
    1. Boa noite João,

      Utilize apenas o pino 10, que é o pino do primeiro segmento, e altere o contador para que ele não passe de 9.

      Abraço !

      Excluir
    2. Ola, estou com mesma duvida do Joao, porem eu tentei e nao consegui . Voce poderia me explicar um pouco mais, como seria a ligaçao, qual seria o pino digito e qual seria os segmentos, se possivel uma foto ou uma montagem.

      Excluir
    3. Boa tarde,

      Você vai usar o mesmo circuito desse post ou está usando junto com o Max7219 ?

      Abraço.

      Excluir
  13. Boas , Obrigado , e o material para usar e o mesmo que esta no diagrama certo ?

    ResponderExcluir
    Respostas
    1. Bom dia João,

      Isso, você pode montar da mesma maneira, apenas utilizando o display de 1 dígito.

      Abraço.

      Excluir
  14. Boas novamente , tipo o sensor que eu tenho é PIRSEN8630 - PIR Module, dá para substituir no lugar do sensor optico ?
    Cumprimentos

    ResponderExcluir
    Respostas
    1. Oi João,

      Pode usar sim, e provavelmente você não vai precisar usar esses dois resistores que estão ligados ao sensor óptico. No seu caso, ligue o módulo PIR direto na porta do Arduino.

      Abraço.

      Excluir
  15. Olá, gostaria de saber como faço para ao invés de utilizar um sensor óptico, utilizar um receptor e emissor de infravermelho e com um lcd 16x2, que quando o feixe fosse interrompido e ele contaria mais um e que pudesse ser resetado

    ResponderExcluir
    Respostas
    1. Boa tarde Talles,

      Com um receptor e emissor IR a ligação será praticamente a mesma, pq o TCRT5000 é montado com esses dois componentes. Minha sugestão é que você utilize um push-button e um IF simples dentro do programa para resetar o contador.

      Abraço !

      Excluir
    2. Poderia me ajudar no código e na inserção deste botão reset?

      Excluir
    3. Bom dia Talles,

      Vou tentar arrumar um display e testar por aqui, mas acho que não tem muito segredo inserir isso no programa.

      Abraço.

      Excluir
    4. Boa tarde, parabens pela iniciativa, sra que me pode ajudar e em vez de ter o lcd como a talles leal pede, ter um display de 7 segmentos e 3 digitos e um botão reset?

      Excluir
    5. Bom dia Frederico,

      Estou preparando um post com contador e botão de reset.

      Abraço !

      Excluir
    6. Bom dia !

      Saiu o post sobre o contador com botão de reset :

      http://www.arduinoecia.com.br/2015/01/contador-lcd-display-7-segmentos-reset.html

      Abraço !

      Excluir
  16. Como seria a programação se eu colocasse 3 sensores com um display de 7 segmentos de 3 digitos, isto é, cada digito iria funcionar de acordo com cada sensor, ficou confuso do jeito que eu falei? kk tipo , os digitos do display de 7 seg iriam funcionar cada um por si de acordo com cada respectivo sensor

    ResponderExcluir
    Respostas
    1. Boa noite Matheus !

      Acho que eu entendi. rs. Vou ver se arrumo 3 sensores para testar isso.

      No caso, seria um contador só de 0 a 9 (para cada digito) ?

      Abraço !

      Excluir
  17. Olá, estou tentando fazer o mesmo exemplo, porem sem o uso do sensor, quero fazer um contador de segundos, só que usando esse exemplo o display fica piscando e os números não aparecem completos. Precis de ajuda.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Tente fazer um exemplo mais simples para testar o display, apenas enviando algum dado para o display com o comando

      sevseg.NewNum(numero,(byte) 2);

      Talvez o problema de piscar seja algum delay interferindo no programa.

      Abraço !

      Excluir
  18. Olá pessoal. Estou fazendo redundancia utilizando I2C, mas o I2C só transfere um dado por vez, então preciso multiplexar os dados para enviar. Alguém sabe como posso fazer essa multiplexação?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Não sei que tipo de sensor você vai usar, mas talvez vc precise de alguma solução via hardware, como essa:

      http://www.netopyaplanet.com/article.php?id=6

      Abraço !

      Excluir
  19. Saudações! Primeiramente, obrigado por esta postagem;
    Gostaria de saber se, dentro da sua disponibilidade, você poderia esclarecer alguma coisa sobre esse Display alfanumérico como, por exemplo, fazer um relógio com HH; MM; e SS;
    aqui: http://www.ebay.com/itm/Arduino-Kit-9-digit-16-Segment-Alphanumeric-LCD-LED-Display-UNO-MEGA2560-AVR-ARM-/271288114482/?_ul=BR - Muito obrigado

    ResponderExcluir
    Respostas
    1. Boa noite,

      Obrigado. Esse display é bem diferente dos que eu tenho aqui (esse que você mostrou é controlado pela interface SPI), e eu precisaria de um para fazer testes e dizer algo com mais certeza.

      Pode ser um bom assunto para um post futuro, vou tentar arrumar um display desses. :-)

      Abraço !

      Excluir
    2. Ok amigo! Se precisar, eu tenho um código (sketch) desse Display; o driver que ele usa é o HT1621B; Fico na espera de uma postagem sobre o mesmo; muito obrigado.

      Excluir
    3. Valeu pela dica. Vou procurar o display. Abraço !

      Excluir
  20. ola boa tarde!

    Eu precisava fazer um relogio/ cronometro. no qual o relogio marcasse horas minutos e segundos e que fosse regulado por botoes pushbottons, e formato am/pm. e no mesmo circuito um cronometro do qual teria 2 botoes , o 1° com a funcao de iniciar / parar e o 2° com a funcao de zerar. fora isso teria a opcao de memorizar o valor cronometrado, e ver o que ha memorizado, tem como faezr isso?


    me ajude por favor. abracos

    ResponderExcluir
    Respostas
    1. Oi Lucimar,

      Tem sim, mas no momento não tenho nenhum projeto pronto com relação à isso.

      Abraço!

      Excluir
  21. boa noite, queria usar esse seu projeto com ldr ,at mega 328 e display de 1 digito ou dois display, posso usar esse mesmo projeto?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Pode sim, você vai usar o ATMEGA e os componentes adicionais, como cristal e capacitores ?

      Abraço!

      Excluir
  22. boa noite eu sou iniciante e queria aprender como fazer um contador com um display de 7 segmentos e um botão, ele funciona da seguinte forma a cada vez que eu aperto o botão mostra o numero 1 e depois q aperto novamente aparece o numero dois até o nove sabe me explicar como fica a programação do botão?

    ResponderExcluir
  23. Oi pessoal vi o código mais não consigo compilar ,me da um erro na biblioteca seveseg de não especificada,gostaria de saber se para o códigos funcionarem basta colocar essa biblioteca na pasta libraries ou tenho q fazer outras coisas
    Obrigado

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Basta colocar a biblioteca na pasta libraries e reiniciar a IDE.

      Abraço!

      Excluir
  24. Oi amigos, estou com problemas na compilação do código, pois ele me acusa um erro de does not name a type

    ResponderExcluir
  25. Não funcionou no meu arduino Nano....

    ResponderExcluir
  26. Boa noite, você tem algum programa para contar de 0 a 9 num sete seguimento e com um botao incrementar e com outro decrementar? Sou iniciante e não estou conseguindo. Desde já obrigado

    ResponderExcluir
    Respostas
    1. Oi Emerson,

      Ainda não tenho... é para algum projeto específico ?

      Abraço!

      Excluir
  27. Respostas
    1. Oi Emerson,

      Entendi. Realmente não tenho nada ainda, mas posso desenvolver um projeto e um programa. Se houver interesse, por favor entre em contato utilizando o formulário de contato no lado direito da página.

      Abraço!

      Excluir
  28. Gostaria de Saber se tem como Fazer o sensor IR manda a quantidade de tempo q levou para uma pessoa passa por ele por exemplo. e mandar este tempo para um banco de dados

    ResponderExcluir
  29. a dando esse erro
    "no matching function for call to 'SevSeg::Begin(int, int, int, int, int, int, int, int, int, int, int, int, int)'"

    oq pode ser ?

    ResponderExcluir
    Respostas
    1. Oi João,

      Me parece algum erro de sintaxe no programa.. Você copiou o programa deste post ?

      Abraço!

      Excluir
  30. qual a pinagem do arduino que liga em qual puino do display??
    ex pino 1 arduino pino 3 display??

    ResponderExcluir
    Respostas
    1. Oi Rodrigo,

      Aí vai variar de display para display. Não tem uma pinagem padrão. Recomendo que vc teste com um multimetro para ver qual pino do display corresponde a qual segmento.

      Abraço!

      Excluir
  31. qual pino do display que vc usou ligou em qual pino do arduino
    Display CPS03631BR

    ResponderExcluir
  32. vc pode passar qual é a pinagem do display e em qual portas usadas nesse programa

    ResponderExcluir
  33. não deu certo aqui, não aparece os numeros corretos, sem saber que pino do arduino vc usou pra ligar em qual pino do display fica dificil vai ser muitas as combinações.

    ResponderExcluir
  34. Eu to ligando
    pino do Arduíno

    pino 2 Display 1
    pino 3 Display 2
    Pino 4 Display 3

    13 A
    12 B
    11 C
    10 D
    9 E
    8 F
    7 G
    6 .

    ResponderExcluir