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.

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 TM1637 com display 4 dígitos

 

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.

Resultado de imagem para módulo rtc ds3231

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

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

Módulo RTC Módulo RTC DS3231 1 modulo arduino rtc real time clock ds3231 hora + bateria pic

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

Módulo DS3231

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 se refere à alimentação 3.3V ou 5V (Vcc e GND).

1.1.2. O par de pinos 2 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.

1.1.2. Os pinos 3 e 4 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:

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

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

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 Tabela Biblioteca para Módulos.

Usando a biblioteca TM1637

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

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.

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:

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:

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