RTC DS3231 impostare allarmi

Claudio_FF:
...
Non mi spiego le righe che ziopippo dice portano al risultato corretto:

tmpYear = year() - 1999;

tm.Year = tmpYear - 2018;



...perché non sappiamo ne quale valore assuma 'tmpYear' per un anno conosciuto, ne cosa è stato fisicamente scritto (e quindi riletto) nell'RTC, e inoltre con quelle sottrazioni e assegnamenti forse ci sono di mezzo dei rollover e troncamenti di bit (tmpYear è 8 o 16 bit? con segno o senza?).

Cioè, in apparenza dovrebbe essere semplicissimo, nel programma lavoro sempre e solo con un anno int (range 1970..2069) e lascio fare conversioni/scritture/letture alla lib, in pratica non ho capito che problema ci sia (anche perché quella lib non la so usare :confused: ).

Year ritorna un anno int 1970..2069
Vedo che setTime accetta sempre un anno int 1970..2069:


void setTime(int hr,int min,int sec,int dy, int mnth, int yr){
// year can be given as full four digit year or two digts (2010 or 10 for 2010); 
//it is converted to years since 1970
  if( yr > 99)
      yr = yr - 1970;
  else
      yr += 30; 
  tm.Year = yr;
  ....


(EDIT: anche se mi sembra che nello spezzone di codice sopra ci sia un errore... 70+30 dovrebbe dare 0 e non 100)

Quindi non dovrebbe esserci alcun problema a lavorare sempre e solo con un anno int 1970..2069

Questa è la dichiarazione delle variabili:

char const * wdays[] = {"Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"}; // definisco i giorni della settimana
uint8_t tmpHours, tmpMinutes, tmpDurata, tmpDay, tmpMonth, tmpYear;
int stato, scelta, sceltaTemp = 0; //vabialibi per il case switch
bool TermoDay = false;
tmElements_t tm;

Il motivo per cui ho dovuto fare quelle strane sottrazioni non me lo spiego neanche io, soprattutto quella relativa al 2018. Ho semplicemente provato ad impostare la data attuale, ho visto cosa mi restituiva con

void digitalClockDisplay()
{
  int wd = weekday();
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(' ');
  Serial.print(wdays[wd - 1]);
  Serial.print(", ");
  Serial.print(day());
  Serial.print('/');
  Serial.print(month());
  Serial.print('/');
  Serial.print(year());
  Serial.println();
  delay(1000); // wait one second between clock display
}

ed ho fatto gli opportuni "aggiustamenti" fino a che non mi restituiva una data pari a quella inserita.
Se ai bisogno che faccia delle precise verifiche dimmi pure :wink: