Contador com display 7 segmentos 3 dígitos

Contador display 7 segmentos 3 digitos

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 para montar um contador com display 7 segmentos.

O display 7 segmentos 3 dígitos CPS03631BR que estamos usando é 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).

Estrutura do display 7 segmentos 3 dígitos

Você confere a pinagem do display e maiores informações 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:

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.

Multiplexação com display 7 segmentos

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 na animação abaixo, que mostra como isso acontece:

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 uma observação 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.

Conexão do display no Arduino

Para conexão do display no Arduino Uno, usamos o seguinte material:

Os componentes devem ser ligados como mostrado na imagem abaixo. A alimentação do circuito é feita por meio do pino 5V do Arduino:

A ligação é simples mas requer atenção para não inverter nenhum pino.

Programa contador com display 7 segmentos

Encontrei 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.

Vamos instalar essa biblioteca a partir da IDE do Arduino: acesse o menu Sketch => Incluir Biblioteca => Gerenciar Bibliotecas.

Dentro do Gerenciador de Bibliotecas, procure por SevSeg e clique em instalar, conforme a imagem abaixo:

Dúvidas na instalação da biblioteca? Confira o post Como instalar uma biblioteca na IDE Arduino.

Com a biblioteca instalada, carregue o programa abaixo no Arduino. O que ele faz é checar o status da porta analógica A5, onde está conectado o sensor óptico TCRT5000, e caso o estado da porta mude ele incrementa o contador.

//Programa: Contador utilizando display 7 segmentos e TCRT5000
//Autor: Arduino e Cia

//Carrega a biblioteca SevSeg
#include <SevSeg.h>

SevSeg sevseg;

//Definicoes do display 7 segmentos
byte numDigits = 3;
byte digitPins[] = {2, 3, 4};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool resistorsOnSegments = false; // 'false' se os resistores estiverem ligados nos pinos de digito
byte hardwareConfig = COMMON_ANODE; //Tipo de display - Anodo Comum
bool updateWithDelays = false;
bool leadingZeros = false; //Use 'true' se voce desejar completar o display com zeros
bool disableDecPoint = false; // Use 'true' se o ponto decimal nao existir ou nao for usado

//Armazena o valor do contador
int contador = 0;

//Ligado ao pino "coletor" do sensor óptico - Porta A5 ao Arduino
int pinosensor = A5;

//Armazena o valor lido pelo sensor (0 ou 1)
int leitura;

void setup()
{
  Serial.begin(9600);

  //Inicializa o display com as definicoes anteriores
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
               updateWithDelays, leadingZeros, disableDecPoint);

  //Controla a luminosidade - 0 a 100
  sevseg.setBrightness(90);

  //Define o pino do sensor optico como entrada
  pinMode(pinosensor, INPUT);
}

void loop()
{
  //Le as informações do pino do sensor
  leitura = digitalRead(pinosensor);

  //Verifica se o objeto foi detectado
  if (leitura != 1)
  {
    //Incrementa o valor do contador
    contador++;
    Serial.print("Contador: ");
    Serial.println(contador);

    //Loop caso o objeto pare sobre o sensor
    while (digitalRead(pinosensor) != 1)
    {
      delay(50);
    }
  }

  //Atualiza as informacoes no display
  sevseg.setNumber(contador, 0);
  sevseg.refreshDisplay(); // Must run repeatedly
}

Nas linhas 10 a 17 temos as definições do display, como a quantidade de dígitos, o tipo do display, se vamos usar ou não o ponto decimal, etc. Você pode alterar esses parâmetros para usar por exemplo displays de 7 segmentos de 2 ou 4 dígitos.

Finalmente, no vídeo abaixo você confere o projeto em funcionamento:


Se você precisar de um botão de reset para zerar o contador, veja também o post Contador com botão de reset.

Gostou? Confira outros posts usando display 7 segmentos aqui mesmo no Arduino e Cia!

5/5 - (1 voto)

Related posts

Dicas iniciais Arduino e Cia

by Arduino e Cia
12 anos ago

Display LCD 16×2 Arduino HD44780

by Arduino e Cia
11 anos ago

Gravador USBasp AVR com ATMega328P

by Arduino e Cia
11 anos ago
Sair da versão mobile