Básico - Projeto 64
Cronômetro digital com display TM1637 (display com 4 dígitos)
Objetivo
Neste projeto vamos criar um circuito que mostra o funcionamento de um cronômetro através da utilização do módulo TM1637 com o Arduino. Ao pressionarmos um botão (push button), o cronômetro é disparado, mostrando os valores dos segundos e minutos. 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 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 bit ou por uma variável:
// Para configurações personalizadas junto ao display de 7 segmentos
// utiliza-se o seguinte esquema, no qual cada letra representa um segmento:
// - A
// | | F B
// - G
// | | E C
// - D
// Anagrama SASA (S -Squids e A - Arduino) - usando a biblioteca TM167
// tipo uint8_t - tipo de dado requisitado pela biblioteca
const uint8_t SASA[] = {
SEG_A | SEG_F | SEG_G | SEG_C | SEG_D, // S
SEG_A | SEG_F | SEG_B | SEG_G | SEG_C | SEG_C | SEG_E | SEG_DP, // A:
SEG_A | SEG_F | SEG_G | SEG_C | SEG_D, // S
SEG_A | SEG_F | SEG_B | SEG_G | SEG_C | SEG_C | SEG_E, // A
};
// Imprime o anagrama SASA no display
display.setSegments(SASA);
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 projeto64.ino no IDE do Arduino: DOWNLOAD - projeto64.ino
Ou se preferir, copie e cole o código abaixo no IDE do Arduino:
/*******************************************************************************
*
* Projeto 64: Cronômetro com display TM1637 e Arduino
* Referência: Usina info
* Adaptado por: Angelo Luis Ferreira
*
* http://squids.com.br/arduino
*
*******************************************************************************/
#include <TM1637Display.h> // Inclui a biblioteca TM1637Display
const byte CLK = 2; // Define pino 2 como CLK
const byte DIO = 3; // Define pino 3 como DIO
const byte pinBut = 12; // Define a porta digital 12 para o push button
const byte pinPot = A0; // Define a porta analógica A0 para o potenciômetro
byte ini = 0;
uint32_t temporizador = 0;
uint32_t timer = 0;
uint32_t t = 0;
// Para configurações personalizadas junto ao display de 7 segmentos
// utiliza-se o seguinte esquema, no qual cada letra representa um segmento:
// - A
// | | F B
// - G
// | | E C
// - D
// Anagrama SASA (S -Squids e A - Arduino) - usando a biblioteca TM167
// tipo uint8_t - tipo de dado requisitado pela biblioteca
const uint8_t SASA[] = {
SEG_A | SEG_F | SEG_G | SEG_C | SEG_D, // S
SEG_A | SEG_F | SEG_B | SEG_G | SEG_C | SEG_C | SEG_E | SEG_DP, // A:
SEG_A | SEG_F | SEG_G | SEG_C | SEG_D, // S
SEG_A | SEG_F | SEG_B | SEG_G | SEG_C | SEG_C | SEG_E, // A
};
// Cria o objeto "display" da biblioteca TM1637
TM1637Display display(CLK, DIO);
void setup() {
pinMode(pinBut, INPUT_PULLUP); // Habilita o pull up interno do Arduino
pinMode(pinPot, INPUT); // Define pin potenciômetro com entrada do Arduino
}
void loop() {
brilho(); // Chama a função brilho() - ajuste brilho segmentos 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);
}
if (ini==0) {
anagrama(); // Chama a função anagrama() se ini=0
}
// Cria o array position[] para armazenar os valores do cronômetro
uint8_t position[] = { 0, 0, 0, 0 };
// Armazena em segundos o tempo ligado do Arduino
timer = (millis() - t) / 1000;
// Calculo individual para posição no display
position[0] = display.encodeDigit((timer / 60) / 10); // Dezena de minuto
position[1] = display.encodeDigit((timer / 60) % 10); // Unidade de minuto
position[2] = display.encodeDigit((timer % 60) / 10); // Dezena de segundo
position[3] = display.encodeDigit((timer % 60) % 10); // Unidade de segundo
//Mostra os valores no display
display.setSegments(position);
// atualiza a cada 0,25 segundos e coloca ":"
if ((millis() - (temporizador)) >= 250) {
// Variável para inclusão do sinal ":" entre min e seg
position[1] = position[1] + 128;
display.setSegments(position);
temporizador = millis(); // Atualiza a referência
}
}
void anagrama() {
// Ajusta o brilho para o anagrama
display.setBrightness(3);
// Imprime o anagrama SASA no display
display.setSegments(SASA);
// Aguarda pressionar o botão
while(digitalRead(pinBut)) { } // espera apertar o botão
while (!digitalRead(pinBut)) { } //esperera soltar o botão
delay(50);
t = millis();
temporizador = millis();
ini = !ini;
}
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 anagrama SA:SA.
2. Ao clicar o botão (push button) inicia-se o cronômetro a partir de 00:00. São mostrados no display os valores dos segundos e minutos.
3. Girando o eixo do potenciômetro, aumentamos ou diminuímos a intensidade dos leds do display.
4. Ao clicarmos o botão novamente, o cronômetro para e o display exibe o anagrama.
5. Clicando mais uma vez o botão, o cronômetro é reiniciado.
Desafios
Com base neste projeto, resolva o seguinte desafio: Desafio 51
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários