Neste artigo vamos ver como extrair as informações de data e hora do módulo RTCDS1302, um módulo que funciona da mesma forma que o DS1307, mas possui algumas diferenças principalmente na parte de comunicação com o Arduino, já que o DS1307 usa I2C e o DS1302 usa comunicação com 3 fios.
O módulo é controlado pelo DS1302 ,um chip do tipo RTC (Real Time Clock, ou Relógio de Tempo Real), com funções de data, hora e calendário. Ele é capaz de fornecer as informações de horas, minutos, segundos, dia da semana, data, mês e ano, e ajusta automaticamente os dados referentes aos meses com menos de 31 dias e também anos bissextos.
Pinagem DS1302
Na imagem abaixo temos a pinagem do CI DS1302 (datasheet) e a função de cada pino:
E abaixo a disposição do CI DS1302 no módulo, que na verdade não possui muitos componentes adicionais, apenas o cristal de 32.768 kHz e a bateria (CR2032) para manter a alimentação do chip em caso de falta de energia:
O CI aceita alimentação de 2 à 5.5V, logo podemos ligar o módulo utilizando os pinos 3.3V ou 5V do Arduino.
Ligação módulo DS1302 ao Arduino
São utilizados três pinos para conexão ao Arduino : RST (Reset ou CE – Chip Enable), DATA (I/O) e CLK (ou SCLK / Serial Clock). Para testes vou alimentar o módulo com os 5V do Arduino:
Como pinos de dados usamos os pinos 6, 7 e 8 do Arduino. Você pode escolher outros pinos do Arduino e mudar essa configuração nas linhas iniciais do programa.
Mostrando as informações de data e hora do DS1302
Existe um artigo no site oficial do Arduino, mostrando em detalhes como ler as informações do DS1302. Para quem gosta de entender como essa comunicação é feita, byte a byte, vale a pena dar uma olhada nessa página: http://playground.arduino.cc/Main/DS1302.
Para a maioria das aplicações esse código é bem extenso e não muito simples de entender, por isso o pessoal da Virtuabotix adaptou esse código e criou uma biblioteca chamada virtuabotixRTC (clique aqui para efetuar o download da biblioteca). Com ela fica muito fácil de extrair as informações do DS1302 e utilizá-las junto com outras funções do Arduino.
Note que no início do programa temos essa linha, que serve para determinar a data e hora atuais :
myRTC.setDS1302Time(<segundos>, <minutos>, <hora>, <dia da semana>, <dia do mês>, <mês>, <ano>)
Uma vez setada a data e a hora, a linha acima deve ser comentada e o programa novamente carregado no Arduino.
Criei o programa abaixo baseado nos exemplos da biblioteca, e acrescentei a rotina que mostra o dia da semana por extenso:
//Programa: Data e hora com modulo RTC DS1302 //Alteracoes e adaptacoes: Arduino e Cia // //Baseado no programa original de Krodal e na biblioteca virtuabotixRTC //Carrega a biblioteca virtuabotixRTC #include <virtuabotixRTC.h> //Determina os pinos ligados ao modulo //myRTC(clock, data, rst) virtuabotixRTC myRTC(6, 7, 8); void setup() { Serial.begin(9600); //Informacoes iniciais de data e hora //Apos setar as informacoes, comente a linha abaixo //(segundos, minutos, hora, dia da semana, dia do mes, mes, ano) myRTC.setDS1302Time(00, 58, 23, 2, 17, 11, 2014); } void loop() { //Le as informacoes do CI myRTC.updateTime(); //Imprime as informacoes no serial monitor Serial.print("Data : "); //Chama a rotina que imprime o dia da semana imprime_dia_da_semana(myRTC.dayofweek); Serial.print(", "); Serial.print(myRTC.dayofmonth); Serial.print("/"); Serial.print(myRTC.month); Serial.print("/"); Serial.print(myRTC.year); Serial.print(" "); Serial.print("Hora : "); //Adiciona um 0 caso o valor da hora seja <10 if (myRTC.hours < 10) { Serial.print("0"); } Serial.print(myRTC.hours); Serial.print(":"); //Adiciona um 0 caso o valor dos minutos seja <10 if (myRTC.minutes < 10) { Serial.print("0"); } Serial.print(myRTC.minutes); Serial.print(":"); //Adiciona um 0 caso o valor dos segundos seja <10 if (myRTC.seconds < 10) { Serial.print("0"); } Serial.println(myRTC.seconds); delay( 1000); } void imprime_dia_da_semana(int dia) { switch (dia) { case 1: Serial.print("Domingo"); break; case 2: Serial.print("Segunda"); break; case 3: Serial.print("Terca"); break; case 4: Serial.print("Quarta"); break; case 5: Serial.print("Quinta"); break; case 6: Serial.print("Sexta"); break; case 7: Serial.print("Sabado"); break; } }
Esse programa envia as informações de data e hora para o serial monitor:
Em um próximo artigo sobre o DS1302, vou utilizar esse módulo para montar um relógio utilizando display 7 segmentos. Até lá!