Problemas com relé

Ok... aquele código parece correcto para mim.

Quanto ao que pretendes fazer, queres uma função que vá buscar a data e hora para meter no lcd, certo?

Experimenta adicionar isto no inicio:

struct data_hora {
   unsigned char minuto; 
   unsigned char hora;
   unsigned char dia;
   unsigned char mes;
   unsigned int ano;
} agora;

Isto é uma estrutura de dados que cria uma variável com o nome agora.

Depois a tua função printDate, passa a chamar-se updateTime e fica assim:

void updateTime(struct data_hora *dt){
   Wire.beginTransmission(DS1307_ADDRESS);
   Wire.write(zero);
   Wire.endTransmission();
   Wire.requestFrom(DS1307_ADDRESS, 7);
   int dummy = (unsigned char)bcdToDec(Wire.read());
   dt->minuto = bcdToDec(Wire.read());
   dt->hora = (unsigned char)bcdToDec(Wire.read() & 0b111111); 
   dummy = bcdToDec(Wire.read()); 
   dt->dia = (unsigned char)bcdToDec(Wire.read());
   dt->mes = (unsigned char)bcdToDec(Wire.read());
   dt->ano = bcdToDec(Wire.read());
}

Depois tens de fazer update à estrutura agora em todos os ciclos.

void loop() {
updateTime(&agora);
}

E para usares a estrutura agora, fazes assim:

void printLCD(){
  lcd.setCursor(0,0);
  lcd.print(celsius);
  lcd.write(1);    
  lcd.setCursor(0,1);
  lcd.print(agora.hora);
  lcd.print(":");
  lcd.print(agora.minuto);