Guia para Módulo de Relógio em Tempo Real (RTC) com Arduino (DS1307 e DS3231)

Tempo de leitura: 4 minutes

Esta postagem é sobre como usar o módulo DS1307 Real Time Clock (RTC) com o Arduino. Você também pode seguir este guia para outros módulos semelhantes, como o DS3231 RTC.

 

Apresentando o módulo Relógio em tempo real

O módulo de relógio em tempo real é o da figura abaixo (vista frontal e traseira).

Ao usar este módulo pela primeira vez, você precisa soldar alguns pinos de cabeçalho.

Como você pode ver na imagem acima, o módulo possui uma bateria reserva instalada. Isso permite que o módulo retenha o tempo, mesmo quando não está sendo ligado pelo Arduino. Dessa forma, toda vez que você liga e desliga seu módulo, o tempo não zera.

Este módulo usa comunicação I2C. Isso significa que ele se comunica com o Arduino usando apenas 2 pinos.

 

Onde comprar?

O Real Time Clock é um módulo acessível. Você pode verificar o módulo DS1307 Real Time Clock no MercadoLivre e encontrar o melhor preço.

 

Ligação de pinos

A ligação do módulo RTC é bastante simples!

PinoLigação para o Arduino Uno
SCLA5
SDAA4
VCC5V
GNDGND

Se você estiver usando outra placa Arduino em vez da uno, verifique quais são seus pinos SCL e SDA.

  • Nano: SDA (A4) e SCL(A5)
  • MEGA: SDA (20) e SCL(21)
  • Leonardo: SDA (20) e SCL(21)

 

Exemplo: Exibindo data e hora no monitor serial

Este exemplo exibe a data e a hora no monitor serial.

Peças necessárias

Para este exemplo, você precisa das seguintes peças:

  • Arduino UNO ou compativel
  • Modulo DS1307 RTC
  • Fios para Ligação

Todos encontrados no MercadoLivre.

 

Esquemas

Código

Trabalhar com o RTC requer duas etapas importantes:

  • definir a hora atual, para que o RTC saiba que horas são
  • retendo a hora, para que o RTC sempre dê a hora correta, mesmo quando está desligado

Defina a hora atual no relógio de tempo real

Para definir a hora atual, você precisa alterar o código fornecido.

  • definir sua hora atual no conjunto de funções setDS3231time()

Os parâmetros da função são destacados em vermelho: segundos, minutos, horas, dia da semana, data, mês e ano (nesta ordem). Domingo é o dia 1 da semana e sábado é 7. Não se esqueça de descomentar essa linha de código.

Depois de definir a hora atual, você pode fazer upload do código fornecido com as modificações necessárias.

O código fornecido foi escrito por John Boxall da tronixstuff. Você pode ler seu tutorial aqui.

// Escrito por John Boxall de http://tronixstuff.com
// Traduzido para entendimento.

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Converter números decimais normais em decimais codificados em binário
byte decToBcd(byte val){
  return( (val/10*16) + (val%10) );
}
// Converte decimais codificados em binários em números decimais normais
byte bcdToDec(byte val){
  return( (val/16*10) + (val%16) );
}
void setup(){
  Wire.begin();
  Serial.begin(9600);
  // defina a hora inicial aqui:
  // DS3231 segundos, minutos, horas, dia, data, mês, ano
  setDS3231time(30,42,16,5,13,10,16);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year){
  // define os dados de hora e data para DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // define a próxima entrada para começar no registro de segundos
  Wire.write(decToBcd(second)); // definir segundos
  Wire.write(decToBcd(minute)); // definir minutos
  Wire.write(decToBcd(hour));   // definir horas
  Wire.write(decToBcd(dayOfWeek)); // definir dia da semana (1 = domingo, 7 = sábado)
  Wire.write(decToBcd(dayOfMonth)); // definir data (1 a 31)
  Wire.write(decToBcd(month)); // definir o mês
  Wire.write(decToBcd(year)); // definir ano (0 a 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year){
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // definir o ponteiro de registro DS3231 para 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // solicita sete bytes de dados do DS3231 a partir do registro 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void displayTime(){
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // recuperar dados do DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // envie para o monitor serial
  Serial.print(hour, DEC);
  // converte a variável de byte em um número decimal quando exibida
  Serial.print(":");
  if (minute<10){
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10){
    Serial.print("0");
  }
  Serial.print(second, DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print(" Dia da semana: ");
  switch(dayOfWeek){
  case 1:
    Serial.println("Domingo");
    break;
  case 2:
    Serial.println("Segunda");
    break;
  case 3:
    Serial.println("Terça");
    break;
  case 4:
    Serial.println("Quarta");
    break;
  case 5:
    Serial.println("Quinta");
    break;
  case 6:
    Serial.println("Sexta");
    break;
  case 7:
    Serial.println("Sabado");
    break;
  }
}
void loop(){
  displayTime(); //exibe os dados do relógio em tempo real no Monitor Serial,
  delay(1000);   //todo segundo
}

 

Reter a hora no relógio em tempo real

Se você não quiser zerar a hora toda vez que o RTC for desligado, você deve fazer o seguinte:

  • Após configurar a hora, você deve comentar a função que define a hora e fazer o upload do código novamente.

Esta é uma etapa muito importante para configurar a hora em seu RTC. Se você não fizer isso, sempre que seu RTC for redefinido, ele exibirá a hora que você configurou anteriormente e não a hora atual.

 

Demonstração

Abra o monitor serial a uma taxa de transmissão de 9600 e você verá os resultados.

Aqui está o Monitor Serial exibindo a data e hora atuais.

 

Conclusão

Neste guia, mostrei como usar um RTC DS1307 e ou DS3231 com o Arduino. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!

O módulo RTC é muito útil e você pode usá-lo como relógio, cronômetro, etc.

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com esse RTC. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.