30 setembro 2016

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.

Contador com módulo display 4 dígitos 74HC595


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:

Módulo display 4 dígitos 74HC595
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. 

Módulo display 74HC595 - CI


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

Circuito Arduino Módulo display 74HC595


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.

 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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//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. :)

21 comentários:

  1. Era mesmo o que estava faltando testar, obrigado

    ResponderExcluir
  2. Boa tarde,
    Qual o valor máximo de contagem que consegue-se com esse módulo?
    Candido.

    ResponderExcluir
  3. 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

    ResponderExcluir
  4. Parabéns pelo post.
    Você teria um exemplo de como usar esse display com o ESP12 e a IDE do Arduino?

    ResponderExcluir
    Respostas
    1. 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!

      Excluir
  5. 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

    ResponderExcluir
    Respostas
    1. 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!

      Excluir
  6. Otimo artigo, essa biblioteca tem algum controle de luminosidade?

    ResponderExcluir
    Respostas
    1. Olá,

      Infelizmente não... :/

      Abraço e obrigado!

      Excluir
  7. Conseguiria colocar letras e qual parte do skecth troco ?

    Obrigado

    ResponderExcluir
  8. Boa noite!
    Consigo ligar 2 display de 7 segmentoc com 4 digitos cada no mesmo arduino?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Consegue sim.. Preciso testar, mas a princípio não teria nenhum problema.

      Abraço!

      Adilson

      Excluir
    2. necessito colocar 2 módulos, em relação a os pinos de conexão, como ficariam?

      att

      Eng. Thiago de Figueiredo

      Excluir
  9. Entao nao consegui enxergar uma maneira de colocar 2 no mesmo arduino
    At.te
    Tercio

    ResponderExcluir
  10. 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

    ResponderExcluir
  11. Excelente artigo! Como posso conseguir informações (datasheet) a respeito da biblioteca do display para conseguir entender os seus comandos?

    ResponderExcluir
  12. 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!

    ResponderExcluir
    Respostas
    1. Oi Mauricio,

      Excelente, obrigado pela dica. Vamos testar aqui. :)

      Abraço!

      Adilson

      Excluir
  13. 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 ??????

    ResponderExcluir
  14. 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]

    ResponderExcluir