Problema RTC

Eu estou com um problema com um módulo RTC, nesse caso um igual a esse:

Eu estou usando um display LCD 16x2 para mostrar a hora e a data, o problema é que o horário para de contar quando eu tiro a alimentação do arduino, por exemplo, eu tiro a alimentação do arduino as 16:40, quando eu alimento o arduino novamente as 17:30 ao invés dele exibir o horário atualizado ele exibe 16:40 ainda. Alguma idéia de qual o problema e sua possível solução?

Sketch

/*
Ligação do display LCD:
RS = 12
En = 11
RW = GND
D4 = 5
D5 = 4
D6 = 3
D7 = 2

Ligação do módulo RTC:
SDA = A4
SCL = A5

*/

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>

RTC_DS1307 rtc;
LiquidCrystal lcd(12,11,5,4,3,2);

void setup ()
{
Wire.begin();
rtc.begin();
lcd.begin(16,2);

if(!rtc.isrunning())
{
rtc.adjust(DateTime(DATE,TIME));
}

}

void loop ()
{
DateTime now=rtc.now();

lcd.setCursor(0,0);
lcd.print(now.day(),DEC);
lcd.print("/");
lcd.print(now.month(),DEC);

lcd.setCursor(0,1);
lcd.print(now.hour(),DEC);
lcd.print(":");
lcd.print(now.minute(),DEC);
lcd.print(":");
lcd.print(now.second(),DEC);

delay(1000);
}

Qual é o problema?

Ligou a bateria externa no pino BAT do módulo?

Olá!

Lago, a bateria está do outro lado do PCB não precisa de nenhuma conexão ao BAT.

Douglas, verifique se a bateria está boa e bem conectada.

Abraço.

Obrigado a todos que respoderam!

A bateria está ok, bem encaixada, e também é nova.

Não tinha visto a descrição do problema.

Eu penso que o único problema é esta inicialização:

  if(!rtc.isrunning())
  {
    rtc.adjust(DateTime(__DATE__,__TIME__));
  }

Ou seja, como há algum problema no I2C e na altura do setup() o I2C não está a funcionar, ele troca a hora.
Eu retiraria este adjust e enviaria uma mensagem para o LCD ou para a porta série e esperaria para ver se inicia o funcionamento normal sozinho.
Eu tive problemas muito similares com esse que descreve e eliminei-os adicionando uma resistência de +/- 1k entre SDA e Vcc.

Luis, eu pensei nessa possibilidade mas, o horário mostrado seria o de compilação e não o de desligamento.

Já tirei essa linha e nada, continua o problema

Isso não é problema de software.
Você precisa verificar todas as ligações.
Teste sem a bateria para ver se após religar o relógio será ajustado para o horário de compilação.

Peço desculpa, mas penso que só leram metade do meu post :slight_smile:

luisilva:
(...)enviaria uma mensagem para o LCD ou para a porta série (...)

Eu tive problemas muito similares com esse que descreve e eliminei-os adicionando uma resistência de +/- 1k entre SDA e Vcc.

Porque é que isso acontece? O RTC está em funcionamento na altura do setup? Eu diria que é impossível que quando o programa inicia ele tenha uma hora tão diferente. A única coisa que me estão a lembrar que possa levar a isso é que o cristal não esteja a funcionar correctamente, mas assim, a hora nunca variaria.

Já agora, o meu sketch de testes é este:

#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>


LiquidCrystal lcd(8, 9, 4, 5, 6, 7);           // select the pins used on the LCD panel
RTC_DS1307 RTC;


void setup () {
   Serial.begin(9600);
   
   Wire.begin();
   RTC.begin();
   
   lcd.begin(16, 2);               // start the library
   lcd.setCursor(0, 0);            // set the LCD cursor   position

   if (! RTC.isrunning()) {
      Serial.println("RTC is NOT running!");
      // following line sets the RTC to the date & time this sketch was compiled
      RTC.adjust(DateTime(__DATE__, __TIME__));
   }
}


void loop () {
   DateTime now = RTC.now();
    
   lcd.setCursor(0, 0);            // set the LCD cursor   position
   
   if (now.hour() < 10) {
      lcd.print("0");
   }
   lcd.print(now.hour(), DEC);
   lcd.print(':');
   
   if (now.minute() < 10) {
      lcd.print("0");
   }
   lcd.print(now.minute(), DEC);
   lcd.print(':');
   
   if (now.second() < 10) {
      lcd.print("0");
   }   
   lcd.print(now.second(), DEC);

   lcd.setCursor(0, 1);            // set the LCD cursor   position
   if (now.day() < 10) {
      lcd.print("0");
   }   
   lcd.print(now.day(), DEC);
   lcd.print('/');
   
   if (now.month() < 10) {
      lcd.print("0");
   }   
   lcd.print(now.month(), DEC);
   lcd.print('/');
   
   lcd.print(now.year(), DEC);
   lcd.print(' ');
   
   delay(1000);
}

que é muito parecido ao do post inicial.

Concordo com o Fernando Garcia. Isto só pode ser hardware, o código é tão simples, que não pode ser outra coisa.

Eu também estou achando que é no hardware do módulo, eu li em vários lugares que muitas pessoas que tem esse módulo enfrentam o mesmo problema, mas ninguém sabe a solução.

A única coisa que eu achei foi isso, agora tem que testar para ver se vai resolver:

Olá pessoal.

Desculpem eu ir entrando assim no assunto, mas é porque estou fazendo um tcc e preciso ser rápido.

Eu também estou tendo problemas com este mesmo shield.

Estou usando o RTC DS 1307 que por sinal funcionou por mais ou menos uma hora normal, configurando a data e relógio certinho. Porém, depois não consegui mais reescrever mais. Estou monitorando pelo Serial Monitor e realmente posso resetar, reinstalar o programa que funcionava antes e nada.

Não sai mais disso: 2099/10/10 1:3:20

Será problema no shield mesmo?

Este é o código que estou utilizando, sendo um dos exemplos da biblioteca "RTClib.h"

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

void setup () {
Serial.begin(57600);
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();

if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(DATE), F(TIME)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
rtc.adjust(DateTime(11, 9, 2014, 14, 2, 9));
}
}

void loop () {
DateTime now = rtc.now();

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

Serial.print(" since midnight 1/1/1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");

// calculate a date which is 7 days and 30 seconds into the future
DateTime future (now.unixtime() + 7 * 86400L + 30);

Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();

Serial.println();
delay(1000);
}

Alguém já viu o esquema deste módulo? Aquilo, para mim, parecem ligações e divisores de tensão a mais...

A pilha vinha com o módulo ou compraste separado?

Repara que na sua infinita inteligência, quem desenhou o módulo fê-lo de forma a drenar a bateria... Tudo bem que funciona sem a pilha no módulo, que é um dos principais problemas dos outros módulos RTC, mas assim é pior. Na minha perspectiva.

Quando reiniciam, o arduinomreporta que o rtc não está a funcionar?