Logo Pisciotta

PISCIOTTA

Soluções Inteligentes

PROFESSOR

Listar
Artigos, curiosidades e muitas dicas.

Aproveite, curta, compartilhe.

Real Time Clock (RTC) DS1302



ARDUINO

1110 Views - 16 Curtidas




RTC (Real Time Clock ou Relógio de Tempo Real) são circuitos integrados capazes de armazenar informações de tempo (dia, hora, minutos e segundos), e que após configurados, fazem a contagem do tempo sozinhos. Assim, a grosso modo, o microprocessador pode se dedicar a controlar suas funções sem se preocupar em errar o horário caso alguma de suas tarefas demore mais do que 1 segundo para ser concluída. Por isso esses dispositivos são chamados de Relógios de Tempo Real, pois podemos estar certos de que a qualquer tempo que consultarmos o relógio, ele estará atualizado.

Os módulos RTC são compostos por um circuito integrado (CI) RTC, um cristal (caso ele não exista internamente à pastilha), e uma fonte de energia dedicada para manter sua memória e a contagem do tempo mesmo que a alimentação principal seja cortada. Essa fonte de energia geralmente é uma bateria de 3V ou um supercapacitor.

RTC DS1302

O RTC DS1302 é um CI da MAXIM que necessita de um cristal externo e uma alimentação externa, e utiliza um protocolo de comunicação TTL a 3 fios. Essa comunicação a 3 fios não é I2C, não é SPI, não é UART. Por isso muita gente não gosta de utilizar esse CI, pois requer um sincronismo dedicado de bits para se conseguir realizar a leitura ou gravação de dados no CI. O próprio site do Arduino.cc não recomenda o uso desse RTC devido a problemas com o cristal e também à complexidade do programa para permitir a comunicação. Contudo, o usuário "Krodal" criou um código que facilita muito a vida do usuário, e depois a VirtuaBotix reuniu em uma biblioteca chamada virtuabotixRTC que pode ser baixada aqui. Esse código controla os três pinos do DS1302: I/O (entrada e saída de dados), clock (sincronismo) e CE (chip-enable, chamado de Reset no passado), e é permitido configurar quaisquer 3 pinos do arduino para essas funções.

O DS1302 funciona normalmente com tensões entre 2,0V e 5,5V. O ano armazenado no DS1302 possui dois dígitos, e vai de 00 para o ano 2000 até 99 para o ano 2099 *(nota: alguns outros dispositivos começam a contar o ano em 1970 ou 1980. Não é o caso do DS1302.). O chip possui ainda 31 bytes de memória RAM que pode ser utilizada, mas claro que se as duas alimentações do chip forem extintas, esses dados serão perdidos. O CI pode trabalhar com formato de hora Europeu (24h) ou Americano (12h AM e PM). O consumo para o armazenamento da informação é inferior a 1 micro Watts.

O datasheet do DS1302 pode ser encontrado aqui.

O módulo que eu adquiri requer o uso de uma bateria CR2032 no suporte para manter o relógio trabalhando mesmo com falta de energia no sistema. Existem módulos que usam baterias menores, e outros que utilizam supercapacitores, mas alguns necessitam dessa alimentação externamente ao Vcc1. Portanto, atenção ao módulo que você possui.

A seguir se encontra o circuito para testar o seu relógio de tempo real. Importante salientar que o programa mostrado adiante vai gravar uma data e hora predefinidos toda vez que o arduino for inicializado. Portanto deve-se realizar a gravação do arduino uma vez com essa linha de configuração do módulo RTC, e logo depois gravar novamente o arduino com essa linha comentada, para ele não mais voltar a data e hora das próximas vezes que o arduino for inicializado.


//Programa Exemplo disponível do site VirtuaBotix
#include 
//Define os pinos utilizados (CLK, DAT, RST)
myRTC(4, 3, 2);

void setup() {
Serial.begin(9600);

// Acerta o relógio com a data e hora no formato:
// segundos, minutos, horas, dia da semana, dia do mês, mês, ano
myRTC.setDS1302Time(00, 05, 17, 6, 21, 4, 2017);
//É importante carregar esse código no Arduino uma vez para configurar o RTC
//Mas logo em seguida deve-se comentar a linha do myRTC.setDS1302Time
//ou seu Arduino vai fazer seu relógio voltar a esta data toda vez que for reiniciado
}

void loop() {
// Atualiza as variáveis de tempo.
myRTC.updateTime();

// Imprime os elementos individuais
Serial.print("Data/hora atual: ");
Serial.print(myRTC.dayofmonth);
Serial.print("/");
Serial.print(myRTC.month);
Serial.print("/");
Serial.print(myRTC.year);
Serial.print(" ");
Serial.print(myRTC.hours);
Serial.print(":");
Serial.print(myRTC.minutes);
Serial.print(":");
Serial.println(myRTC.seconds);

// Aplica espera de 1 segundo
delay(1000);
}

Carregue o código no seu Arduino e abra o Serial Monitor para visualizar a data/hora atual.

Com esse código e algumas pequenas modificações é possível construir um relógio personalizado, e até automatizar algumas operações cotidianas. Consulte o link com o projeto Luminária Automática para Aquário que eu fiz.

Se você gostou, clique em Curtir e compartilhe com seus colegas esse site. Fique à vontade para fazer críticas e propor novos temas na área de Contato. ;)