Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto 67 - Relógio digital com display TM1637 e módulo RTC - Arduino
Projeto 67 - Relógio digital com display TM1637 e módulo RTC - Arduino
Angelo Luis Ferreira | 17/09/2019
Acessos: 14.002
Básico - Projeto 67
Relógio digital com temperatura com display TM1637 e RTC DS3231
Objetivo
Neste projeto vamos mostrar como utilizar o display TM1637 em conjunto com o módulo RTC DS3231 e criar um relógio digital (horas e minutos) com mostrador de temperatura para Arduino. Utilizaremos o push button para alternar entre relógio e mostrador de temperatura. 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(), showNumberDec() e display.setBrightness().

Módulo RTC DS3231 de alta precisão: O Real Time Clock (RTC) DS3231 é um relógio de tempo real de alta precisão e baixo consumo de energia. Em sua placa vem embutido um sensor de temperatura, um gravador de dados EPROM e um cristal oscilador para melhorar sua exatidão.

Observações sobre o módulo RTC DS3231:
1. Utiliza o protocolo de comunicação I2C. O I2C é um protocolo de baixa velocidade de comunicação criado pela Philips para comunicação entre placa mãe e dispositivos, Sistemas Embarcados e circuitos de celulares.
2. É capaz de fornecer informações como segundo, minutos, dia, data, mês e ano (de 2000 a 2099). Correções como meses com menos de 31 dias e anos bissextos são corrigidos automaticamente e pode operar tanto no formato 12 horas como 24 horas.
3. Em caso de falha de energia o DS3231 automaticamente aciona a bateria para evitar perda de dados.
4. Possui um sensor de temperatura com precisão de 3ºC.
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)
|
Módulo RTC |
Módulo RTC DS3231 |
1 |
 |
Módulo de alta precisão com comunicação I2C.
Tensão de operação: 3,3V - 5,0V
Chip de memória: AT24C32 de 32K bytes
Computa segundos, minutos, horas, dias da semana, dias do mês, meses e anos (de 2000 a 2099)
Consumo menor que 500nA no modo bateria
(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. Utilizamos neste projeto o módulo RTC DS3231 que permite um controle completo e preciso de tempo. Para conectar o módulo é necessário conhecer um pouco a estrutura do componente:

1.1. Observe na imagem acima que em uma extremidade do módulo existem 6 pinos de conexão, sendo:
1.1.1. O par de pinos 1 e 2 se refere à alimentação 3.3V ou 5V (Vcc e GND).
1.1.2. O par de pinos 3 e 4 deve ser utilizado para a comunicação I2C (SDA e SCL) que deverão estar conectados nos pinos analógicos A4 (SDA) e A5 (SCL) do Arduino Uno ou nos pinos A20 (SDA) e A21 (SCL) do Arduino Mega 2560. Veja a tabela abaixo:

1.1.2. Os pinos 5 e 6 não são utilizados neste projeto, sendo que o pino 3 (SQW) é usado para disparo de alarmes e o pino 4 (32K) para saída de onda do cristal e é raramente utilizado.
4. 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

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

5.1. 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.
6. Veja abaixo como realizamos a montagem do nosso projeto utilizando um protoboard.

Baixando a biblioteca DS3231
Para obtermos os valores de temperatura ambiente lidos no sensor de temperatura do RC DS3231 é necessário adicionarmos a biblioteca DS3231.h no IDE do Arduino. Para conhecer todos comandos da biblioteca veja Manual DS3231.h
DOWNLOAD - DS3231.zip
Para saber detalhes desta biblioteca clique aqui.
Baixando a biblioteca TM1637
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 as bibliotecas DS3231 e TM1637 no IDE do Arduino
Após fazer o download dos arquivos TM1637-master.zip e DS3231.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 TM1637
Neste projeto vamos utilizar as seguintes 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);
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.


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

d) showNumberDec() : Esta função serve para mostrar valores no display seguindo os seguintes parâmetros:
1º parâmetro: Número do tipo inteiro. Valores de 0 até 9999;
2º parâmetro: Verdadeiro ou falso. Serve para exibir zeros à esquerda pra valores até 999. O valor padrão é falso.
3º parâmetro: Opcional. Corresponde ao número de dígitos a serem exibidos
4º parâmetro: Opcional. Posição do dígito menos significativo (0 mais à esquerda, 3 - mais à direita).
Exemplos:

Sketch do projeto
1. Faça o dowload e abra o arquivo projeto67.ino no IDE do Arduino: DOWNLOAD - projeto67.ino
Obs. 1: Ao utilizar o RTC pela primeira vez é necessário ajustar a hora e data com os valores atuais: retire as barras duplas das linhas 46, 47 e 48 para executar a função que vai ajustar a data e hora atual do seu módulo. Após ajustá-las, altere novamente o código acrescentando as barras duplas.
Obs. 2: Se você já utilizou o seu módulo RTC em qualquer outro projeto e já ajustou a hora e data, não precisará mais fazer isto até substituir a bateria que deve durar em torno de 5 anos.
Ou se preferir, copie e cole o código abaixo no IDE do Arduino:
/*******************************************************************************
*
* Projeto 67: Relógio Digital com Display TM1637 e módulo RTC - Arduino
* Author: Angelo Luis Ferreira
* Date: 09/16/2019 (mm/dd/AA)
*
* http://squids.com.br/arduino
*
*******************************************************************************/
#include <DS3231.h>
#include <TM1637Display.h>
DS3231 rtc(SDA, SCL); // define modulo rtc
TM1637Display display(2,3); // define os pinos 2 com CLK e 3 com DIO
uint32_t timer = 0;
byte buttonStatus = 0;
const byte pinBut = 12;
const byte pinPot = A0;
// define o símbolo de Grau Celsius (ºC)
// - A
// | | F B
// - G
// | | E C
// - D
const uint8_t DEGREEC[] = {
0x0, 0x0,
SEG_A | SEG_B | SEG_G | SEG_F, // Degree Symbol (º)
SEG_A | SEG_F | SEG_E | SEG_D, // C
};
Time t;
int Hor;
int Min;
int Sec;
int temperature;
void setup() {
Serial.begin(9600);
pinMode(pinBut, INPUT_PULLUP);
display.setBrightness(7);
rtc.begin();
//rtc.setDOW(TUESDAY); // Altere o dia da semana SUNDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY e SATURDAY
//rtc.setTime(18, 23, 0); // Altere o tempo (formato de 24horas)
//rtc.setDate(24, 1, 2019); // Dia, mês, Ano
}
void loop() {
brilho(); // ajusta brilho dos leds do display
// pega valores individuais de hora, nin e sec
t = rtc.getTime();
Hor = t.hour;
Min = t.min;
Sec = t.sec;
temperature = round(rtc.getTemp());
// verifica se o botão (pushbutton) está pressionado e muda o status
if (!digitalRead(pinBut)) {
buttonStatus = !buttonStatus;
while (!digitalRead(pinBut)) {} // espera soltar o botão
delay(50);
}
temporizador(buttonStatus);
}
void temporizador(byte x) {
if (millis() - timer >=1000) {
Serial.print(Hor);
Serial.print(":");
Serial.print(Min);
Serial.print(":");
Serial.print(Sec);
Serial.print(" | ");
Serial.print("Temperatura = ");
Serial.println(rtc.getTemp());
if (x == 0) {
// 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(Hor / 10); // Dezena de hora
position[1] = display.encodeDigit(Hor % 10); // Unidade de hora
position[2] = display.encodeDigit((Min % 60) / 10); // Dezena de minuto
position[3] = display.encodeDigit((Min % 60) % 10); // Unidade de minuto
// Coloca o separador ":"
position[1] = position[1] + 128;
display.setSegments(position);
//Mostra o valor inicial no display
display.setSegments(position);
} else if (x == 1) {
display.setSegments(DEGREEC); //Exibe o valor da variável
display.showNumberDec(temperature,false,2,0); // exibe o valor da variável
}
timer = millis(); // Atualiza a referência
}
}
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. Se você vai utilizar o módulo RTC pela primeira vez, altere os sketch do projeto para configurar a hora e data atual: Retire as barras duplas de comentário das linhas 46, 47 e 48 para executar a função que vai ajustar a data e hora do seu módulo.
1.1. Após ajustar o programa, você não precisará mais realizar esta operação. Somente altere os dados novamente no caso de precisar substituir a bateria do módulo, que deve durar aproximadamente 5 anos.
1.2. Após o ajuste, desligue o Arduino da fonte e altere novamente o sktech, inserindo as duas barras nas linhas de comando 46, 47 e 48.
2. Ao iniciar o programa, o display irá exibir a hora atual (hora e minutos) atualizados a cada segundo.
3. Ao clicar o botão (push button) o display mostrará a temperatura ambiente em º Celsius. Para retornar, clique no botão novamente.
4. Ao acessar o monitor serial do IDE do Arduino você poderá visualizar a hora (hora, minutos e segundos) e a temperatura em graus Celsius, atualizadas a cada segundo.

5. 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 54
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários