Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto 65 - Cronômetro regressivo com display TM1637 e Arduino
Projeto 65 - Cronômetro regressivo com display TM1637 e Arduino
Angelo Luis Ferreira | 03/09/2019
Acessos: 15.682
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.
Definições
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().

Aplicação
Para fins didáticos e projetos com relógios digitais e equipamentos com contadores.
Componentes necessários
Referência
|
Componente
|
Quantidade
|
Imagem
|
Observação
|
Protoboard |
Protoboard 830 pontos |
1 |
 |
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 |
 |
- 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 |
 |
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):

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
DOWNLOAD - TM1637-master.zip
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 Coletânea de bibliotecas para módulos.
Usando a biblioteca
Neste projeto vamos utilizar as seguints funções (métodos) da biblioteca TM1637:
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
b) 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: DOWNLOAD - projeto65.ino
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: Desafio 52
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários