Magos do Arduino

Sensor RTC DS1307

Aprenda a utilizar um sensor RTC DS1307 com o Arduino

Magos do Arduino

Sensor RTC DS1307

O módulo RTC significa Real Time Clock (Relógio de Tempo Real).

Sensor RTC DS1307

O módulo DS1307 mantém a contagem de horas, minutos, segundos, dia, mês e ano.

Possui bateria de backup (CR2032), garantindo que o relógio continue funcionando mesmo sem energia externa.

Utiliza a comunicação via I2C.

Ele trabalha com alimentação de 5V (com suporte à bateria de backup 3V).

Mantém a hora e data atualizadas mesmo sem o microcontrolador ligado.

Interface simples via barramento I2C (SDA / SCL).

Pode ser usado em agendamentos, registros de eventos, sistemas de automação, etc.

Sensor RTC DS1307

O módulo RTC DS1307 possui os seguintes pinos:

  1. VCC -> Alimentação (5V)
  2. GND -> Terra
  3. SDA -> Linha de dados I2C
  4. SCL -> Clock do I2C
  5. SQW -> Saída de onda quadrada (opcional, 1Hz, 4kHz, 8kHz ou 32kHz)
  6. DS -> Entrada/Saída adicional (dependendo da versão do módulo)

Alguns módulos baseados no DS3231 (variação mais precisa do DS1307) já incluem sensor de temperatura interno.

No módulo DS1307, normalmente há espaço para integração de um sensor externo (ex: DS18B20) em algumas versões da placa.

Esse recurso permite registrar hora + temperatura, útil para registros ambientais.

O barramento I2C suporta múltiplos dispositivos conectados em paralelo.

Isso significa que o RTC DS1307 pode compartilhar as mesmas linhas SDA e SCL com outros módulos (ex: sensores, displays, etc.).

Cada dispositivo possui um endereço único no barramento.

Esse recurso é chamado de Daisy Chain, pois permite ligar vários módulos em série no mesmo par de fios.

Protocolo I2C

O protocolo I2C (Inter-Integrated Circuit) é um protocolo de comunicação serial síncrono.

Ele utiliza apenas 2 linhas de comunicação, SDA (dados) e SCL (clock).

Ele permite conectar múltiplos dispositivos no mesmo barramento (até 127 endereços).

Com ele, o Arduino controla o clock e inicia as transmissões, enquanto que os módulos (ex: RTC DS1307, sensores) respondem conforme seu endereço.

Onboard EEPROM

Além do chip RTC, o módulo geralmente inclui uma EEPROM AT24C32 com capacidade de 32 Kb.

Sua comunicação também é via I2C, compartilhando as mesmas linhas SDA e SCL.

Ele pode ser útil para armazenar dados permanentes, como configurações do sistema, registros de eventos ou até mesmo logs de sensores.

Os dados permanecem gravados mesmo após desligar o circuito.

Sensor RTC DS1307

Neste projeto você criará um circuito que faz o uso de um sensor RTC DS1307 com o Arduino.

Para a criação deste circuito serão necessários os seguintes componentes:

  • 1x Breadboard (Opcional)
  • 1x Arduino UNO
  • 1x Sensor RTC DS1307
  • 1x Bateria CR2032
  • Jumpers

Circuito sensor RTC DS1307

Para montar o circuito, visualize na imagem a seguir como conectar os componentes entre a placa Arduino e a breadboard.

Circuito Sensor RTC DS1307

Código fonte para o circuito do sensor RTC DS1307

Uma vez criado o circuito, use o código fonte a seguir no Arduino IDE para fazer o upload dele na placa Arduino e assim ver o resultado do circuito em funcionamento.

/**
 * Código do curso Magos do Arduino para utilizar um sensor RTC (horas em tempo real) DS1307 com o Arduino.
 * 
 * Imprima no monitor serial a data e hora atual no formato "Sábado, 20 de Setembro de 2025, 9:06:39" com o Arduino.
 * 
 * Utiliza a biblioteca uRTCLib por Naguissa, que pode ser instalada através do gerenciador de bibliotecas do Arduino IDE.
 * 
 * (c) Copyright KazaleIT
 * @kazaleitoficial no YouTube
 */

#include <Arduino.h>
#include <uRTCLib.h>

// cria uma instância do uRTCLib no endereço 0x68, que é o endereço do DS1307
uRTCLib rtc(0x68);

char diasDaSemana[7][15] = { 
  "Domingo", 
  "Segunda-feira", 
  "Terça-feira", 
  "Quarta-feira", 
  "Quinta-feira", 
  "Sexta-feira", 
  "Sábado"
};

char meses[12][15] = {
  "Janeiro",
  "Fevereiro",
  "Março",
  "Abril",
  "Maio",
  "Junho",
  "Julho",
  "Agosto",
  "Setembro",
  "Outubro",
  "Novembro",
  "Dezembro"
};

void setup() {
  Serial.begin(9600); // inicializa conexão serial

  URTCLIB_WIRE.begin(); // inicializa a conexão I2C do DS1307

  // execute uma única vez para ajustar a data e hora e depois comente o código a seguir
  // parâmetros: segundos, minutos, horas, dia da semana, dia do mês, mês e ano
  // para o dia da semana, use (1=Domingo, 2=Segunda-feira,... , 7=Sábado)
  rtc.set(0, 5, 9, 7, 20, 9, 25);
}

void loop() {
  rtc.refresh(); // utilizado para obter a data e hora atual

  char dataHora[100];
  sprintf(dataHora, "%s, %d de %s de 20%d, %d:%02d:%02d", 
    diasDaSemana[rtc.dayOfWeek() - 1], // dia da semana
  	rtc.day(), // dia do mês
    meses[rtc.month() - 1], // mês
    rtc.year(), // ano
    rtc.hour(), // hora
    rtc.minute(), // minutos
    rtc.second() // segundos
  );
  
  Serial.println(dataHora);

  delay(1000);
}