[Risolto] Aumentare ora e minuti memorizzati nel DS3231 tramite pulsanti

Buongiorno a tutti,
come da oggetto sto cercando di modificare l'ora memorizzata nel mio RTC DS3231 utilizzando due pulsanti, uno per aumentare di una unità il valore delle ore e uno per fare la stessa cosa con i minuti.
Ho provato a scrivere un po' di codice, ma tutti i miei tentativi sono falliti.

Attualmente, con il codice che allego a questo post ottengo solamente di azzerare l'ora con la pressione del bottone dei minuti collegato al pin 8.

Utilizzo una scheda Arduino nano (clone) a cui è collegata una striscia led ws2812b con 128 led tramite il pin 9 e alimentata a 5V; il moduilo RTC DS3231 è collegato tramite i pin SDA e SCL e alimentato direttamente dalla scheda Nano tramite i pin 17 e 16.

Ora, vi chiedo se potete darmi una mano a capire cosa non va, sono alle prime armi quindi non infierite per favore se ho scritto qualche cavolata!

Grazie

#include <FastLED.h>
#include <DS3232RTC.h>
#include <TimeLib.h>
#define LED_PIN     9     //pin a cui è collegato il cavo DATA della striscia led
#define NUM_LEDS    128   //numero di LED della striscia
// mod pulsanti regolazione ora
#define PORA        7     //pin a cui è collegato il pulsante delle ore
#define PMINUTI     8     //pin a cui è collegato il pulsante dei minuti
// fine mod pulsanti regolazione ora
DS3232RTC myRTC(false);
tmElements_t tm;
time_t t;
CRGB leds[NUM_LEDS];
CHSV colour( 0, 255, 180);
int counter=0, 
// mod pulsanti regolazione ora
valO=0, valM=0;
// fine mod pulsanti regolazione ora

const int Digits[10][10] =
{
  {7,8,10,11,14,18,22,24},
  // Inizio modifica Francesco Inversione led centrali numero 1
  //{14,16,18,22,24}, 
  {14,15,16,17,18},
  // Fine modifica Francesco Inversione led centrali numero 1
  {7,8,9,11,14,16,18,24},
  {7,9,11,14,16,18,22,24},
  {9,10,11,16,18,22,24},
  {7,9,10,11,14,16,18,22},
  {7,8,9,14,15,16,18,22},
  {7,11,14,16,17,24},
  {7,8,9,10,11,14,16,18,22,24},
  {7,9,10,11,14,16,17,24},
};
void setup()
{
    pinMode(17, OUTPUT); //ground and v5 for clock module
    pinMode(16, OUTPUT);
    // mod pulsanti regolazione ora
    pinMode(PORA, INPUT);        // imposta il pin digitale come input
    pinMode(PMINUTI, INPUT);     // imposta il pin digitale come input
    // fine mod pulsanti regolazione ora
    digitalWrite(17, HIGH);
    digitalWrite(16, LOW);
    FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
    myRTC.begin();
}

   
//function that uses the Digit array to display numbers between 0 and 100
void displaynumber( int place , int number){
  for (int i = 0 ; i < 10 ; i++) {
    if (Digits[number/10][i] != 0) {
      leds[(Digits[number/10][i]+place)] = CRGB(255,255,255);;
    }
    if (Digits[number%10][i] != 0) {
      leds[(Digits[number%10][i]+28+place)] = CRGB(255,255,255);;
    }
  }
}

void loop(){
  RTC.read(tm);
   
  //changes the colour of background every 10 cycles
  if (counter<10){
    counter++;
  }else{
    colour.hue = (colour.hue+1)%256;
    counter=0;
  }

  // sets background to rainbow colours
  for ( int i=0; i< 128;i++){
    colour.hue = (colour.hue+1)%256;
    leds[i]= colour;
  }
  colour.hue = (colour.hue+128)%256;
  
  displaynumber(0,tm.Hour);
  displaynumber(70,tm.Minute);

  //display colons
  if ( tm.Second%2 == 0 ){
    leds[64] = CRGB(255,255,255);
    leds[66] = CRGB(255,255,255);
  }
  FastLED.show();
  
    // mod pulsanti regolazione ora
  valO = digitalRead(PORA);           // legge il valore dell'input e lo conserva in valO
  valM = digitalRead(PMINUTI);        // legge il valore dell'input e lo conserva in valM
  
  if (valO == HIGH)                   // se il pulsante ore è premuto
      {                 
    if (tm.Hour == 23)                // se le ore sono 23 l'aumento le riporta a 00
      {
      tm.Hour = 0 ;
      }         
    else 
      {
      tm.Hour++;                      // aumenta l'ora di una unità per tutte le altre ore iniziali
      }
    delay(500);
    }
  if (valM == HIGH)                   // se il pulsante minuti è premuto
      {                 
    if (tm.Minute == 59)              // se i minuti sono 59 l'aumento li riporta a 00
      {
      tm.Minute = 0 ;
      } 
    else 
      {
      tm.Minute++;                    // aumenta i minuti di una unità per tutti gli altri minuti iniziali
      RTC.set(t);                     // aggiorna (setta) il modulo RTC
      setTime(t);                     // aggiorna (setta) il modulo RTC
      }
    delay(500);
    }
  // fine mod pulsanti regolazione ora 
}

ferra1980:
Attualmente, con il codice che allego a questo post ottengo solamente di azzerare l'ora con la pressione del bottone dei minuti collegato al pin 8.

La primissima cosa che mi salta all'occhio è che fai:

      RTC.set(t);                     // aggiorna (setta) il modulo RTC
      setTime(t);                     // aggiorna (setta) il modulo RTC

ma t non lo hai mai inizializzato e tantomeno variato.
la prima istruzione mi suona anche potenzialmente corretta, forse però con tm più che con t, sempre che siano coerenti i tipi dato utilizzati, non ho presente la libreria per cui vado sulla fiducia con un ragionamento puramente teorico.
La seconda istruzione mi suona strana, non c'è un oggetto su cui richiamare il metodo, sicuro che si compili e non dia errore di compilazione?
L'oggetto istanziato su cui lavorare sarebbe poi myRTC...
Non ho il tempo di approfondire la libreria, al momento, ma a prima vista noto parecchie stranezze.
Prova a fare ordine sugli oggetti di lavoro per l'rtc verificando di richiamare i metodi sugli oggetti corretti e verificando di passare i parametri corretti.
Appena ho un po' più di tempo cercherò di approfondire meglio.

In pratica, con questo 'if' incrementi il valore delle ore nella struttura tm

if (valO == HIGH)                   // se il pulsante ore è premuto
      {                 
    if (tm.Hour == 23)                // se le ore sono 23 l'aumento le riporta a 00
      {
      tm.Hour = 0 ;
      }         
    else 
      {
      tm.Hour++;                      // aumenta l'ora di una unità per tutte le altre ore iniziali
      }
    delay(500);
    }

con quest'altro 'if' incrementi il valore dei minuti, sempre nella struttura tm

 if (valM == HIGH)                   // se il pulsante minuti è premuto
      {                 
    if (tm.Minute == 59)              // se i minuti sono 59 l'aumento li riporta a 00
      {
      tm.Minute = 0 ;
      } 
    else 
      {
      tm.Minute++;                    // aumenta i minuti di una unità per tutti gli altri minuti iniziali
      RTC.set(t);                     // aggiorna (setta) il modulo RTC
      setTime(t);                     // aggiorna (setta) il modulo RTC
      }
    delay(500);
    }

e, per finire, sempre in questo ultimo if, quindi solo quando incrementi i minuti, ignori totalmente la struttura tm e imposti RTC usando la variabile t (che e' sempre a 0)

RTC.set(t);                     // aggiorna (setta) il modulo RTC

e imposti ancora con t il tempo di sistema (che rimane sempre a 0).

setTime(t);                     // aggiorna (setta) il modulo RTC

Per non parlare di un oggetto myRTC creato all'inizio del codice e mai utilizzato.
Un copia e incolla da diversi esempi di uso della libreria RTC? Mah.

Comunque, a mio avviso, una routine loop corretta (che usa i valori incrementati di tm) potrebbe essere questa

void loop(){
  RTC.read(tm);
   
  //changes the colour of background every 10 cycles
  if (counter<10){
    counter++;
  }else{
    colour.hue = (colour.hue+1)%256;
    counter=0;
  }

  // sets background to rainbow colours
  for ( int i=0; i< 128;i++){
    colour.hue = (colour.hue+1)%256;
    leds[i]= colour;
  }
  colour.hue = (colour.hue+128)%256;
  
  displaynumber(0,tm.Hour);
  displaynumber(70,tm.Minute);

  //display colons
  if ( tm.Second%2 == 0 ){
    leds[64] = CRGB(255,255,255);
    leds[66] = CRGB(255,255,255);
  }
  FastLED.show();
  
    // mod pulsanti regolazione ora
  valO = digitalRead(PORA);           // legge il valore dell'input e lo conserva in valO
  valM = digitalRead(PMINUTI);        // legge il valore dell'input e lo conserva in valM
  
  // qui crea una variabile che diventa true se modifichi le ore o i minuti
  bool tempoModificato = false;
  
  if (valO == HIGH)                   // se il pulsante ore è premuto
      {                 
    if (tm.Hour == 23)                // se le ore sono 23 l'aumento le riporta a 00
      {
      tm.Hour = 0 ;
      }         
    else 
      {
      tm.Hour++;                      // aumenta l'ora di una unità per tutte le altre ore iniziali
      }
      
      tempoModificato = true;
    }
    
  if (valM == HIGH)                   // se il pulsante minuti è premuto
      {                 
    if (tm.Minute == 59)              // se i minuti sono 59 l'aumento li riporta a 00
      {
      tm.Minute = 0 ;
      } 
    else 
      {
      tm.Minute++;                    // aumenta i minuti di una unità per tutti gli altri minuti iniziali
      }
      
      tempoModificato = true;
    }
 
 	// se hai modificato le ore o i minuti aggiorna RTC e fa una pausa di 500 millisecondi   
    if (tempoModificato)
    {
    	RTC.write(tm);
    	delay(500);
    }
  // fine mod pulsanti regolazione ora 
}

Innanzitutto grazie ad entrambi per le risposte. In effetti sto cercando di imparare e credo che fare delle prove con esempi sia la cosa migliore. Ovviamente ho fatto degli errori, e ho chiesto il vostro aiuto per comprenderli.
Domani studierò i vostri suggerimenti e posterò i risultati!
Grazie per il vostro tempo!

Grazie! Ora funziona perfettamente e, cosa più importante, ho imparato qualcosa! Vi ringrazio!