Data e hora no RTC DS1302 com Arduino

Neste artigo vamos ver como extrair as informações de data e hora do módulo RTCDS1302, um módulo que funciona da mesma forma que o DS1307, mas possui algumas diferenças principalmente na parte de comunicação com o Arduino, já que o DS1307 usa I2C e o DS1302 usa comunicação com 3 fios.

Módulo RTC DS1302

O módulo é controlado pelo DS1302 ,um chip do tipo RTC (Real Time Clock, ou Relógio de Tempo Real), com funções de data, hora e calendário. Ele é capaz de fornecer as informações de horas, minutos, segundos, dia da semana, data, mês e ano, e ajusta automaticamente os dados referentes aos meses com menos de 31 dias e também anos bissextos.

Pinagem DS1302

Na imagem abaixo temos a pinagem do CI DS1302 (datasheet) e a função de cada pino:

E abaixo a disposição do CI DS1302 no módulo, que na verdade não possui muitos componentes adicionais, apenas o cristal de 32.768 kHz e a bateria (CR2032) para manter a alimentação do chip em caso de falta de energia:

O CI aceita alimentação de 2 à 5.5V, logo podemos ligar o módulo utilizando os pinos 3.3V ou 5V do Arduino.

Ligação módulo DS1302 ao Arduino

São utilizados três pinos para conexão ao Arduino : RST (Reset ou CE – Chip Enable), DATA (I/O) e CLK (ou SCLK / Serial Clock). Para testes vou alimentar o módulo com os 5V do Arduino:

Como pinos de dados usamos os pinos 6, 7 e 8 do Arduino. Você pode escolher outros pinos do Arduino e mudar essa configuração nas linhas iniciais do programa.

Mostrando as informações de data e hora do DS1302

Existe um artigo no site oficial do Arduino, mostrando em detalhes como ler as informações do DS1302. Para quem gosta de entender como essa comunicação é feita, byte a byte, vale a pena dar uma olhada nessa página: http://playground.arduino.cc/Main/DS1302.

Para a maioria das aplicações esse código é bem extenso e não muito simples de entender, por isso o pessoal da Virtuabotix adaptou esse código e criou uma biblioteca chamada virtuabotixRTC (clique aqui para efetuar o download da biblioteca). Com ela fica muito fácil de extrair as informações do DS1302 e utilizá-las junto com outras funções do Arduino.

Note que no início do programa temos essa linha, que serve para determinar a data e hora atuais :

myRTC.setDS1302Time(<segundos>, <minutos>, <hora>, <dia da semana>, <dia do mês>, <mês>, <ano>)

Uma vez setada a data e a hora, a linha acima deve ser comentada e o programa novamente carregado no Arduino. 

Criei o programa abaixo baseado nos exemplos da biblioteca, e acrescentei a rotina que mostra o dia da semana por extenso:

//Programa: Data e hora com modulo RTC DS1302
//Alteracoes e adaptacoes: Arduino e Cia
//
//Baseado no programa original de Krodal e na biblioteca virtuabotixRTC

//Carrega a biblioteca virtuabotixRTC
#include <virtuabotixRTC.h>           

//Determina os pinos ligados ao modulo
//myRTC(clock, data, rst)
virtuabotixRTC myRTC(6, 7, 8);

void setup()  
{      
  Serial.begin(9600);
  //Informacoes iniciais de data e hora
  //Apos setar as informacoes, comente a linha abaixo
  //(segundos, minutos, hora, dia da semana, dia do mes, mes, ano)
  myRTC.setDS1302Time(00, 58, 23, 2, 17, 11, 2014);
}

void loop()  
{
  //Le as informacoes do CI
  myRTC.updateTime(); 

  //Imprime as informacoes no serial monitor
  Serial.print("Data : ");
  //Chama a rotina que imprime o dia da semana
  imprime_dia_da_semana(myRTC.dayofweek);
  Serial.print(", ");
  Serial.print(myRTC.dayofmonth);
  Serial.print("/");
  Serial.print(myRTC.month);
  Serial.print("/");
  Serial.print(myRTC.year);
  Serial.print("  ");
  Serial.print("Hora : ");
  //Adiciona um 0 caso o valor da hora seja <10
  if (myRTC.hours < 10)
  {
    Serial.print("0");
  }
  Serial.print(myRTC.hours);
  Serial.print(":");
  //Adiciona um 0 caso o valor dos minutos seja <10
  if (myRTC.minutes < 10)
  {
    Serial.print("0");
  }
  Serial.print(myRTC.minutes);
  Serial.print(":");
  //Adiciona um 0 caso o valor dos segundos seja <10
  if (myRTC.seconds < 10)
  {
    Serial.print("0");
  }
  Serial.println(myRTC.seconds);

  delay( 1000);
}

void imprime_dia_da_semana(int dia)
{
  switch (dia)
  {
    case 1:
    Serial.print("Domingo");
    break;
    case 2:
    Serial.print("Segunda");
    break;
    case 3:
    Serial.print("Terca");
    break;
    case 4:
    Serial.print("Quarta");
    break;
    case 5:
    Serial.print("Quinta");
    break;
    case 6:
    Serial.print("Sexta");
    break;
    case 7:
    Serial.print("Sabado");
    break;
  }
}

Esse programa envia as informações de data e hora para o serial monitor:

Em um próximo artigo sobre o DS1302, vou utilizar esse módulo para montar um relógio utilizando display 7 segmentos. Até lá!

5/5 - (2 votos)

Related posts

Medindo a intensidade do som com o sensor KY-038

by Arduino e Cia
9 anos ago

Alarme por SMS usando SIM800L e Arduino

by Arduino e Cia
7 anos ago

Acelerômetro e Giroscópio MPU6050

by Arduino e Cia
10 anos ago
Sair da versão mobile