SUPORTE TÉCNICO
De segunda à sexta pelo e-mail:
suporte@robocore.net
CENTRAL DE ATENDIMENTO
De segunda à sexta das 8:00 às 17:30
(11) 3522-7626 / vendas@robocore.net
Retornar
ao topo

Real Time Clock - Primeiros Passos



Introdução

RTC, ou real-time clock, é um relógio que mantém o controle do tempo real e possui calendário completo. Ele está presente em quase todos os dispositivos eletrônicos que precisam manter um controle preciso do tempo.

Embora o controle do tempo possa ser feito sem um RTC, o uso dele traz benefícios, tais como:

  • Baixo consumo de energia (importante quando se está operando com baterias);
  • Libera o sistema principal para tarefas mais críticas;
  • É mais preciso do que outros métodos.

Este tutorial trará os conceitos básicos para que você possa configurar e fazer uso dessas funcionalidades através de seu Arduino e assim executar ações em horários predeterminados.

Lista de Materiais

Circuito

O módulo RTC DS1307 também possui espaço na parte superior para um sensor de temperatura, tornando possível montar um relógio completo com data, hora, dia da semana e temperatura, sem a necessidade de outros componentes.

Como podemos ver na imagem abaixo, o módulo RTC possui os pinos de alimentação VCC e GND, o pino SD que é responsável pelo sensor de temperatura, também o pino BAT que indica tensão da bateria e os pinos de comunicação SDA (slave data) e SCL (slave clock)

  Modulo RTC DS1307
Módulo RTC DS1307

Monte o circuito da imagem abaixo.

Conexao do RTC DS1307 com a  BlackBoard
Conexão do RTC DS1307 com a BlackBoard

Programação

Para o código ser compilado, é necessário incluir a biblioteca RTClib e também a biblioteca Wire (esta já vem inclusa na IDE do Arduino).

Download da Biblioteca

Caso não saiba como fazer esse processo, temos um tutorial para isso. Clique no botão abaixo.

Adicionando Bibliotecas na IDE Arduino

Já com a biblioteca adicionada, copie e carregue o código.

Entendendo o Código

A biblioteca RTClib é usada para facilitar a integração com o módulo RTC e, como ela depende da comunicação I2C/TWI, também é necessário incluir a biblioteca Wire.

No início do programa criamos um objeto a partir da classe do RTC que estamos usando, no caso o DS1307, e também o vetor diasDaSemana para escrever o dia da semana como texto na porta serial.

Com o comando rtc.begin(), iniciamos o RTC. Se a inicialização não for bem sucedida, uma mensagem é exibida no Monitor Serial e o programa fica travado nesse ponto. Logo após, temos um comando que está como comentário, rtc.adjust(). Se por algum motivo seu RTC estiver sem bateria ou perdeu a contagem o tempo, altere a hora e a data e remova o comando dos comentários da sua programação para definir o horário no módulo. Depois de ter definido o horário, tornar essa linha um comentário, senão o mesmo horário será armazenado toda vez que a placa for reiniciada.

Posteriormente, é feita uma leitura das informações contidas no RTC com o comando rtc.now(). Essas informações são armazenadas na variável agora como um objeto DateTime, e enviadas para a porta serial uma a uma usando os métodos disponibilizados (por exemplo agora.hour() para obter as horas).

Para terminar, inserimos uma pausa com o comando delay(1000) para definir o intervalo de atualização das mensagens exibidas no Monitor Serial.

O Que Deve Acontecer

Ao abrir o Monitor Serial em 9600 bps, mensagens parecidas com as da imagem abaixo devem ser impressas na tela.

Monitor Serial imprimindo a data, dia da semana e hora
Monitor Serial imprimindo a data, dia da semana e hora
Avatar


Para fazer comentários é necessário estar logado. Efetuar login.

Você ainda nao é cadastrado? Cadastre-se agora!


ismaelruperto
date Enviado: 2021-06-16 23:26:44
Olá Giovanni5, vc respondeu sobre o pino bat do módulo rtc... Quando vc fala de buffer analógico, está se referindo a um CI como o LM 741?

Giovanni5
date Enviado: 2021-06-17 08:08:04
ismaelruperto
O LM741 é um amplificador operacional que pode ser utilizado como um buffer analógico, porém existem alguns modelos de CI que são realmente buffers analógicos, como o AD8244 (https://www.analog.com/media/en/technical-documentation/data-sheets/AD8244.pdf), por exemplo.

ismaelruperto
date Enviado: 2021-06-15 23:31:53
Olá! O pino bat é para ler a tensão da bateria CR2032 (pino de saída) ou é um pino de entrada para que eu possa alimentar como outro tipo de bateria? Em alguns lugares li que é pra uma situação (saída) e em outros que é para a outra situação (entrada). Caso realmente seja um pino de saída, o que achei estranho é que tentei ligá-lo a uma porta analógica e a tensão lida foi coerente com uma bateria nova (cerca de 3V), porém, quando ligo o pino bat está ligado na porta analógico o relógio dá leitura erradas e perde os dados quando o arduino é desligado da alimentação.

Giovanni5
date Enviado: 2021-06-16 11:31:47
ismaelruperto
Por mais que o pino Vbat possa ser usado como uma saída de tensão, não é recomendado, pois as baterias de RTC possui uma capacidade de carga muito baixa, e podem descarregar rapidamente. Normalmente o pino Vbat é utilizado para a adição de uma segunda bateria, ou para a adição de um circuito de carregamento de bateria. De toda forma, os pinos analógicos de microcontroladores possuem uma alta impedância, e não deveria ser um problema ler a tensão da bateria, mas como você está tendo problemas com isso, talvez o uso de um buffer analógico entre o módulo e a placa solucione o problema.

DaMata
date Enviado: 2021-04-10 01:24:15
Boa noite.
Li as duvidas dos amigo nos comentários, porem ainda não consegui intender como alterar o condido para desligar o rele em um determinado horário.
Seria possível explicar em quais linhas tenho que fazer as alterações?

Giovanni5
date Enviado: 2021-04-12 08:23:29
DaMata
Aparentemente você publicou o comentário no tutorial errado, mas já te respondemos no tutorial sobre o acionamento com hora marcada do relé (https://www.robocore.net/tutoriais/acionando-rele-com-rtc-ds1307).

lucasamorimlasso
date Enviado: 2021-01-17 16:30:32
Eu tenho testado o ds3231 com o esp32 q queria saber se tem alguma forma de configurar a hora inicial via contagem do unix??

Giovanni5
date Enviado: 2021-01-18 09:08:47
lucasamorimlasso
Existem algumas referências da própria ESPRESSIF que ensinam como aproveitar o RTC interno do ESP32 (https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html), para esse tipo de aplicação. Outra possibilidade é a criação de um servidor NTP ("Network Time Protocole") (https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/).

lucasamorimlasso
date Enviado: 2021-01-18 11:39:07
lucasamorimlasso
mas a minha divida é mais no caso, tem como por eio da biblioteca RTClib.h eu passar um valor unix em vez  fe uma horário padrão na hora do "rtc.adjust(DateTime(2019, 3, 6, 15, 24, 00));" ??? Pq assim eu já sei com fazer pro meu esp32 pegar o valor unix na hora da 1ª iniciação, mas não sei como definir esse unix pra a biblioteca usar como horário
 inicial

Giovanni5
date Enviado: 2021-01-18 12:07:38
lucasamorimlasso
O único método de atualizar o horário do RTC é pela função "rtc.adjust()", então se você já está coletando os dados do Unix, basta aproveitar esses dados com a função "rtc.adjust()", assim você atualiza a hora do módulo, com o valor de hora coletado pelo Unix, por exemplo. Em outras palavras, você tem que usar as duas funções em conjunto basicamente.

edimilsonls
date Enviado: 2020-08-09 15:35:28
Utilizo o  RTC DS1307 em meu projeto com Uno R3 e com a biblioteca <DS1307.h>, porém tenho percebido que o rtc está resetando quase todos os dias e não estou vendo motivo para isso.
Também utilizo um LCD com o módulo I2C, será que está dando conflito?
O rtc está utilizando os pinos SCL e SDA, o I2C nós pinos A4 e A5

Giovanni5
date Enviado: 2020-08-10 09:27:30
edimilsonls
O uso de dois dispositivos I2C no mesmo barramento não deve ser o problema, desde que eles tenham endereços diferentes. Na configuração do seu código há a função de ajuste ("rtc.adjust()")? Pergunto isso, pois é possível que o conjunto inteiro esteja se reiniciando, o que pode indicar um problema externo, como a alimentação, por exemplo.

Morgantini
date Enviado: 2020-06-12 09:50:01
Bom dia Giovanni. Tenho duas dúvidas:
1 - Estou usando este módulo, inicialmente apenas como um relógio. ao cortar a alimentação, a data e hora congelam. Já testei a bateria e está com 3V. Por precaução coloquei uma novinha e o problema continua. Vc saberia me dizer o que posso fazer para resolver isso?
1 - Existe algum modo das informações sobre dia, mes, hora, minuto e segundo aparecerem com 0 na frente quando forem menores que 10? Pra sanar isso estou usando um if else, mas não sei se esta seria a melhor solução.
Obrigado.

Giovanni5
date Enviado: 2020-06-12 10:42:16
Morgantini
Infelizmente não é possível receber as informações com um digito zero a frente, a melhor maneira de obter este tipo de resposta é através de condições "if,", como você já deve ter feito. Em relação ao funcionamento através da bateria, o módulo deveria continuar contando o tempo normalmente mesmo sendo alimentado somente pela bateria, portanto, certifique-se que o GND do módulo e de sua placa continuam interligados mesmo com a interrupção da alimentação de 5 V, pois caso o contrário, o sistema terá referências diferentes, o que resultará na perda de informações.

carloscarrera47
date Enviado: 2020-06-05 21:43:46
Boa noite, Giovanni5,
O problema é que nao compila , nao reconhece as bibliotecas!

Giovanni5
date Enviado: 2020-06-08 08:33:24
carloscarrera47
Tente carregar o exemplos das bibliotecas de seu projeto, para verificar a compilação das mesmas para a placa, deste modo você conseguirá identificar qual a biblioteca que está com problemas, e qual é o problema.

carloscarrera47
date Enviado: 2020-06-03 20:21:01
Boa Noite
Poderia me dizer com controlar um rele em dias alternados da semana tipo: Terça e Quinta.
Para Hora, minutos etc estou conseguindo, só os dias da semana que nao consigo.
Codigo que uso para minuto:

if (agora.minute() == 45) {
    digitalWrite(PINO_RELE2, HIGH);                             //aciona rele
  }   else {                                                                     //senao
    digitalWrite(PINO_RELE2, LOW);                              //desaciona o rele
  }
Obrigado

Giovanni5
date Enviado: 2020-06-04 08:26:21
carloscarrera47
Para acionar o relé de acordo com o dia da semana, utilize o comando "agora.dayOfTheWeek()". Este comando retorna um número de 1 a 7, sendo 1 para o primeiro dia da semana (Domingo), e 7 para o último (Sábado). Deste modo, basta comparar o dia retornado pelo módulo, para acionar o relé quando desejado, para a terça-feira por exemplo, o comando "if" será "if(agora.dayOfTheWeek() == 3)".

carloscarrera47
date Enviado: 2020-06-04 13:29:25
carloscarrera47
Bom dia, Giovanni5!
Então eu tinha tentado esse comando e tbm não dava certo, colocava 4, ontem que era quarta e nao funcionava e testei com 3 e funcionou, achava que a contagem era De domingo 1 e pelo que vi é segunda 1.
Estranho né!
Obrigado!

Giovanni5
date Enviado: 2020-06-04 13:39:23
carloscarrera47
Bem observado carloscarrera47, na verdade a função "agora.dayOfTheWeek()" conta os dias da semana de 0 a 6 (7 dígitos/dias), onde 0 é domingo, e 6 é sábado, por isso que quarta-feira foi contada como 3, e não como 4.

carloscarrera47
date Enviado: 2020-06-04 13:58:48
carloscarrera47
É isso, rsrsrs
Vlw.
Deixa eu abusar um pouquinho mais, pq não funciona no Nodemcu?
Tenho que tirar I2C das portas A4/A5 e definir nas D1eD2, mas nao dinciona.
Nao reconhece algumas funções das bibliotecas RTC e do LCD.
Obrigado.

Giovanni5
date Enviado: 2020-06-04 14:21:26
carloscarrera47
Os RTC são compatíveis com o NodeMCU, mas não diretamente, pois os dispositivos possuem tensões operacionais distintas (5 V para os módulos RTC (DS1307 e DS3231) e 3,3 V para o NodeMCU). Portanto, para conseguir se comunicar corretamente com o RTC através do NodeMCU, utilize um conversor de nível lógico (https://www.robocore.net/loja/itens-eletronicos/conversor-de-nivel-logico).

alexandreveca
date Enviado: 2020-05-11 22:00:15
Boa noite, ao usar o código na integra obtive o seguinte resultado
Data: 165/165/2165 / Dia da semana: Terca / Horas: 165:165:85
Usando a Shield Datalogger Deek-Robot V1.0

Giovanni5
date Enviado: 2020-05-12 09:52:57
alexandreveca
Normalmente este tipo de resposta obtida está atrelada à inversão dos pinos SDA e SCL da comunicação I2C, porém, por se tratar de um Shield, não há como inverter essa conexão. Infelizmente não trabalhamos com este produto, portanto não poderemos lhe ajudar muito neste caso. Recomendo que você entre em contato direto com o seu fornecedor, para solucionar o seu problema.