Dudas Tiny RTC I2C

Buenos dias a todo el foro, como vereís soy muy novato y necesito una aclaración dispongo de este modulo RTC y la duda que tengo es al cargar el programa en mi arduino(2560R3) con display I2C lo carga bien y el reloj funciona y se visualiza ¿pero? al desconectar alimentación del arduino y volverlo a encender pasado un tiempo el reloj se queda con la hora antigua solo se actualiza si vuelvo a cargar el programa. ¿ Esto es asi o tengo un fallo en el programa ?,.
Muchas gracias por vuestra ayuda.
Juan Andrés

Hola si os sirve de ayuda os pongo el programa que estoy usando.

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

LiquidCrystal_I2C lcd(0x27,16,2);

RTC_Millis RTC;

void setup ()
{
RTC.begin(DateTime(DATE, TIME));
lcd.init();
}

void loop ()
{

DateTime now = RTC.now();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(" ");
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print(' ');
lcd.setCursor(0,1);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
lcd.print(" ");
lcd.println();
delay(1000);
}

Saludos y Gracias

¿¿¿ Nadie me puede indicar si es correcto el funcionamiento del RTC , al apagar y encenderlo de nuevo????.

Gracias

Hola amigo.

antes que nada el código debes resaltarlo utilizando las etiquetas code, en el editor de tu respuesta busca un botón con el simbolo #, para llevar un estándar en el foro.

Primero te sugiero que cheques el voltaje de la batería de respaldo que usa el modulo RTC, tal vez esta descargada y, al quitar la alimentación al arduino el modulo RTC se para totalmente; si todo esta bien con la batería...
Prueba esto:

void setup(){
RTC.begin();
lcd.init();
 
   if (! RTC.isrunning()) {
  RTC.adjust(DateTime(__DATE__, __TIME__));
   }
}

al momento de cargar el sketch el compilador obtiene la fecha del sistema (DATE) y la hora(TIME), asegurate de que estén correctas en tu equipo y también quita la batería del RTC antes de cargarlo, creo que es la misma libreria la que uso yo así que seguro te funciona.

ardummy:
Hola si os sirve de ayuda os pongo el programa que estoy usando.

#include <Wire.h>

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

LiquidCrystal_I2C lcd(0x27,16,2);

RTC_Millis RTC;

void setup ()
{
  RTC.begin(DateTime(DATE, TIME));
  lcd.init();   
}

void loop ()
{
   
    DateTime now = RTC.now();
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print(" ");
    lcd.print(now.day(), DEC);
    lcd.print('/');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.print(' ');
    lcd.setCursor(0,1);
    lcd.print(" ");
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    lcd.print(now.second(), DEC);
    lcd.print("        ");
    lcd.println();
    delay(1000);
}




Saludos y Gracias

Hola Amigo ,
Gracias por la respuesta como veras estoy empezando y tengo muchas dudas ,he colocado to codigo en el programa pero me dice que RTC.begin no declarado,me podias indicar como debo de actuar en el anterior post que colocado el codigo del programa como me has comentado , dime pr favor si lo he realizado bien.

Saludos, Juan

En el include has utilizado comillas ("RTClib.h") en lugar de <RTClib.h>. Si utilizas comillas, los archivos de librería deberán estar en la misma carpeta que tu sketch. Si utilizas <> deberán estar en Arduino\libraries\RTClib
Saludos

Gracias Noter por tu ayuda he cambiado las "" por <> la verdad es que tengo los archivos en Arduino\libraries\RTClib, pero tengo el mismo problema tambien he cambiado la pila pero igual, sigo investigado.

Saludos

solo cambia la funcion setup por esta:

void setup(){
RTC.begin();
lcd.init();
 
   if (! RTC.isrunning()) {
   RTC.adjust(DateTime(__DATE__, __TIME__));
   }
}

Hola ehrja he copiado la funcion como me indicas y me coloca la fecha y la hora mal (6/2/2106 y la 6:31:53). Con mi codigo subido en la pagina la fecha y la hora son correctas.

Gracias por tu gran ayuda me sirve para aprender y conocer mejor la programación.

Saludos

Probablemente la librería que utilizas "RTClib.h" no es la misma que yo tengo :stuck_out_tongue:

En bildr.org tienen un articulo donde mencionan este integrado ds1307, no usa librerías externas pero la hora la tienes que cambiar a mano. Search Results for “ds1307” – bildr.org

busca la funcion: setDateTime()

//Arduino 1.0+ Only
//Arduino 1.0+ Only

#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527


void setup(){
  Wire.begin();
  Serial.begin(9600);
  setDateTime(); //MUST CONFIGURE IN FUNCTION
}

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

void setDateTime(){

  byte second =      45; //0-59
  byte minute =      40; //0-59
  byte hour =        0; //0-23
  byte weekDay =     2; //1-7
  byte monthDay =    1; //1-31
  byte month =       3; //1-12
  byte year  =       11; //0-99

  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator

  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));

  Wire.write(zero); //start 

  Wire.endTransmission();

}

byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)  {
// Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}

void printDate(){

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());

  //print the date EG   3/1/11 23:59:59
  Serial.print(month);
  Serial.print("/");
  Serial.print(monthDay);
  Serial.print("/");
  Serial.print(year);
  Serial.print(" ");
  Serial.print(hour);
  Serial.print(":");
  Serial.print(minute);
  Serial.print(":");
  Serial.println(second);

}

Lo pruebo y te comento.

Saludos

Bueno problema solucionado ya esta mantiene la hora aunque desconecte alimentación del equipo. Pasamos a explicar donde estaba el problema por un lado este RTC esta diseñado para que en vez de llevar una pila CR2032 lleve una bateria recargable tipo LIR 2032,pero claro esa bateria cuesta un precio alto,asi que opto por colocar una pila CR2032. Por internet circula una modificación que dice que se elimine las resistencias R4 y R6 aparte de realizar unos cortes en las pistas de circuito impreso(el cual no estoy de acuerdo porque es nuevo).Una vez quitado dichas resistencias tenia el mismo problema el reloj perdia su hora al apagar alimentación del circuito, volviendo a consultar el esquena y leyendo las caracteristicas del DS1307 observo que la señal Vbat es para introducir una pila de 3v para que mantenga el reloj funcinando aunque la tensión de alimentación se quite ;vuelvo a soldar R6 y R4 y quito el diodo D1 y todo funciona, os coloco esquema de lo esplicado y el programa modificado.

Saludos y gracias a todos en especial EHRJA por su gran ayuda.

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

LiquidCrystal_I2C lcd(0x27,16,2);

RTC_DS1307 RTC;

void setup () {
  
     lcd.init();
     lcd.init();
     lcd.backlight();
     Wire.begin(); // Establece la velocidad de datos del bus I2C
     RTC.begin(); // Establece la velocidad de datos del RTC

}

void loop () {
    
    
    
    DateTime now = RTC.now();
    
    lcd.setCursor(0,0);
    
    lcd.print(" ");
    lcd.print(now.day(), DEC);
    lcd.print('/');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.print(' ');
    
    lcd.setCursor(0,1);
    
    lcd.print(" ");
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    lcd.print(now.second(), DEC);
    lcd.print("         ");
    lcd.println();
    
    delay(1000);
}

Esquema.pdf (95 KB)

Hola ardummy

Tengo también problemas, incluso conectado se va atrasando y si lo desconecto pierde la fecha y la hora.

Voy a hacer pruebas retirando el diodo. Estoy usando una pila LIR2032 recargable y mi duda es si al quitar el diodo se cargará.

Saludos

Parece que una vez retirado el diodo todo funciona correctamente.

Hola jalfonsosuarez si quitas el diodo no te cargara la pila ya que es la LIR2032 es recargable, en mi caso yo uso la CR2032 que es una pila normal. Ese problema tambien lo he tenido y por mi poca experiencia ya que empiezo ahora creo que el problema esta en las librerias , te voy a pasar una direccion de internet que me soluciono el problema lo tengo funcionando desde hace un mes y guarda la hora aun quitando alimentacion del Arduino, el tema de que se atrase el reloj a mi me hace lo contrario se adelanta casi dos minutos por dia y parece que es del reloj en si , segun he leido es porque en pocas palabras es barato y los componentes no dan la estabilidad necesaria para que el cristal de cuarzo(X1) funcione correctamente, estoy esperando un DS3231 segun se dice se atrasa 1s al año veremos si es verdad .

Saludos Feliz 2014