20 abril 2013

Real Time Clock (RTC) DS1307

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". Suas principais características 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.
Relogio de tempo real DS1307
Pinagem DS1307

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. ;-)

Cristal 32.768 khz


Circuito DS1307 e Arduino
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 usa na motherboard do computador.

Protoboard - Arduino - DS1307
Finalmente, vamos ao programa. Carregue o programa abaixo no seu Arduino :

  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
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
// 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 :

Serial Monitor - RTC DS1307

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.


78 comentários:

  1. Olá, uma pergunta: É possível conectar este DS1307 nos pinos digitais do arduino?

    ResponderExcluir
    Respostas
    1. Não é possível, pois não só o DS1307 como outros dispositivos que utilizamos no Arduino usam o protocolo I2C, que usa o pino A4 do Arduino Uno para o sinal SDA (Dados), e o pino A5 para o SCL (Clock). Abraço.

      Excluir
  2. Tenho um sensor de temp, press e umidade. Como faço para os dados sairem nos dados no cartão de memoria e no display de LCD???

    ResponderExcluir
    Respostas
    1. Bom dia Tuca ! Tenho alguns esquemas aqui no site de ligação e apresentação de dados no display LCD. Ainda não postei nada sobre escrever os dados em cartões, mas é um post no qual já estou trabalhando. Abraço !

      Excluir
  3. não são necessários resistores de pull-up nas linhas de dados?

    ResponderExcluir
    Respostas
    1. Boa noite Daniel. Nessa configuração que eu montei, não houve necessidade de resistores pull-up. Abraço !

      Excluir
    2. Estou curioso, por que não foi necessário?

      Excluir
  4. Olá !!
    Estou integrando um RTC TINY I2C no arduino mega 2560 e percebi que o mesmo (RTC) nao mantem a data e hora atualizados, simplesmente ele guarda a ultima hora e data gerado pelo RTC e quando retorna, retorna com esta data/hora e nao a hora/data corrente. Ex: meu rtc estava com o horario de 12:00:00 e o deixei desligado por 40min. Qdo voltou a funcionar o circuito achava q. a hora deveria ser 12:40:00 , mas ao inves disto o horario continuou em 12:01:00. O que posso estar fazendo de errado ?

    ResponderExcluir
    Respostas
    1. Bom dia !

      Por favor veja se não esqueceu de comentar essa linha do programa :

      SelecionaDataeHora(); //Esta linha pode ser retirada apos setar a data e hora

      Senão, a cada vez que vc ligar o Arduino, ele vai setar a hora novamente. Resumindo, você precisa carregar o programa 2 vezes : 1 vez com o comando acima, para setar a data e a hora, depois você comenta a linha e carrega o programa novamente. Assim, ele vai manter a data e a hora por meio da bateria do RTC.

      Se puder, me conte se funcionou, blz ? Abraço e obrigado !

      Excluir
    2. Olá! Estou com o mesmo problema.

      O módulo está funcional e contando. A linha de setup já está comentada. Mas quando eu desligo o Arduino o timer congela no horario.

      Quando religo, ele simplesmente recomeça de onde parou, não importando quanto tempo ficou parado.

      Excluir
    3. Boa noite Fabiano,

      Estava aqui pensando nesse problema, mas não consegui ter alguma pista. pelo menos em relação à programação.

      Creio que o problema seja físico mesmo. Você tem outro módulo para testar ?

      Abraço.

      Excluir
    4. O void loop() deve estar no final do código.

      Aqui está o código corrigido.

      #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
      //ConfiguraRelogio();
      }

      void ConfiguraRelogio() //Seta a data e a hora do DS1307
      {
      byte hor = 10; //Valores de 0 a 23
      byte min = 37; //Valores de 0 a 59
      byte seg = 00; //Valores de 0 a 59
      byte dia = 29; //Valores de 1 a 31
      byte mes = 2; //Valores de 1 a 12
      byte ano = 16; //Valores de 0 a 99
      byte sem = 1; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
      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(seg));
      Wire.write(ConverteParaBCD(min));
      Wire.write(ConverteParaBCD(hor));
      Wire.write(ConverteParaBCD(sem));
      Wire.write(ConverteParaBCD(dia));
      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 seg = ConverteparaDecimal(Wire.read());
      int min = ConverteparaDecimal(Wire.read());
      int hor = ConverteparaDecimal(Wire.read() & 0b111111);
      int sem = ConverteparaDecimal(Wire.read());
      int dia = ConverteparaDecimal(Wire.read());
      int mes = ConverteparaDecimal(Wire.read());
      int ano = ConverteparaDecimal(Wire.read());
      //Mostra a data no Serial Monitor
      switch(sem)
      {
      case 0:Serial.print("Domingo");
      break;
      case 1:Serial.print("Segunda");
      break;
      case 2:Serial.print("Terca");
      break;
      case 3:Serial.print("Quarta");
      break;
      case 4:Serial.print("Quinta");
      break;
      case 5:Serial.print("Sexta");
      break;
      case 6:Serial.print("Sabado");
      }
      Serial.print(" - ");
      Serial.print(dia);
      Serial.print("/");
      Serial.print(mes);
      Serial.print("/");
      Serial.print(ano);
      Serial.print(" - ");
      Serial.print(hor);
      Serial.print(":");
      Serial.print(min);
      Serial.print(":");
      Serial.print(seg);
      Serial.println();
      }

      void loop()
      {
      MostraRelogio();
      delay(1000);
      }

      Excluir
  5. Alguém sabe como eu faço com modulo de 5 pinos, g , v , sck,sda e int.

    ResponderExcluir
    Respostas
    1. Bom dia Robson !

      Eu tenho um módulo RTC aqui, mas não sei se é o mesmo. Você tem algum link pra mostrar o módulo que você tem aí ?

      Abraço !

      Excluir
    2. O modelo esse aqui http://dx.com/pt/p/meeeno-ds1307-real-time-clock-brick-module-for-arduino-yellow-works-with-official-arduino-boards-213941#.UwD-LVJdVvk valeu.

      Excluir
    3. Oi Robson,

      O módulo que eu tenho aqui é diferente... tem mais pinos.. mas vamos lá. Tente a seguinte ligação :

      Ligue o G no GND
      Ligue o V no Vcc 5v do Arduino
      Ligue o SCK no pino analógico 5 do Arduino
      Ligue o SDA no pino analógico 4 do Arduino

      A princípio, o INT não é usado.

      Depois me fale se funcionou, por favor.

      Abraço !

      Excluir
    4. Valeu, funcionou perfeitamente, e o pino INT esta ligado em uma led que deve ser só para indicão.

      Excluir
    5. Valeu pelo retorno Robson ! Abraço !

      Excluir
    6. Boa noite. Tenho um RTC DS1302, versão anterior ao DS1307. Estou tentando ligá-lo junto para mostrar a a contagem de segundos em um LCD 1602. Até aqui está funcionando perfeitamente. O problema é que agora estou tentando acionar o meu relógio a partir de um App que se comunica com o meu MEGA 2560 por bluetooth, nao está funcionando, nem sequer reconhece que há uma conexão bluetooth ativa, embora esteja pareada. Acredito que há algum conflito com a comunicação serial, uma vez que tanto o bluetooth quanto o DS1302 estão ligados. Você pode me ajudar? Abraço!

      Excluir
    7. Boa noite Sidney,

      Qual aplicativo você está usando no celular ?

      Abraço.

      Excluir
    8. Boa tarde. Estou usando o app "S2 terminal for Bluetooth" que apenas me permite fazer uma conexão com outro dispositivo ao alcance, no meu caso um modulo para Android, e trocar dados em forma de código ASCII. Bom, já consigo receber o tempo do RTC a partir de uma requisição pelo meu app. Meu problema agora é que como estou acionando um motor de passo, quando peço o tempo do meu processo o motor é interropido por um breve mas perceptível tempo. Estou tentando resolver isso com interrupção de timer, sem muito sucesso ainda.

      Excluir
    9. Boa tarde Sidney,

      Você está usando a biblioteca Stepper do Arduino ? Não sei exatamente o que pode ser, mas eu testaria com outra biblioteca, como a CustomStepper, só pra ver o que acontece. Tenho um artigo falando dela :

      http://www.arduinoecia.com.br/2014/04/controlando-motor-de-passo-28byj-48.html

      Abraço !

      Excluir
    10. Boa tarde,

      não estou usando nenhuma biblioteca para acionar o MP, construi o código de acordo com o funcionamento. Pensei em usar alguma, vi inclusive que há uma biblioteca que permite acionar vários MP simultaneamente, mas ainda assim acredito que ficaria restrito.

      Abraço

      Excluir
  6. Opa! Otimo artigo, pergunto seria possivel fazer um contador de tempo com o DS1307? Explico quero fazer uma tranca (aberta mostra a hora normal, fecho pausa esta hora, abro me mostra a hora novamente que parou o pq disso saber o tempo que a tranca ficou fechada) Voce pode me dar uma luz? Abraço!

    ResponderExcluir
    Respostas
    1. Oi Gilberto,

      Interessante esse seu projeto. Me fale o que você já tem pronto. Se preferir, utilize o formulário de contato no lado direito da página do Arduino e Cia para enviar mais detalhes.

      Abraço !

      Excluir
  7. boa dia muito interessante o projeto parabéns. Mais estou com problema quando eu desligo o Arduino ele volta no horário inicial..
    abços

    ResponderExcluir
    Respostas
    1. Bom dia, e obrigado por acessar o Arduino e Cia.

      Veja se você não está esquecendo de comentar ou retirar a linha abaixo, que seta a data e hora. Ela só é necessária na primeira vez que você usar o programa :

      SelecionaDataeHora();

      Espero ter ajudado. Abraço !

      Excluir
  8. Cara, esse site é muito BOM! Faço engenharia elétrica e tenho me aventurado nessa parte de programação. A forma como você expõe ai... facilita bastante pra quem ta começando com programação.

    ResponderExcluir
    Respostas
    1. Valeu ! A ideia do site é apresentar as coisas de forma relativamente simples, para que as pessoas possam desenvolver seus próprios projetos. Não adianta nada eu tentar fazer um robô com câmera, guiado por laser e com 7 motores sem explicar como funciona cada parte. Acho que é por aí. :-)

      Agradeço a visita e volte sempre. Abraço !

      Excluir
  9. Oi, eu sou novo em eletrônica, eu construí o circuito, mas a data vem de dados: 165/165/165 Tempo: 45: 165: 165, o que pode ocorrer. Obrigado, muito bom o seu site.

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Você montou com o CI mesmo ou usou o módulo DS1307 ?

      Abraço !

      Excluir
    2. Estou com o mesmo problema e eu montei no simulador ISIS . . .sabe me dizer o que é?

      Excluir
  10. Oi, eu vi o seu comentário sobre a bateria, verificação e tinha uma conexão solta, e ele funciona, muito obrigado

    ResponderExcluir
    Respostas
    1. Boa noite,

      Legal ter funcionado. Qualquer coisa, estamos ai. :-)

      Abraço !

      Excluir
  11. Estou usando o modulo DS1307, deveria fazer quais alteraçoes para não ter o problema 165/165/165 Tempo: 45: 165: 165

    ResponderExcluir
    Respostas
    1. Boa noite Victor,

      Eu tive um problema parecido, e havia algum problema nos conectores. Eu refiz a solda e funcionou normalmente.

      Abraço !

      Excluir
    2. Arduino e Cia, e no caso de simulação no ISIS o que pode ser?

      Excluir
    3. Bom dia Eduardo,

      No ISIS eu nunca simulei, eu vi algumas dicas sobe incluir um resistor de 220 ohms no pino A5 do Arduino, mas eu ainda não testei.

      Abraço !

      Excluir
  12. Boa tarde, gostaria de saber se tem como deixar a data e a hora nos seguintes formatos respectivamente: dd/MM/yyyy e hh/mm/ss. Pois, observei que nesse programa esses dados estão sendo exibidos desconsiderando os zeros a esquerda e o ano esta no formato yy. Necessito deles no formado citado acima para que minha aplicação funcione normalmente...Tem como fazer isso ?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Por favor dê uma olhada nesse post :

      http://www.arduinoecia.com.br/2014/11/arduino-modulo-rtc-ds1302.html

      Lá eu fiz uma pequena alteração no código para incluir o 0 antes das horas, minutos e segundos caso o valor seja menor do que 10.

      Abraço !

      Excluir
  13. boa noite, quando desligo o arduino deixando só o modulo 1307 ligado com a bateria, as vezes quando ligo no dia seguinte ele esta desregulada a hora,porque

    ResponderExcluir
  14. boa noite, quando compilo da-me o erro SAM-BA operation failed, preciso muito disto pois tenho uma apresentação dia 7 de abril

    ResponderExcluir
    Respostas
    1. Boa noite,

      Qual placa Arduino vc está usando e qual a versão da IDE ? vou ver se consigo reproduzir o erro aqui.

      O programa é o mesmo do post ou você fez alguma alteração ?

      Abraço.

      Excluir
  15. Boa noite.
    teria como fazer a visualização da data/hora pelos displays de 7 segmentos?

    Abraço.

    ResponderExcluir
    Respostas
    1. Bom dia Marcelo,

      Tem sim, eu escrevi um artigo no blog FILIPEFLOP sobre isso, dê uma olhada, por favor:

      http://blog.filipeflop.com/arduino/como-construir-um-relogio-com-arduino.html

      Abraço !

      Excluir
  16. Pessoal, preciso de uma ajuda.
    Como faço para a resolução da data e hora ficar da seguinte maneira:
    Data: 07/09/15
    Hora: 15:02:06
    Porque no programa, a mesma informação acima fica da seguinte maneira:
    Data: 7/9/15
    Hora: 15:2:6
    Alguém poderia me ajudar.
    Muito Obrigado.
    Fábio.

    ResponderExcluir
    Respostas
    1. Oi Fábio,

      Eu tenho uma solução, que se não é a mais "limpa", pelo menos funcionou pra mim quando eu precisei. rs

      Coloque antes do print do numero, um if para saber se ele é menor do que 10. por exemplo:

      Vamos supor que o mes seja 7. Antes do mes, vc coloca o seguinte:
      if (mes < 10)
      {
      Serial.print("0");
      }
      Serial.print(mes);

      Aí vc faz isso para a hora, para o minuto, para o ano, etc. Toda vez que o numero for menor do que 10, ele vai imprimir um "zero".

      Espero ter ajudado. Abraço !

      Excluir
    2. Boa noite amigo,você resolveu o problema de como colocar 0 (zero) antes
      de data, hora, minuto e segundos? Estou com o mesmo problema, pela dica que te deram de colocar if antes do print(mes<10) não deu certo, não carrega o código, da a mensagem expected ','before 'if'. Se conseguiu e puder me ajudar eu agradeço.

      Excluir
  17. Olá.. Bom dia.

    Estou tentando fazer com que o RTC pegue a hora de acordo com servidor de internet (com shield gsm), para ter mais precisão e que não tenha que ficar atualizando no horario de verão.
    Alguem tem alguma ideia.??

    Obrigado. Abraço.

    ResponderExcluir
    Respostas
    1. Também tenho a mesma duvida, fiz um sinalizador de pausas na empresa que trabalho, são 9 no total, e quando muda para o horario de verão tenho que tirar todos e reprogramar

      Excluir
  18. Eu tenho um módulo RTC ,e gostaria de ligar ele em um UNO com servo motor,para cada uma que passar ele acionasse o servo(cada 1 hora passada o servo movimenta 7°)

    ResponderExcluir
    Respostas
    1. Oi Alexsandro,

      Acho que uma maneira bem simples de fazer isso é vc testar o valor da variável "minutos", assim, toda vez que ela chegar no valor que você colocou, ele aciona o motor. Vamos supor que vc queira que ele acione o motor em hora "cheia", tipo 2:00, 3:00, 13:00, etc. Fica mais ou menos assim:

      if (minutos == 0)
      {
      //Comando para acionar o motor 7°
      }

      Abraço!

      Excluir
    2. tabem quero saber testei assim mas nao funcionou sera que rola um tutorial pra ajudar

      Excluir
  19. Bom dia, eu posso usar o rtc para acionar um relé das 18:00 até 06:00, por exemplo?

    ResponderExcluir
    Respostas
    1. Bom dia Fabio,

      Pode sim. Em breve estarei lançando um post com um exemplo como esse.

      Abraço!

      Excluir
  20. Olá,

    Parabéns pela inciativa em divulgar esses projetos.
    Estou rodando esse código e acontece que quando o dia da semana varia de domingo para segunda, ele para de apresentar o dia. Verifiquei que a variável dia da semana passa de 6 para 7 e parece que o programa não reconhece o 7 como um 0. O que pode estar acontecendo?

    ResponderExcluir
    Respostas
    1. Oi Marcus!

      Estranho, ele não deveria passar de 6, já que a numeração vai de 0 a 6, ou seja, contempla os 7 dias da semana.

      Você está usando algum módulo ? Será que o contador não está começando em 1 ?

      Abraço!

      Excluir
  21. Olá,
    Alguém teria uma ideia de como fazer o processo inverso de horas?
    como um painel de microondas, mas com horas e minutos.
    Exemplo: digito 02:30:00, aperto START, e ele faz a contagem regressiva deste tempo?

    ResponderExcluir
  22. PESSOAL ALGUEM CONSEGUIU FAZER ESSE CODIGO ACIONAR UM RELE ATE AGORA NÃO CONSEGUI SE ALGUEM CONSEGUIU FAVOR ME AJUDAR pierre-leal@hotmail.com obrigado

    ResponderExcluir
  23. Olá amigo

    Como faço para mudar o endereço do rtc? Tenho tenho o SDA e SCL ligados em outras portas.

    Como você chegou no valor de 0x68

    Obrigado

    ResponderExcluir
    Respostas
    1. Olá,

      Para verificar qual o endereço do módulo, você pode usar o I2CScanner, conforme eu mostro neste post:

      http://www.arduinoecia.com.br/2015/04/arduino-lcd-16x2-modulo-i2c-rtc-ds1307.html

      Abraço!

      Excluir
    2. Olá.

      Desculpe e confusão. Só estava ligando o SDA e o SCL nos pinos errados.

      Agora está funcionando perfeitamente.

      Parabéns pelo trabalho e obrigado.

      Excluir
  24. Cara,

    No meu arduino 2560 a serial só printa isso

    165/165/165 Hora
    45:165:165

    ResponderExcluir
    Respostas
    1. Oi Mauro,

      No Mega você está ligando os pinos SDA e SCL em quais portas ?

      Abraço!

      Excluir
    2. No meu UNO apareciam estes mesmos valores. Depois de alguns testes, percebi que era mau contato. A programação foi muito bem feita e o RTC funciona perfeitamente. Obrigado!

      Excluir
    3. Olá.

      Desculpe e confusão. Só estava ligando o SDA e o SCL nos pinos errados.

      Agora está funcionando perfeitamente.

      Parabéns pelo trabalho e obrigado.

      Excluir
    4. Que bom que funcionou, Mauro! :)

      Abraço e obrigado!

      Excluir
  25. Boa noite.

    Conforme comentei há pouco, o código funciona perfeitamente. Mas gostaria de sua ajuda: estou tentando fazer uns laços if-else de acordo com as horas, minutos e segundos. Entretanto, só consigo realizá-los dentro da função Mostrarelogio(). Mesmo tentando criar outras funções, ele não consegue ler os valores de horas, minutos e segundos.
    Existe alguma maneira de fazer isso? Ficaria muito agradecido se pudesse me ajudar, pois estou realizando uns trabalhos para a faculdade.
    Desde já agradeço!

    ResponderExcluir
    Respostas
    1. Oi Thiago,

      Conseguiu resolver ?

      Abraço!

      Excluir
    2. Oi thiago tive a mesma necessidade que tu é, o mesmo problema. Por enquanto eu resolvi duplicando a leitura do i2c dentro da nova função. Assim a leitura funciona fora da Mostrarelogio ().

      Excluir
  26. Boa Tarde, Há alguma diferença entre usar somente esses 2 componentes (o ds e o cristal) e usar o módulo especifico pra arduino?
    vide img (http://www.emartee.com/Images/websites/emartee.com/back-1.JPG)

    ResponderExcluir
    Respostas
    1. Oi Jhonata,

      Nenhuma, o esquema de ligação é o mesmo.

      Abraço!

      Excluir
  27. Queria uma ajuda para acionar um rele a cada 40 min e desligar toda 00:00hs, voltando a contar as 6 hs da manhã novamente

    ResponderExcluir