SUPORTE TÉCNICO
De segunda à sexta pelo e-mail:
suporte@robocore.net
CENTRAL DE ATENDIMENTO
De segunda à sexta das 8:00 às 17:00
(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!


fernandoadsl
date Enviado: 2022-03-23 11:04:52
giovani nao executa o if o que esta errado?

if ((agora.hour() == horaLigar) && (agora.minute() == minutoLigar)&& (diasDaSemana[agora.dayOfTheWeek()]) == "Quarta") {  
    digitalWrite(PINO_RELE, HIGH);

Giovanni5
date Enviado: 2022-03-23 11:46:13
fernandoadsl
A lógica criada parece correta. Certifique-se que o módulo configurou os parâmetros corretamente. Vale lembrar que com as lógicas "&&" (AND), o "if()" só executará o que deseja se todas as condições forem verdadeiras. Também é importante verificar se não há outra condição ou acionamento que está impedindo o funcionamento correto do código.

fernandoadsl
date Enviado: 2022-03-23 09:37:09
Pensei nisso só queria deixar o código menor somente com uma linha de comando
Obrigado

fernandoadsl
date Enviado: 2022-03-23 08:32:49
<if(diasDaSemana[agora.dayOfTheWeek()]) == "Quarta")>  //preciso de mais de um dia na semana como seria? por exemplo quarta e quinta

Giovanni5
date Enviado: 2022-03-23 09:01:39
fernandoadsl
Você pode utilizar esta condição mencionada de quarta feita como base para replicar a lógica para quinta. Basta copiar esta condição, e alterar "Quarta" para "Quinta".

fernandoadsl
date Enviado: 2022-03-22 22:52:00
para definir o dia da semana alternado como seria separado por virgula ou ponto virgula? tipo de segunda a quinta? como seria o codigo?

Giovanni5
date Enviado: 2022-03-23 08:01:41
fernandoadsl
A configuração deve ser feita através da ordem dos dias da semana salvos no vetor "diasDaSemana[][]". Se estiver configurando o módulo em uma quarta-feira, por exemplo, coloque "Quarta" na posição "0" do display, e os dias seguintes em ordem crescente, pois o módulo irá contar os dias de 0 à 6 a cada 24 horas.

fernandoadsl
date Enviado: 2022-03-22 22:49:05
Poderia me dizer com controlar um rele em dias alternados da semana tipo: Terça e Quinta.

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

Giovanni5
date Enviado: 2022-03-23 08:03:38
fernandoadsl
Você pode utilizar uma condição que utiliza a posição de contagem do vetor "diasDaSemana[][]", por exemplo <if(diasDaSemana[agora.dayOfTheWeek()]) == "Quarta")>, e então executar o que desejar se a condição for verdadeira.

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.