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 :
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á !