Contador com módulo display 4 dígitos 74HC595
O módulo display 4 dígitos 74HC595 é um módulo que usa 4 displays de 7 segmentos, onde podemos mostrar números e letras, e que usa apenas 3 pinos para conexão ao microcontrolador.
Neste post vamos usar o módulo 74HC595 para montar um contador com 2 push-buttons, que você pode usar como base para montar seu próprio projeto.
O módulo display 7 segmentos 74HC595
Na imagem abaixo podemos ver o módulo display 4 dígitos com 74HC595, que tem no lado esquerdo 5 pinos de entrada, sendo 3 de controle e 2 de alimentação. No lado oposto, temos os pinos de saída, que permitem que você interligue módulos idênticos:
O controle dos segmentos dos dígitos do display é feito por dois CI´s 74HC595, que são registradores de deslocamento utilizados para expandir as portas do microcontrolador.
Com o 74HC595, você usa 3 pinos de controle para enviar dados para as 8 portas de saída do CI, com a vantagem de poder utilizar vários desses módulos ao mesmo tempo.
Circuito display 4 dígitos com 74HC595
Para ligar o módulo display 4 dígitos 74HC595 ao Arduino e montar o nosso contador, vamos usar os pinos digitais 5, 6 e 7, que serão ligados no módulo nos pinos DIO, RCLK, e SCLK, respectivamente.
Para os botões do contador, vamos usar dois push-buttons ligados ao pino 2 (para aumentar o contador), e ao pino 3 (para diminuir).
Os resistores tem a função de pull-down, e foram usados resistores de 330 ohms.
Programa contador com 74HC595
O programa abaixo utiliza as bibliotecas TM74HC595Display (download) e TimerOne (download). Descompacte a pasta e coloque as bibliotecas na pasta LIBRARIES da IDE do Arduino.
No setup() foram definidos os endereços para os dígitos de 0 a 9 que serão utilizados no programa, e também um pequeno teste com os 4 dígitos, mostrando os números de 1 a 4 no display.
Na seção loop(), são lidos os valores das portas do botões (2 e 3), que quando acionadas aumentam ou diminuem o valor do contador no display.
//Programa: Contador com modulo display 7 digitos 74HC595 //Autor: Arduino e Cia #include <TM74HC595Display.h> #include <TimerOne.h> //Pinos de conexao ao modulo int PINO_SCLK = 7; int PINO_RCLK = 6; int PINO_DIO = 5; //Pinos de conexao push-button int PINO_UP = 2; int PINO_DOWN = 3; int contador = 0; TM74HC595Display disp(PINO_SCLK, PINO_RCLK, PINO_DIO); unsigned char LED_0F[10]; void setup() { //Definicao dos digitos de 0 a 9 LED_0F[0] = 0xC0; //0 LED_0F[1] = 0xF9; //1 LED_0F[2] = 0xA4; //2 LED_0F[3] = 0xB0; //3 LED_0F[4] = 0x99; //4 LED_0F[5] = 0x92; //5 LED_0F[6] = 0x82; //6 LED_0F[7] = 0xF8; //7 LED_0F[8] = 0x80; //8 LED_0F[9] = 0x90; //9 Timer1.initialize(1500); // set a timer of length 1500 Timer1.attachInterrupt(timerIsr); // attach the service routine here //Testes iniciais //Envia o numero 1 para o primeiro digito disp.set(LED_0F[1], 3); delay(1000); //Apaga o display disp.clear(); //Envia o numero 2 para o primeiro digito disp.set(LED_0F[2], 2); delay(1000); disp.clear(); //Envia o numero 3 para o primeiro digito disp.set(LED_0F[3], 1); delay(1000); disp.clear(); //Envia o numero 4 para o primeiro digito disp.set(LED_0F[4], 0); delay(1000); disp.clear(); } void loop() { //Verifica se o botao aumentar contador foi acionado int up = digitalRead(PINO_UP); if (up == 1) { contador++; while (digitalRead(PINO_UP) == 1) { delay(10); } //disp.clear(); } //Verifica se o botao diminuir contador foi acionado int down = digitalRead(PINO_DOWN); if (down == 1) { contador--; while (digitalRead(PINO_DOWN) == 1) { delay(10); } //disp.clear(); } disp.clear(); //Mostra o valor do contador no display disp.digit4(contador); delay(10); } void timerIsr() { disp.timerIsr(); }
Para mostrar o valor da variável contador no display, utilizamos o comando disp.digit4(), que vai ajustando os dígitos de acordo com o valor da variável (ocupando apenas os dígitos necessários no display).
Você também pode utilizar o comando disp.set() para enviar um valor para um dígito específico, ou o comando disp.digit4showZero() para mostrar o 0 nos dígitos à esquerda.
Você pode ver como utilizar esses comandos carregando o programa de exemplo da própria biblioteca TM74HC595Display, que mostra inclusive como usar letras nesse display. 🙂
Era mesmo o que estava faltando testar, obrigado
Valeu Paulo!
Abraço.
Boa tarde,
Qual o valor máximo de contagem que consegue-se com esse módulo?
Candido.
Olá, boa noite.
Com formato de numeração decimal, 10 mil valores podem ser exibidos.
Com o formato de numeração hexadecimal, 65535 valores podem ser exibidos.
Braços.
gostaria de um vídeo mostrando o contador em operação com sensor de passagem.Obrigado, mesmo assim foi muito útil as informações já postas .Nilo
Parabéns pelo post.
Você teria um exemplo de como usar esse display com o ESP12 e a IDE do Arduino?
Oi Vilson,
Obrigado. Ainda não testei nessa configuração. Não sei por exemplo se as bibliotecas funcionariam com o ESP8266. Mas vou tentar fazer isso.
Abraço!
Bom dia,
Estou precisando de um sistema parecido com este, porém mais complexo, para medição de fios, utilizaria um display com 4 dígitos também, porém a forma de captação da distancia medida seria através de um sensor, onde cada pulso captado seria 10cm e desta forma o valor em metros seria passado para o display, terias como me auxiliar nisto?
Abraço
Boa tarde,
Posso desenvolver isso para você. Por favor entre em contato utilizando o formulário de contato no lado direito da página.
Abraço!
Otimo artigo, essa biblioteca tem algum controle de luminosidade?
Olá,
Infelizmente não… :/
Abraço e obrigado!
Conseguiria colocar letras e qual parte do skecth troco ?
Obrigado
Boa noite!
Consigo ligar 2 display de 7 segmentoc com 4 digitos cada no mesmo arduino?
Boa noite,
Consegue sim.. Preciso testar, mas a princípio não teria nenhum problema.
Abraço!
Adilson
necessito colocar 2 módulos, em relação a os pinos de conexão, como ficariam?
att
Eng. Thiago de Figueiredo
Entao nao consegui enxergar uma maneira de colocar 2 no mesmo arduino
At.te
Tercio
Então não consegui enxergar como colocar os dois display para mostras 2 valores diferentes simultaneamente no mesmo arduino. como faço para fazer isso
obrigado
Tercio
Excelente artigo! Como posso conseguir informações (datasheet) a respeito da biblioteca do display para conseguir entender os seus comandos?
Excelente tutorial. Porém o código possui algumas desvantagens:
1. Utiliza o TimerOne, que não é compatível com a família ESP8266
2. O código é relativamente longo, mesmo para uma exibição simples no display.
Como sugestão, recomendo a biblioteca TridentTD_7Segs74HC595.h disponível em https://github.com/TridentTD/TridentTD_7Segs74HC595
Apenas uma inicialização e um comando de exibição e já funciona.
Testei o modulo Display 74HC595 que comprei com vocês em um NodeMCU e funcionou perfeitamente!
abraços!
Oi Mauricio,
Excelente, obrigado pela dica. Vamos testar aqui. 🙂
Abraço!
Adilson
Estou tentando programar para vários módulos ligados em cascata.
O comentário do Mauricio Baum foi ótimo, pois essa biblioteca funciona para até 6 displays em cascata. Super fácil e simples.
O problema é que, se tento ligar mais displays, os displays não aparecem mais nada impresso.
Vi que a biblioteca utiliza o timer1, e talvez exista algum tipo de limitação ou sei lá.
Arduino e Cia, consegue dar um help com isso ?
Valeu!
O meu sketch deu erro na linha: Timer1.attachInterrupt(timerIsr); // attach the service routine here. estou procurando o erro e não consigo localizá-lo …
* ambas as bibliotecas estão instaladas.
MENSAGEM DE ERRO:
no matching function for call to TimerOne :: attachInterrupt ()
Não compila o sketch ??????
POR QUE APARECE UMA MENSAGEM DIZENDO QUE "TIMERISR" NÃO ESTÁ DECLARADO NO SCOPO ???
NA LINHA 36 … SE PUDEREM ME AJUDAR, AGRADEÇO !!!
[email protected]
Amigo. Para usa o TM74HC595 com o sensor ótico e botão de reset função de contator eu uso qual biblioteca? (TM74HC595Display + timeone ou sevseg)
Ola. Como ficaria o código usando um botão reset e um sensor IR?
Bom dia Arduino e Cia,
No anúncio deste display tá informando que é possível ligar vários em cascata.
Eu fiz isso, mas todos ficam com o mesmo número impresso.
Como posso mudar na implementação para que imprimam números diferentes em cada módulo ?
Hello Arduino e Cia
I need connect 3 modules in cascade. How can i print different numbers in each module ?
Thanks for your attention
Hola, tengo el mismo problema.
Tengo que poner 3 modulos en cascada, como puedo imprimir numeros diferentes en cada modulo ?
Muchas gracias por su respuesta
¡Ola Jorge!
No tengo más de una pantalla de estos aquí para probar, pero usted ha experimentado poner simplemente el dígito en el comando disp.set ()? Por ejemplo, el dígito 5, 6, 7, etc …
Saludos!
Adilson
só alterar o programa:
unsigned char LED_0F[10]; // ( aumente a matriz )
LED_0F[0] = 0xC0; //0 (insira os novos caracteres dessa forma )