Hoje vou montar um esquema bem simples de relógio usando o DS1307, um circuito integrado RTC (Real Time Clock), que nada mais é do que um chip que “conta o tempo”. Vamos então ver como conectar e programar o DS1307 com Arduino. Você também pode usar o mesmo princípio para controlar um módulo RTC DS1307.
O chip RTC DS1307
As principais características do chip DS1307 são:
- Conta Ano, mês, semana, dias da semana, dias, horas, minutos, segundo
- Identifica anos bissextos
- Utiliza interface I2C, usando apenas 2 pinos para se comunicar com o Arduino, ao contrário do seu antecessor DS1302, que usa 3 pinos.
Circuito DS1307 com Arduino
Monte o circuito abaixo na protoboard. O cristal é de 32,768 KHz, eu tirei o meu de uma motherboard antiga. Tenho mais um que tirei de um relógio quebrado, que você com certeza também tem jogado em algum canto aí na sua casa. Vários aparelhos eletronicos tem um cristal desses dentro. 😉
Abaixo temos os esquema de ligação com o Arduino. Como o DS1307 usa a interface I2C para comunicação, vamos conectar o chip nos pinos A4 (SDA) e A5 (SCL) da placa:
Um detalhe é a bateria, que é obrigatória nesse circuito. Sem ela, o CI gera alguns resultados bem estranhos. A bateria serve também para que, caso o Arduino seja desligado, as informações de data e hora sejam preservadas. O consumo do CI é baixíssimo (500 nano ampéres), o que significa que uma bateria de 3V ligada permanentemente ao circuito dura muito tempo.
No meu caso, usei uma CR2032, dessas que a gente encontra na motherboard do computador.
Finalmente, vamos ao programa. Carregue o programa abaixo no seu Arduino:
// Programa : Data e Hora com DS1307 // Autor : Arduino e Cia #include "Wire.h" #define DS1307_ADDRESS 0x68 byte zero = 0x00; void setup() { Wire.begin(); Serial.begin(9600); //A linha abaixo pode ser retirada apos setar a data e hora SelecionaDataeHora(); } void loop() { Mostrarelogio(); delay(1000); } void SelecionaDataeHora() //Seta a data e a hora do DS1307 { byte segundos = 40; //Valores de 0 a 59 byte minutos = 59; //Valores de 0 a 59 byte horas = 23; //Valores de 0 a 23 byte diadasemana = 1; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc. byte diadomes = 17; //Valores de 1 a 31 byte mes = 4; //Valores de 1 a 12 byte ano = 13; //Valores de 0 a 99 Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados //As linhas abaixo escrevem no CI os valores de //data e hora que foram colocados nas variaveis acima Wire.write(ConverteParaBCD(segundos)); Wire.write(ConverteParaBCD(minutos)); Wire.write(ConverteParaBCD(horas)); Wire.write(ConverteParaBCD(diadasemana)); Wire.write(ConverteParaBCD(diadomes)); Wire.write(ConverteParaBCD(mes)); Wire.write(ConverteParaBCD(ano)); Wire.write(zero); //Start no CI Wire.endTransmission(); } byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD return ( (val/10*16) + (val%10) ); } byte ConverteparaDecimal(byte val) { //Converte de BCD para decimal return ( (val/16*10) + (val%16) ); } void Mostrarelogio() { Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS, 7); int segundos = ConverteparaDecimal(Wire.read()); int minutos = ConverteparaDecimal(Wire.read()); int horas = ConverteparaDecimal(Wire.read() & 0b111111); int diadasemana = ConverteparaDecimal(Wire.read()); int diadomes = ConverteparaDecimal(Wire.read()); int mes = ConverteparaDecimal(Wire.read()); int ano = ConverteparaDecimal(Wire.read()); //Mostra a data no Serial Monitor Serial.print("Data: "); Serial.print(diadomes); Serial.print("/"); Serial.print(mes); Serial.print("/"); Serial.print(ano); Serial.print(" "); Serial.print("Hora : "); Serial.print(horas); Serial.print(":"); Serial.print(minutos); Serial.print(":"); Serial.print(segundos); switch(diadasemana) { case 0:Serial.println(", Domingo"); break; case 1:Serial.println(", Segunda"); break; case 2:Serial.println(", Terca"); break; case 3:Serial.println(", Quarta"); break; case 4:Serial.println(", Quinta"); break; case 5:Serial.println(", Sexta"); break; case 6:Serial.println(", Sabado"); } }
O que ele faz nada mais é do que setar a data e a hora, como indicado no programa, e depois mostrar esses valores no serial monitor, como na figura abaixo:
A linha 15 do programa, com a indicação SelecionaDataeHora(), é utilizada para setar os dados iniciais do relógio e pode ser comentada posteriormente, já que o DS1307 estará sendo alimentado pela bateria.
Por último, não podia esquecer do Datasheet do DS1307, que você encontra aqui.