Neste artigo vamos ver como extrair as informações de data e hora do módulo RTC DS1302, 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 :
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á !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | // 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á !
Fonte: http://www.arduinoecia.com.br/2014/11/arduino-modulo-rtc-ds1302.html