Introdução
RTC vem da sigla em inglês para Real-Time Clock ou Relógio de Tempo Real. Trata-se de um módulo contendo um circuito do tipo contador capaz que trabalhar como um relógio, recurso muito útil em projetos que trabalham com datas e horas. Esse é o nosso assunto de hoje
![]() |
Módulo RTC DS3231 com suporte para bateria (vazio) |
O que é o CI Contador?
Um circuito integrado contador é um componente eletrônico que realiza contagens e/ou divisão de frequência através da entrada de pulsos de clock. Quando esse clock trabalha com frequências compatíveis, a contagem coincide com os intervalos de tempo reais.
Por exemplo, a frequência da energia elétrica de nossas casas no Brasil trabalha em 60 Hz, isto é, 60 ciclos por segundo. Se usarmos um divisor de frequência de forma a transformar essa frequência em 1 Hz, cada pulso corresponderia a passagem de tempo de 1 segundo.
Com a devida combinação de flip flops e portas de lógicas, podemos criar contadores que podem contar, por exemplo, de 0 até 59 e se trabalharmos com pulsos de 1Hz, teríamos essa contagem coincidindo com a passagem de tempo dos minutos.
Não pretendo explicar aqui em poucas frases aquilo que o estudantes de embarcados passam alguns semestres para aprender. Quis apenas dar uma ideia da relação entre CIs contadores e a questão da contagem de tempo.
No caso dos RTC temos CIs contadores mais especializados que permitem a contagem de segundos, minutos, horas, dias, datas, meses e anos, com a capacidade de tratar dos diferentes números de dias dos meses e os anos bissextos.
Entre os principais CIs usados em módulos RTCs temos o DS1302, DS1307 e o DS3231. Todos da Dallas Semiconductor.
![]() |
CI DS1307 usado em módulos RTC |
Os módulos RTC
Além do CI um módulo RTC precisa de um oscilador para gerar os pulsos para a contagem. Possui também uma pequena memória volátil, isto é, que depende de energia para manter dados armazenados, por razão, possui suporte para uma bateria como a CR2032 de 3V para manter os dados quando o sistema é desligado.
É comum encontrarmos pela Web projetos utilizando CIs independentes sem o módulo. Neste caso é necessário utilizar um cristal de quartzo como o de 32,768 KHz para a questão dos pulsos e um suporte de alimentação com bateria independente. Por isso acaba saindo mais barato a aquisição do módulo pronto.
Os módulos a base de CIs 1307 e 3231 utilizam dois pinos para comunicação com o Arduino utilizando o protocolo I²C. Já os com 1302 utilizam três pinos com comunicação serial.
Bibliotecas
Para usar um RTC Geralmente utilizamos a biblioteca RTClib da Adafruit, já otimizada para I2C, por isso podemos dispensar a biblioteca Wire que já conhecemos de outras aulas, quando vimos o protocolo I2C. Essa RTClib é um fork da antiga RTClib da JeeLab's.
Porém também temos a biblioteca RTC de Manjunath CV que permite a leitura e ajuste do relógio, trabalha com 12 ou 24 horas e para alguns chips permite também ajustes de alarme e timer (temporizador).
Seu repositório é o https://github.com/cvmanjoo/RTC e nele o estudante encontrará informação como o endereço de memória utilizada pelo I2C de acordo com o chip. Por exemplo, para o DS1307 o endereço é o 0x68.
Montagem
Para essa montagem utilizaremos o Wokwi que oferece um simulador para o DS1307 para o qual utilizaremos a biblioteca RTClid da Adafruit. O módulo DS1307 geralmente possui cinco terminais:
- GND para o Terra do Arduino
- VCC para os 5v do Arduino
- SDA para a linha de dados I2C, pino A4 do Arduino
- SCL para a linha de clock I2C, pino A5 do Arduino
- SQW para a saída de onda quadrada, mas que não está disponível na simulação.
Vou disponibilizar no link abaixo uma montagem pronta baseada no exemplo do Wokwi para ganharmos tempo:
![]() |
Simulação no Wokwi para o DS1307 |
Link: https://wokwi.com/projects/416102418055818241
Sketch
Nesse código simples estamos incluindo no início a biblioteca RTClib e declarando as variáveis inteiras minutos e segundos. A razão dessas variáveis ficará mais claro logo adiante. Depois estamos instanciando o objeto rtc com base na classe RTC_DS1307 da biblioteca incluída.
Logo abaixo temos a criação de duas matrizes do tipo String para armazenar os dias da semana e e os meses do ano. A função setup apenas inicializa o monitor serial depois testa se o objeto rtc pode ser iniciado com begin().
Se não iniciou envia ao monitor uma mensagem de erro, espera a transmissão de dados seriais terminar com o método flush() depois aborta o programa. A função loop só roda se o rtc for iniciado.
Na linha 23 estamos criando um objeto DateTime chamado agora que recebe o valor do método now() para o objeto rtc. No Wokwi o DS1307 é inicializado automaticamente com a hora atual do sistema.
Nas linhas seguintes vemos o objeto rtc usando os principais métodos da biblioteca que permite ver dia do objeto agora, seu mês, seu ano, sua hora, seus minutos e seus segundos, através respectivamente dos métodos day(), month(), year(), hour(), minute() e second().
O método dayOfTheWeek() está sendo usado para buscar na matriz diadasemana, a string correspondente ao dia da semana de hoje. Esse método começa a contar de zero, como domingo, 1 como segunda e assim por diante.
Já no caso do método month() estamos sendo obrigados a tirar -1 de seu valor para poder buscar uma correspondência na matriz de meses do ano.
No caso de minutos e segundos, como eles são impressos no meio depois do ":", ficaria feio aparecer apenas um dígito no caso dos valores entre 0 e 9. Assim, incluímos um zero através de um teste das variáveis. Por isso aparece 01, 02, 03, etc, ao invés de 1, 2, 3...
- #include "RTClib.h"
- int minutos;
- int segundos;
- RTC_DS1307 rtc;
- String diasdasemana[7]= {"Domingo", "Segunda-feira","Terça-feira",
- "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sábado"};
- String meses[12] = {"janeiro", "fevereiro", "março", "abril",
- "maio","junho", "julho", "agosto", "setembro", "outubro",
- "novembro", "dezembro"};
- void setup () {
- Serial.begin(9600);
- if (! rtc.begin()) {
- Serial.println("Não foi possível inicial o RTC!");
- Serial.flush();
- abort();
- }
- }
- void loop () {
- DateTime agora = rtc.now();
- Serial.print("Hoje é ");
- Serial.print(diasdasemana[agora.dayOfTheWeek()]);
- Serial.print(", ");
- Serial.print(agora.day(), DEC);
- Serial.print(" de ");
- Serial.print(meses[agora.month()-1]);
- Serial.print(" de ");
- Serial.println(agora.year(), DEC);
- Serial.print("Agora são ");
- Serial.print(agora.hour(), DEC);
- Serial.print(':');
- minutos=agora.minute();
- if (minutos<10){
- Serial.print("0");
- Serial.print(minutos, DEC);
- }
- else{
- Serial.print(minutos, DEC);
- }
- Serial.print(':');
- segundos=agora.second();
- if (segundos<10){
- Serial.print("0");
- Serial.print(segundos, DEC);
- }
- else{
- Serial.print(segundos, DEC);
- }
- Serial.println();
- delay(5000);
- }
Acho que mostramos o básico de como utilizar um RTC. Cabe agora ao estudante buscar mais conhecimento. Minha sugestão é que você dê uma olhada nesse exemplo do Wokwi para fazer um despertador e tente melhorá-lo:
Link para um exemplo de alarme do Wokwi: https://wokwi.com/projects/297787059514376717
Referências
ARDUINO E CIA Use o RTC DS1307 com Arduino. Disponível em <https://www.arduinoecia.com.br/real-time-clock-rtc-ds1307-arduino/> Acesso em 01 dez 2024.
BLOG ELETROGATE. Conhecendo a Fundo o RTC. Disponível em <https://blog.eletrogate.com/serial-clock-serial-date-e-i%c2%b2c-conhecendo-a-fundo-o-rtc/> Acesso em 01 dez 2024.
BLOG ELETROGATE. RTC – Real Time Clock DS1302, 1307 e 3231. Disponível em <https://blog.eletrogate.com/rtc-real-time-clock-ds1302-1307-e-3231/> Acesso em 01 dez 2024.
MAKER HERO. Relógio Arduino com DS1307: 3 modos diferentes. Disponível em <https://www.makerhero.com/blog/relogio-rtc-ds1307-arduino/> Acesso em 01 dez 2024.
WOKWI. Referência do wokwi-ds1307. Disponível em <https://docs.wokwi.com/pt-BR/parts/wokwi-ds1307> Acesso em 01 dez 2024.