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!


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.