Funzionamento Serial Monitor

Salve a tutti, sono nuovo sull’utilizzo di Arduino ma ho già fatto tante prove di quelle presenti su “Learning” adesso mi sto cimentando con un RTC è precisamente il DS1307.
Premetto che tutto sembra funzionare ol sketch caricato è il seguente:

#include <Wire.h>

#define DS1307_I2C_ADDRESS 0x68
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

void setDateDs1307(){
   second = 00;
   minute = 23;
   hour = 17;
   dayOfWeek = 5;
   dayOfMonth = 31;
   month = 3;
   year = 11;
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.send(0x00);
  Wire.send(decToBcd(second));
  Wire.send(decToBcd(minute));
  Wire.send(decToBcd(hour));
  Wire.send(decToBcd(dayOfWeek));
  Wire.send(decToBcd(dayOfMonth));
  Wire.send(decToBcd(month));
  Wire.send(decToBcd(year));
  Wire.endTransmission();
}

void getDateDs1307(){
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.send(0x00);
  Wire.endTransmission();
  
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
  second = bcdToDec(Wire.receive() & 0x7f);
  minute = bcdToDec(Wire.receive());
  hour = bcdToDec(Wire.receive() & 0x3f);
  dayOfWeek = bcdToDec(Wire.receive());
  dayOfMonth = bcdToDec(Wire.receive());
  month = bcdToDec(Wire.receive());
  year = bcdToDec(Wire.receive());
}
void setup () {
    Serial.begin(9600);
    Wire.begin();
    pinMode(13, OUTPUT);
    setDateDs1307();
}

void loop () {
    getDateDs1307();
      Serial.print(hour, DEC);
      Serial.print(":");
      Serial.print(minute, DEC);
      Serial.print(":");
      Serial.print(second, DEC);
      Serial.println(" ");
    
    delay(2000);
}

Detto ciò non capisco perché ogni volta che apro il serial monitor l’orario che leggo dall’RTC viene nuovamente riportato a quello che inizializzo nel setup.
Grazie
Saluti
Nicola

Cerco di spiegarmi meglio, dalle prove che ho fatto ho verificato che l'RTC funziona, com'è giusto che sia, indipendentemente, però a questo punto non capisco perché quando apro il serial monitor l'orologio si resetta alla data e l'ora che ho inserito? Mi sarei aspettato che il SM avrebbe letto la chiamata alla funzione getDateDs1307 nell'istante in cui lo lancio, se non è così allora come faccio? avevo pensato di scrivere sulla EEPROM (magari solo un paio di letture) e quindi leggere da questa.

Ciao, anche a me succedeva la stessa cosa, questo perchè ogni volta che viene aperta la seriale avviee il reset dell' ATMEGA e quindi lo sketch riparte dall'inizio, per evitare ciò ho utilizzato 2 sketch, uno per impostare l' RTC ( senza aprire la seriale ed un'altro per leggere l' RTC.

Spero di esserti stato utile.

Ciao.

Io uso la libreria RTClib di Adafruit. Essa ha una funzione che controlla se l'RTC è funzionante oppure no, nel caso non sia funzionante si può riprogrammare: in questo modo non si azzera l'ora nel caso l'orologio stia andando. La funzione in oggetto ha questo codice:

uint8_t RTC_DS1307::isrunning(void) {
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.send(0);    
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 1);
  uint8_t ss = Wire.receive();
  return !(ss>>7);
}

Non sarà difficile adattarla e farne una semplice funzioncina da integrare nel tuo sketch per controllare se l'orologio va oppure no.