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:
- 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
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!