RTC DS1307 issue

Hi, I’m an Arduino beginner. I’m trying to use a RTC DS1307 circuit with an Arduino Leonardo.
I’m experiencing some trouble. because it doesn’t behave correctly.
The code I’m using is:

//Function: This procedure applies to the Arduino MEGA 2560 to read and write the DS1307.Using the serial port to display the current time.
//Time: August 16, 2012
#include <Wire.h>
  uint8_t seconds = 30;//Initialization time
  uint8_t minutes = 43;
  uint8_t hours = 14;
  uint8_t week = 4;
  uint8_t days = 16;
  uint8_t months = 8;
  uint16_t Year = 12;
int bcd2bin(int temp)//BCD  to decimal
{
	int a,b,c;
	a=temp;
	b=0;
	if(a>=16)
	{
		while(a>=16)
		{
			a=a-16;
			b=b+10;
			c=a+b;
			temp=c;
		}
	}
	return temp;
}

int bin_to_bcd(int temp)//decimal to BCD
{
	int a,b,c;
	a=temp;
	b=0;
	if(a>=10)
	{
		while(a>=10)
		{
			a=a-10;
			b=b+16;
			c=a+b;
			temp=c;
		}
	}
	return temp;
}
void setup () {
    Serial.begin(9600);
    Wire.begin();
    //begin(void) {return 1;}
}
 
void loop () {
  /*Wire.beginTransmission(0x68);//DS1307 write the initial time
  Wire.write(0);
  Wire.requestFrom(0x68, 7);
  Wire.write(bin_to_bcd(seconds));
  Wire.write(bin_to_bcd(minutes));
  Wire.write(bin_to_bcd(hours));
  Wire.write(bin_to_bcd(week));
  Wire.write(bin_to_bcd(days));
  Wire.write(bin_to_bcd(months));
  Wire.write(bin_to_bcd(Year));	
  Wire.endTransmission();*/
  
  while(1){
  Wire.beginTransmission(0x68);//Send the address of DS1307
  Wire.write(0);//Sending address	
  Wire.endTransmission();//The end of the IIC communication
  
  Wire.requestFrom(0x68, 7);//IIC communication is started, you can continue to access another address (address auto increase) and the number of visits
    seconds = bcd2bin(Wire.read());//read time
    minutes = bcd2bin(Wire.read());
    hours = bcd2bin(Wire.read());
    week = Wire.read();
    days = bcd2bin(Wire.read());
    months = bcd2bin(Wire.read());
    Year = bcd2bin(Wire.read()) + 2000;
   
      Serial.print(Year, DEC);//Serial display time
      Serial.print('/');
      Serial.print(months, DEC);
      Serial.print('/');
      Serial.print(days, DEC);
      Serial.print(' ');
      Serial.print(hours, DEC);
      Serial.print(':');
      Serial.print(minutes, DEC);
      Serial.print(':');
      Serial.print(seconds, DEC);
      Serial.println();
      Serial.print(" week: ");
      Serial.print(week, DEC);
      Serial.println();
      delay(5000);
  }
}

and I connect the RTC DS1307 to the Leonardo card in the way described in the attached file.
Now, the problem is when I compile the code and transfer it to the arduino, the serial monitor does not print the right values, but just a series of 255 values.
What can be the reason? Could anyone help me?
thanks
Antonio

Read this before posting a programming question

Please use code tags.

joyce973: Now, the problem is when I compile the code and transfer it to the arduino, the serial monitor does not print the right values, but just a series of 255 values.

Have you got an example of the output? As far as I can see, the output should at least be formatted as a date/time value, even if the numbers are wrong.

I don't know what the Wire interface does, but Serial returns -1 (0xFF or 255) when there is no byte available. Do you need to wait until there is a byte available on the Wire interface before reading it?

 Wire.write(0);
  Wire.requestFrom(0x68, 7);
  Wire.write(bin_to_bcd(seconds));
  Wire.write(bin_to_bcd(minutes));
  Wire.write(bin_to_bcd(hours));
  Wire.write(bin_to_bcd(week));
  Wire.write(bin_to_bcd(days));
  Wire.write(bin_to_bcd(months));
  Wire.write(bin_to_bcd(Year));    
  Wire.endTransmission();*/

This is not how you use Wire. Please read this:

http://www.gammon.com.au/i2c

Is there a reason you aren't using one of the RTC libraries? You can certainly do it yourself, but it seems like the hard way to do it.

Hello again. After some months I’ve tried again with the RTC library.
The code I’m using is:

// 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(9600);
    Wire.begin();
    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(__DATE__, __TIME__));
  }
}

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

    delay(3000);

but the result is not good.
The log I’m receiving is:

2165/165/165 165:165:85
2165/165/165 165:165:85
2165/165/165 165:165:85

Why? I really don’t understand what are my mistake.
Could you help me, please?

Read this, middle of page about TWI:

http://arduino.cc/en/Main/ArduinoBoardLeonardo

This leonardo has I2C bus on different pins than what you expect on UNO. You wired A4 and A5 to the RTC, as if you were using an UNO. Wire them to digital 2 and 3 or the dedicated I2C headers instead.

Now it works!!! Thank you sooo much :) A

Sorry again, but after few minutes the RTC module lost all the data stored, showing "2000/1/1 0:00:00". Maybe the battery is exhausted... What do you think about?

The battery in the clock module should be good for ten years.

This sort of output 2165/165/165 165:165:85 could be indicative of inadequate power to the main board.

Nick_Pyner: The battery in the clock module should be good for ten years.

This sort of output 2165/165/165 165:165:85 could be indicative of inadequate power to the main board.

In this case, it's probably because the pins weren't connected correctly. Some battery is good for 10 years but I'm not sure about this particular one. If after removing the battery the clock runs without problem, then it's probably the battery.

I recommend the OP to simply use an RTC library so the code is guaranteed to work then the focus could be on code other than I2C communication and wiring of the circuit.

Ok. But now it stores date/time correctly and I can read it (i.e. 01/23/2013 10.23), ok? But when I disconnect the RTC from the Arduino board and reconnect it after 2-3 minutes, the date/time is reset again. That's why I believed the battery was low. was I right? A

Yes you are right. Get a new battery and make sure it is inserted in the holder correctly.

thank you :)

I tested the battery and found it was completely exhausted. I tried again using a new CR 2032 but it seems not to work, maybe because it's a 3V battery instead of 3.6V. Could that be the reason?