Relógio em tempo real RTC DS1307 com Arduino

Posted by

O relógio em tempo real RTC DS1307 é um chip que funciona via protocolo de comunicação i2c. Ele pode fornecer e manter a hora, minuto, segundo, dia, mês e ano atuais em um formato de 12 ou 24 horas. Ele tem (no caso do shield usado neste tutorial) uma bateria CR2032 para backup.

As conexões com o Arduino UNO são as seguintes, é necessário apenas fornecer 5V e GND junto com i2c (SCL A5 e SDA A4 do Arduino UNO).

Ligação do DS1307 com Arduino. Fonte: https://www.makerhero.com/blog/relogio-rtc-ds1307-arduino/
relógio RTC DS1307 na protoboard
Chip RTC DS1307 na protoboard com Arduino

Primeiro, peguei o código deste blog e a biblioteca deste Github. Aqui está o código e o resultado do monitor serial:

//Program : Clock with RTC DS1307
//Author : MakerHero
 
//Load RTC DS1307's library
#include <DS1307.h>
 
//i2c ports in Arduino UNO 
DS1307 rtc(A4, A5);
 
void setup()
{
  //Turn the clock on
  rtc.halt(false);
   
  //The lines below set the date and time
  //uncomment them, use once and comment them again
  /*rtc.setDOW(WEDNESDAY);      //Define the day of week
  rtc.setTime(19, 47, 00);     //Define time
  rtc.setDate(3, 7, 2024);   //Define day, month, year*/
   
  //SQW/Out pin definition
  rtc.setSQWRate(SQW_RATE_1);
  rtc.enableSQW(true);
   
  Serial.begin(9600);
}
 
void loop()
{
  //Show info on Serial Monitor
  Serial.print("Hour (24h) : ");
  Serial.print(rtc.getTimeStr());
  Serial.print(" ");
  Serial.print("Date : ");
  Serial.print(rtc.getDateStr(FORMAT_SHORT));
  Serial.print(" ");
  Serial.println(rtc.getDOWStr(FORMAT_SHORT));
   
  //Wait 1s and do it all over
  delay (1000);
}
Data e hora no monitor serial da IDE do Arduino
Data e hora no monitor serial da IDE do Arduino

Observe que a hora está no formato 24h (está mostrando 7:57 PM) e a data não está no formato americano (portanto, 3 de julho de 2024). Para testar, removi a energia do Arduino completamente por alguns minutos. Após restabelecê-lo, a hora e a data permaneceram atuais, então a bateria CR2032 realmente cumpre seu propósito.

Lembre-se de que você precisa alterar as linhas abaixo com sua data e hora atuais. Faça isso apenas uma vez e depois você precisa comentar ou remover as linhas.

rtc.setDOW(WEDNESDAY);      //Define the day of week
  rtc.setTime(19, 47, 00);     //Define time
  rtc.setDate(3, 7, 2024);   //Define day, month, year

Em relação ao pedaço de código abaixo, parece ser uma onda quadrada gerada a cada segundo (SQW_RATE_1). Desabilitei as duas linhas inteiras porque não tinha utilidade visível para elas.

//SQW/Out pin definition
  rtc.setSQWRate(SQW_RATE_1);
  rtc.enableSQW(true);

Aparentemente, ele é usado para informar ao seu microcontrolador que o tempo está passando. Para que ele possa ter seu próprio controle de tempo sem ler o DS1307. Não vamos usá-lo, apesar do módulo DS1307 que estamos usando ter o pino SQ disponível.

Uso de bateria (duração)

De acordo com a folha de dados do DS1307, uma bateria de 48mAh manterá a hora e a data no chip por 10 anos. Então, provavelmente levará muito tempo até que você tenha que substituir a bateria do módulo.

Há 56 bytes de informações que a bateria fará backup, incluindo hora, minuto, segundo, dia, mês e ano. Isso inclui cálculos automáticos de número de dias no mês e também anos bissextos. A lógica do módulo tem garantia de funcionar até 2100.

Pra finalizar

O chip DS1307 já é um pouco antigo, há opções melhores disponíveis. Especialmente na limitação de tempo de 2100. Ele continua sendo um módulo de relógio de tempo real fácil de usar e barato para projetos de hobby e estudantes.

Se você quiser acompanhar e replicar o experimento, compre um DS1307 através do meu link de afiliado Aliexpress, aqui. Um pouco sem relação (mas ainda falando sobre consumo de energia) confira meu artigo sobre redução do consumo de energia do relé.

Uma resposta

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *