#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68


// Conversione normali numeri decimali in binario decimale
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}
// Conversione decimale binario a normali numeri decimali
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}
/* 
 1) Imposta la data e l'ora del DS1307
 2) Avvia l'orologio
 3) Imposta la modalità di ora in orologio a 24 ore
 */
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.write(decToBcd(second)); // 0 to bit 7 avvia l'orologio
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(dayOfWeek));
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(0x10); 
// invia 0x10 (hex) 00010000 (binario) al registro
// di controllo - si attiva ad onda quadra
  Wire.endTransmission();
}
// Ottiene la data e l'ora dal DS1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  // Ripristina il puntatore del registro
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
  // Alcuni di questi sono necessari, perché
  //le maschere di alcuni bit sono bit di controllo
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
// Occorre modificare questo se 12 ore am/pm
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void setup()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  Wire.begin();
  Serial.begin(9600);
 /*
 Modificare i successivi valori se si desidera impostare l'orologio.
 Occorre attivare la linea setDateDs1307 una volta quindi rimuovere
 la chiamata.
 */
  second = 0;
  minute = 56;
  hour = 11;
  dayOfWeek = 7;
  dayOfMonth = 21;
  month = 03;
  year = 15;

//  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

}
void loop()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  delay(1000);
}
GND5VSDASCLSQWRTCDS1307+