Use o RTC DS1307 com Arduino

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:

Pinagem DS1307

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:

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.

5/5 - (2 votes)

Related posts

Módulo Leitor RFID RDM6300 com Arduino

by Arduino e Cia
7 anos ago

Digispark com módulo bluetooth HC-05

by Arduino e Cia
6 anos ago

Comunicação Arduino e celular usando Blynk

by Arduino e Cia
6 anos ago
Sair da versão mobile