Projeto 50 - Relógio Digital Arduino com módulo RTC de alta precisão e adaptador I2C para display

Básico - Projeto 50

Relógio Digital com display LCD + adaptador I2C + RTC DS3231

Objetivo

Neste projeto vamos criar um relógio digital Arduino utilizando um display LCD, um módulo I2C e um módulo RTC (Real Time Clock). O projeto é bem simples e apenas exibe no display a hora e a data atuais a cada segundo. Existem vários tipos de componentes RTC para Arduino, entretanto utilizamos o módulo RTC DS3231 neste projeto.

Observações:

1) Este projeto possui alta precisão no controle de tempo pois utilizamos o módulo RTC DS3231.

2) Este projeto foi desenvolvido para um display LCD com controlador HD44780 em conjunto com o módulo serial I2C, que poderá ser separado ou soldado diretamente no display.

3) Se você não tiver um módulo I2C, poderá adequar o projeto para o display LCD sem o adaptador. Veja como montar o display no projeto Projeto 38 - Controlando um display LCD (instalação e comandos básicos).

4) Este projeto também deverá funcionar com o módulo RTC DS1397.

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

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 para controle de tempo com display de cristal líquido.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

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  
Display LCD Display LCD 16 X 2 com pinos soldados 1

LCD que utilize o controlador HD44780 (veja na descrição ou datasheet do componente)

O display poderá ser de qualquer cor (fundo verde, azul ou vermelho)

Módulo I2C para display LCD

Módulo I2C com CI PCF8574

1 Módulo I2C display LCD Arduino

O módulo I2C poderá vir separado ou já soldado no display LCD

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

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. 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  (GND e Vcc).

1.1.2. O par de pinos 3 e 4 deve ser utilizado para a comunicação I2C (SDA e SCL) e 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:

MICROCONTROLADOR SCL SDA
Arduino Uno A5 A4
Arduino Nano A5 A4
Arduino Mega 21 20
Leonardo/Micro 3 2

1.1.2. Os pinos 5 e 6 não são utilizados neste projeto, sendo que o pino 5 (SQW) é usado para disparo de alarmes e o pino 6 (32K) para saída de onda do cristal e é raramente utilizado.

2. Neste projeto poderão ser utilizados display LCD 16x2 ou display LCD 20X4 que possuem controlador HD44780. Estes displays se adaptam aos mais diversos projetos com vários modelos de placas e microcontroladores. Podem ter luz de fundo (backlight) verde, azul ou vermelha e possuem 16 pinos para a conexão. com No nosso exemplo vamos utilizar o display LCD 16x2 que possui 16 colunas por 2 linhas. Atenção: Utilize um display LCD com os pinos soldados.

3. Para a montagem do display com adaptador, entenda a estrutura do módulo I2C para display LCD 16x2 e display LCD 20X4:

Módulo I2C - Detalhes

3.1. Na lateral do adaptador encontramos 4 pinos, sendo: 2 pinos para alimentação (Vcc e GND) e 2 pinos para conexão com a interface 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 com onde temos as principais placas Arduino e suas conexões com o I2C.

3.2. Para controlar o contraste do display, utilize o potenciômetro de ajuste de contraste. O jumper lateral, quando utilizado, permite que a luz do fundo (backlight) seja controlada pelo programa ou permaneça apagada.

 

3.3. A seleção de endereço do adaptador I2C para display LCD, na maioria dos módulos fornecidos no mercado já vêm configurados com o com o endereço 0x27.

3.4. O módulo RTC DS3231, vem configurado por padrão com endereço 0X68.

Se você não sabe qual endereço que o seu módulo I2C  e/ou módulo RTC DS3231 está configurado, baixe o seguinte "sketch":

DOWNLOAD - I2C_scanner.ino

3.3.1 Após instalar e rodar o sketch acima, abra o monitor serial que mostrará qual é o endereço que o seu módulo I2C e o módulo RTC DS3231 está configurado:

 

3.3.1.1 Nos casos em que módulo I2C estiver configurado com uma faixa de endereços diferente do endereço 0X27 altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto.

3.3.1.2. Nos casos em que o módulo RTC estiver configurado com uma faixa de endereço diferente do endereço 0X68 altere a linha de programação -> #define DS3231_ADDRESS 0x68; com o endereço correto.

3.5. Para saber mais sobro a montagem e utilização de display LCD com módulo I2C leia: Projeto 48 - Como controlar um display LCD com o módulo I2C.

4) Veja abaixo como realizamos a montagem do nosso projeto utilizando um protoboard:

Incluindo biblioteca LiquidCrystal_I2C no IDE do Arduino

Para que o módulo I2C funcione corretamente é necessário adicionarmos a biblioteca LiquidCrystal_I2C no IDE do Arduino. Uma das grandes vantagens das placas Arduino é a diversidade de bibliotecas disponíveis que podem ser utilizadas em seus programas. Estas bibliotecas podem ser criadas para a linguagem "C" ou especificamente para o Arduino, reduzindo drasticamente o tempo gasto com programação. Veja a tabela Coletânea de bibliotecas para módulos.

DOWNLOAD - NewliquidCrystal_1.3.4.zip

Para saber detalhes desta biblioteca clique aqui.

Instalando a biblioteca pelo IDE do Arduino

Após fazer o download do arquivo NewliquidCrystal_1.3.4.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.

Sketch do projeto

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

Obs. 1: Nos casos em que módulo I2C estiver configurado com um endereço diferente do endereço 0X27, altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto.

obs. 2: Nos casos em que o módulo RTC DS3231 estiver configurado com um endereço diferente do endereço 0X68, altere a linha de programação -> #define DS3231_ADDRESS 0x68; com o endereço correto.

Obs. 3: Se estiver utilizando um display de LCD 20 X 4, altere o comando da linha 36 para lcd.begin (20,4);

Obs. 4: Utilizamos também neste projeto a biblioteca Wire.h que já vem embutida no IDE do Arduino. Portanto não é necessário baixar e/ou instalar qualquer arquivo.

Obs. 5: Antes rodar o programa pela primeira vez é necessário ajustar a hora e data com os valores atuais: retire as barras duplas da linha SelecionaDataeHora() (linha 25) para executar a função que vai ajustar a data e hora do seu módulo. Nas variáveis das linhas 94 à 100 você defina os novos valores.

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

/*******************************************************************************
*
*    Projeto 50: Relógio Digital usando módulo RTC  DS3231 e módulo I2C
*                     http://squids.com.br/arduino
*
*******************************************************************************/
#include "Wire.h"
#include <LiquidCrystal_I2C.h>

// Modulo RTC no endereco 0x68
#define DS3231_ADDRESS 0x68

// Modulo I2C display no endereco 0x27
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);

byte zero = 0x00; 

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  lcd.begin (16,2);
  
  //A linha abaixo pode ser retirada apos setar a data e hora
  //SelecionaDataeHora(); 
}

void loop()
{
  // Le os valores (data e hora) do modulo DS3231
  Wire.beginTransmission(DS3231_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS3231_ADDRESS, 7);
  int segundos = ConverteparaDecimal(Wire.read());
  int minutos = ConverteparaDecimal(Wire.read());
  int horas = ConverteparaDecimal(Wire.read() & 0b111111);
  int diadasemana = ConverteparaDecimal(Wire.read()); 
  int diadomes = ConverteparaDecimal(Wire.read());
  int mes = ConverteparaDecimal(Wire.read());
  int ano = ConverteparaDecimal(Wire.read());

  // Mostra os dados no display
  lcd.setCursor(0,0);
  lcd.print("    ");
  // Acrescenta o 0 (zero) se a hora for menor do que 10
  if (horas <10)
    lcd.print("0");
  lcd.print(horas);
  lcd.print(":");
  // Acrescenta o 0 (zero) se minutos for menor do que 10
  if (minutos < 10)
     lcd.print("0");
  lcd.print(minutos);
   lcd.print(":");
   // Acrescenta o 0 (zero) se segundos for menor do que 10
  if (segundos < 10)
     lcd.print("0");
  lcd.print(segundos);
  lcd.setCursor(2,1);
  // Mostra o dia da semana
  switch(diadasemana)
    {
      case 0:lcd.print("Dom");
      break;
      case 1:lcd.print("Seg");
      break;
      case 2:lcd.print("Ter");
      break;
      case 3:lcd.print("Quar");
      break;
      case 4:lcd.print("Qui");
      break;
      case 5:lcd.print("Sex");
      break;
      case 6:lcd.print("Sab");
    }
    lcd.setCursor(6,1);
    // Acrescenta o 0 (zero) se dia do mes for menor do que 10
    if (diadomes < 10)
      lcd.print("0");
    lcd.print(diadomes);
    lcd.print("/");
    // Acrescenta o 0 (zero) se mes for menor do que 10
    if (mes < 10)
      lcd.print("0");
    lcd.print(mes);
    lcd.print("/");
    lcd.print(ano);
}

void SelecionaDataeHora()   //Seta a data e a hora do DS3231
{
  byte segundos = 20; //Valores de 0 a 59
  byte minutos = 26; //Valores de 0 a 59
  byte horas = 18; //Valores de 0 a 23
  byte diadasemana = 4; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
  byte diadomes = 17; //Valores de 1 a 31
  byte mes = 1; //Valores de 1 a 12
  byte ano = 19; //Valores de 0 a 99
  Wire.beginTransmission(DS3231_ADDRESS);
  Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

  //As linhas abaixo escrevem no CI os valores de 
  //data e hora que foram colocados nas variaveis acima
  Wire.write(ConverteParaBCD(segundos));
  Wire.write(ConverteParaBCD(minutos));
  Wire.write(ConverteParaBCD(horas));
  Wire.write(ConverteParaBCD(diadasemana));
  Wire.write(ConverteParaBCD(diadomes));
  Wire.write(ConverteParaBCD(mes));
  Wire.write(ConverteParaBCD(ano));
  Wire.write(zero);
  Wire.endTransmission(); 
}

byte ConverteParaBCD(byte val)
{ 
  //Converte o número de decimal para BCD
  return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val)  
{ 
  //Converte de BCD para decimal
  return ( (val/16*10) + (val%16) );
}  

ATENÇÃO: Se o display acender e não mostrar os caracteres provavelmente é em função do contraste. Gire o eixo do potenciômetro de ajuste de contraste no sentido horário. Se mesmo assim o display não mostrar os caracteres, então corrija a montagem do circuito e/ou o código.

Vídeo

Como o projeto deve funcionar

1. Antes de rodar o programa altere os sketch para configurar a hora e data atual: Retire as barras duplas de comentário da linha SelecionaDataeHora() (linha 25) para executar a função que vai ajustar a data e hora do seu módulo. Nas variáveis das linhas 94 à 100 defina os novos valores com a hora e data atuais.

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.

2. Ao iniciar o programa, você irá visualizar na primeira linha do display a hora, minutos e segundos e na segunda linha a data de acordo com os valores que você definiu nas variáveis das linhas 94 à 100.

2. Desligue o Arduino da fonte e altere novamente o sktech inserindo as duas barras ou excluindo a linha 25.

3. Pronto, agora rode o programa para visualizar a hora e data. Se acabar a energia elétrica ou se você desligar o Arduino, a hora e data estarão sempre atualizadas graças a bateria que vem acoplada ao módulo.

Desafios

Com base neste projeto, resolva o seguinte desafio: Desafio 36

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

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores