Per quanto riguarda l'RTC (DS3231) non ho mai maneggiato la data ma solo l'ora, usando esclusivamente la libreria Wire (obbligatoria se non si vuole riscrivere a mano il protocollo i2c) e la tabella registri di pagina 11 del datasheet.
In pratica con queste due funzioni:
void leggiRTC()
{
Wire.beginTransmission(0x68); // <--- indirizzo RTC su bus i2c
Wire.write(1); // <--- punta al registro 1 (minuti)
Wire.endTransmission();
Wire.requestFrom(0x68, 2); // <--- due registri da leggere
if(Wire.available() == 2)
{
minuti = BCDbin(Wire.read());
ore = BCDbin(Wire.read());
}
}
void impostaRTC()
{
Wire.beginTransmission(0x68); // <--- indirizzo RTC su bus i2c
Wire.write(0); // <--- punta al registro 0 (secondi)
Wire.write(0); // <--- azzera secondi RTC
Wire.write(binBCD(minuti)); // <--- imposta minuti RTC
Wire.write(binBCD(ore)); // <--- imposta ore RTC
Wire.endTransmission();
}
E aiutandomi per la conversione binario<->BCD con queste due:
byte BCDbin(byte n)
{
return ((n >> 4) * 10) + (n & 0x0F);
}
byte binBCD(byte n)
{
return ((n / 10) << 4) | (n % 10);
}
Il tutto prevede due variabili globali 'ore' e 'minuti', che conterranno rispettivamente da 0 a 23 e da 0 a 59.