RTC DS3231 impostare allarmi

Claudio_FF:
Ok, tutto chiaro, più o meno, c'è ancora un errore nascosto da qualche parte ma adesso è chiaro.

Partiamo dal principio.

La funzione 'year()' restituisce un valore a 16 bit compreso tra 1970 2069.

La cosa più semplice sarebbe quindi usare una 'tmpYear' da 16 bit (una banale variabile tipo int) per manipolare l'anno (regolandolo quindi con l'encoder dal 1970 al 2069), e poi sottrarre 1970 quando la si vuole copiare nella 'tm.Year', perché 'tm.Year' è un offset rispetto al valore 1970. Tutto questo in tabella 1, semplice, lineare, nessuna possibilità di errore:
...

Il caso è chiuso :slight_smile:

Dunque, caro il mio Sherlock Holmes, hai dimenticato di dire anche elementare Watson! :grin:
Grazie alla tua tenacia e capacità di aver saputo spiegare l'arcano anche ad un asino (come me!)
Ho optato per ridichiarare tmpYear come int ed ho corretto il codice in questo modo:

void SetYear() // Modifico l'anno
{
  if (LCDML_BUTTON_checkUp()) // incremento i minuti
  {
    tmpYear = tmpYear < 99 ? tmpYear + 1 : tmpYear;
    lcd.setCursor(x, y);
    lcd.print(tmpYear + 1970);
    LCDML_BUTTON_resetUp();
  }
  else if (LCDML_BUTTON_checkDown()) // decremento i minuti
  {
    tmpYear = tmpYear > 30 ? tmpYear - 1 : tmpYear;
    lcd.setCursor(x, y);
    lcd.print(tmpYear + 1970);
    LCDML_BUTTON_resetDown();
  }
  else if (LCDML_BUTTON_checkEnter()) // termino
    scelta = 3;
  LCDML_BUTTON_resetEnter();
}

void SaveDateTime() // Memorizzo Data ed ora
{
  tm.Hour = tmpHours;             //set the tm structure to 23h31m30s on 13Feb2009
  tm.Minute = tmpMinutes;
  tm.Second = 0;

  tm.Day = tmpDay;
  tm.Month = tmpMonth;
  tm.Year = tmpYear;

  SyncRTC(); // Sincronizzo il RTC per recuperare la data corretta
  RTC.write(tm);            //set the RTC from the tm structure
  Serial.println(F("MEMORIZZO ED ESCO"));
  SyncRTC(); // Sincronizzo il RTC per aggiornare ora e data sul display
}

e... tutto FUNZIONA QUASI ALLA PERFEZIONE!
L'unico "problema" che resta è quello di non fare il controllo sugli anni bisestili e comunque sui mesi con data inferiore a 31 giorni. Impostando ovviamente tipo il 31 aprile salva, ovviamente, come data il 01 maggio.
Controllo che detto tra noi non mi ero ancora posto.
Ho completato tutto il progetto come lo avevo pensato. Non sono riuscito ad inserire delle componenti grafiche sul display utilizzando i custom char perchè ne fa già uso la libreria LCDMenuLib e non capisco il motivo per cui mi bypassa le definizioni che vorrei aggiungere. Ho anche chiesto aiuto sulla sezione dedicata in tedesco (scrivendo in inglese) ma nessuna risposta in merito.
Purtroppo (e per fortuna, per altri fronti) il mio tempo, causa lavoro, da dedicare a questo progetto è quasi finito quindi, se qualcuno sa darmi una soluzione facile ed indolore per gestire il problema della data < a 31 la implemento atrimenti "amen".

Grazie ancora per la vostra infinita pazienza!!! :kissing: