Básico - Projeto 65

Cronômetro digital com contagem regressiva e display TM1637 (display com 4 dígitos)

Objetivo

Neste projeto vamos criar um circuito que mostra o funcionamento de um cronômetro com contagem regressiva (temporizador) através da utilização do módulo TM1637 com o Arduino. Utilizando o monitor serial do IDE do Arduino, primeiro definimos o valor inicial do cronometro. Ao pressionarmos um botão (push button), o cronômetro é disparado, mostrando os valores dos segundos e minutos regressivamente. Também utilizaremos um potenciômetro para alterar a intensidade de brilho dos leds do display.

Módulo TM1637 é constituído por 4 displays de 7 segmentos em conjunto (4 dígitos). O módulo TM1637 é de fácil integração com o Arduino, pois sua tensão de alimentação é de 5V e seu controle é feito apenas por 2 conexões com o microcontrolador. Os outros 2 pinos são utilizados para a alimentação do componente. Ideal para projetos com relógio (possui uma identificação central com dois pontos) e contadores que necessitem de um display de fácil visualização.

Observações:

1. Este projeto utilizará uma biblioteca específica para o módulo TM1637 que disponibilizaremos junto com o sketch.

2. Utilizaremos os seguintes comandos da biblioteca: display.encodeDigit(), display.setSegments() e display.setBrightness().

Módulo TM1637 com display 4 dígitos

 

Aplicação

Para fins didáticos e projetos com relógios digitais e equipamentos com contadores.

Componentes necessários

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 830 pontos

Jumpers Kit cabos ligação macho / macho 1  
Módulo TM1637

Módulo TM1637 - 4 dígitos

(anodo comum)

1 Módulo TM1637 com display 4 dígitos - Controlador TM1637
- Alimentação: 3.3 à 5V DC
- Display 7 segmentos 4 dígitos anodo comum

datasheet

Push Button Push button 6X6X5mm 1  
Potenciômetro Potenciômetro 1K 1 Resultado de imagem para potenciômetro

Você poderá experimentar valores diferentes do potenciômetro, entre 1K a 100K

A tensão resultante do potenciômetro aumenta quando giramos o eixo do componente no sentido do polo negativo para o polo positivo.

Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.


Atenção

1. Para a montagem do módulo TM1637 é necessário conhecer a disposição dos seus pinos. Olhando na parte traseira do módulo podemos observar 4 pinos, sendo eles: dois pinos de alimentação (Vcc e GND) e dois pinos de controle/comunicação: CLK (clock) e DIO (dados):

TM1637 - Pinagem

2. A tabela a seguir mostra as conexões do Arduino com o módulo TM1637 do nosso projeto.

Pinos do Arduino Pino do TM1637
2 CLK
3 DIO

 

3) Monte o botão (push button) sem o resistor, pois através da programação vamos habilitar o resistor pull-up interno do arduino. Desta forma, quando o botão estiver pressionado, o Arduino retornará "LOW" ou "0". Veja o projeto Projeto 02b - Led apaga com push button pressionado (pull-up interno do Arduino) ou assista o vídeo Arduino: Botão e Resistor de Pull Up Interno


4) Observe que nesse projeto o potenciômetro foi montado como um divisor de tensão, onde utilizamos os 3 terminais do componente:

Desta forma o potenciômetro funciona como um divisor de tensão que pode ser lido pelo IDE do Arduino. Girando o eixo do polo negativo (GND) para o polo positivo (Vcc) aumentamos o valor, e ao contrário, diminuímos a intensidade do brilho dos leds do display.

5) Veja abaixo como realizamos a montagem do nosso projeto utilizando um protoboard. Observe que utilizamos um display catodo comum e ligamos o pino 3 no GND do Arduino.

Incluindo biblioteca TM1637 no IDE do Arduino

Para criarmos os comandos para o módulo TM1637 é necessário instalarmos uma biblioteca específica para o componente:

Download dos arquivos da biblioteca TM1637

Para saber detalhes desta biblioteca clique aqui.

Instalando a biblioteca pelo IDE do Arduino

Após fazer o download do arquivo TM1637-master.zip com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino.

Para conhecer outras bibliotecas para módulos veja a Tabela Biblioteca para Módulos.

Usando a biblioteca

Neste projeto vamos utilizar apenas duas funções (métodos) da biblioteca TM1637:

Obs.: Para conhecer todas funções da biblioteca TM1637 acesse o link: TM1637 User Guide

a) display.setBrightness(): Este serve para definir o brilho do display, onde o parâmetro de 0 define o brilho mais baixo e 7 para o mais alto.Ex.:

display.setBrightness(7); // brilho mais alto

c) display.setSegments(): Cada um dos quatro dígitos tem 7 segmentos que podem ser endereçados individualmente. Cada segmento é representado por uma letra como mostrado abaixo, que é endereçado por um número, bit ou por uma variável.

// Mostra o valor tempo no display  (minutos e segundos)
   // Zera e cria o array position[] para armazenar os valores do cronômetro
   uint8_t position[] = { 0, 0, 0, 0 };   
   // Calculo individual para posição no display
   position[0] = display.encodeDigit((tempo / 60) / 10); // Dezena de minuto
   position[1] = display.encodeDigit((tempo / 60) % 10); // Unidade de minuto
   position[2] = display.encodeDigit((tempo % 60) / 10); // Dezena de segundo
   position[3] = display.encodeDigit((tempo % 60) % 10); // Unidade de segundo
   // Coloca o separador ":"
   position[1] = position[1] + 128;    
   display.setSegments(position);

C) display.encodeDigit() : Retorna a representação de valores entre 1 e 15 para um dígito (valores hexadecimais). Por exemplo:

Uint8_t data[] = {0x0, 0x0, 0x0, 0x0}; // desliga todos segmentos dos dígitos
data[0]= display.encodeDigit(15);
display.setSegments(data); 

Resultado:

Sketch do projeto

1. Faça o dowload e abra o arquivo projeto65.ino no IDE do Arduino:

Ou se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************
*
*    Projeto 65: Contagem regressiva de tempo com display TM1637 e Arduino
*    Autor: Angelo Luis Ferreira
*    
*             http://squids.com.br/arduino             
*
*******************************************************************************/
#include <TM1637Display.h>
 
TM1637Display display(2,3); // define os pinos 2 com CLK e 3 com DIO

byte pinBut =12;
byte pinPot = A0;

int tempo;
byte ini = 0;
uint32_t temporizador = 0;
 
void setup(){
  pinMode(pinBut, INPUT_PULLUP);
  
  Serial.begin(9600); 
  display.setBrightness(7);
  Serial.print("Digite o tempo inicial em segundos: ");
}
 
void loop() {
  brilho(); // ajusta brilho dos leds do display

// verifica se o botão (pushbutton) está pressionado e muda o controle
  if (!digitalRead(pinBut)) {         
      ini = !ini; // inverte valor da variável ini
      while (!digitalRead(pinBut)) {  }  //esperera soltar o botão
      delay(50);
  }     

// Aguarda digitar tempo em segundos
   if(tempo == 0) {
       ini = 0;
   }
  if (ini==0) {
    // Digitando o valor inicial do cronômetro    
   char s; 
   String n;   
   if(Serial.available()>0){     
      for( int i = 0; i<5; i++){       
         s = Serial.read(); 
         n = n + s; 
      }
    tempo = n.toInt();
    Serial.println(tempo);
    Serial.print("Digite o tempo inicial em segundos: ");
   }
  }

// Ativa o cronometro regressivo
   if (ini == 1) {
    if (millis() - temporizador >= 1000) {
      tempo = tempo - 1;
      temporizador = millis();
    }    
   }

// Mostra o valor tempo no display  (minutos e segundos)
   // Zera e cria o array position[] para armazenar os valores do cronômetro
   uint8_t position[] = { 0, 0, 0, 0 };   
   // Calculo individual para posição no display
   position[0] = display.encodeDigit((tempo / 60) / 10); // Dezena de minuto
   position[1] = display.encodeDigit((tempo / 60) % 10); // Unidade de minuto
   position[2] = display.encodeDigit((tempo % 60) / 10); // Dezena de segundo
   position[3] = display.encodeDigit((tempo % 60) % 10); // Unidade de segundo
   // Coloca o separador ":"
   position[1] = position[1] + 128;    
   display.setSegments(position);
 
  //Mostra o valor inicial no display
  display.setSegments(position);
}

void brilho() {
  // Lê valor do potenciômetro (0 a 1023)
  int valor = analogRead(pinPot);
  // Converte valor do potenciêmtro para valor de 0 a 7
  int potVal = map(valor, 0, 1023, 0, 7);
  // Ajusta o brilho dos leds (segmentos) entre 0 e 7
  display.setBrightness(potVal);
}

ATENÇÃO: Se o display não acender verifique todas as conexões do módulo e do potenciômetro.

Vídeo


Como o projeto deve funcionar

1. Ao iniciar o programa, o display irá exibir o valor 00:00.

2. Acesse o monitor serial do IDE do Arduino.

2. Digite o valor inicial do cronômetro em segundos. Após digitar o valor desejado, tecle "Enter"

3. Observe que o número digitado em segundos irá aparecer no display no formato de minutos e segundos. Por exemplo, se digitarmos 124 iremos ver no display 02:04, ou seja 2 minutos e 4 segundos.

4. Ao clicarmos o botão (push button) iniciamos o cronômetro regressivo a partir do valor digitado, decrementando-se em 1 segundo até atingir zero.

5. Ao clicarmos o botão novamente o cronômetro é interrompido, e ao clicar de novo, o mesmo é reiniciado.

6. Quando o cronômetro chega no zero, ou é interrompido pelo botão, podemos digitar um novo valor no monitor serial.

7. Girando o eixo do potenciômetro, aumentamos ou diminuímos a intensidade dos leds do display.

Desafios

Com base neste projeto, resolva o seguinte desafio:

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Compartilhe:

Doações

Contribua pra manter o site online :)

Inscreva-se no canal Squids

Você está preparado?

Squids Arduino News

Desafio 82 - Projeto 92 Relógio digital com temperatura, umidade e datas Com base no projeto Projeto 92 - Criando um relógio digital com OLED SSD1306, módulo DS3231 e Arduino resolva os seguin...

Básico - Projeto 92 Criando um relógio digital com Oled SSD1306 - bibliotecas Adafruit Objetivo O objetivo neste projeto é criar um relógio digital usando um display OLED junto com o Real Time ...

Desafio 81 - Projeto I09 Controlando 2 motores com driver L9110s (menu via display LCD) Com base no projeto I09 - Motores DC com Driver Ponte H L9110 e Arduino - Controle de 4 velocidades pelo ...

Intermediário - Projeto 09 Motores DC com driver ponte H L9110s e Arduino - 4 velocidades Objetivo Neste tutorial vamos mostrar como controlar a velocidade de 2 motores CC (corrente contínua) a...

Básico - Hub 008 Usar o módulo display 4 dígitos 74HC595   Sugerido por: Tim Santos Objetivo O objetivo é adaptar o  Projeto 63 - Usando o módulo TM1637 (display 4 dígitos) com Arduino e u...

Outros artigos

Mais: Desafios Projetos Básicos Projetos Intermediários Básico

Topo