[Risolto] Gestire errore di scrittura su micro SD.

Usare le funzioni è corretto, così come usare gli array di char che come dici tu all'uscita della funzione il loro "spazio" viene liberato dalla memoria.
Invece la classe String del c++ che usi come tipo della funzione dati su un microcontrollore può generare svariati problemi e risultati poco prevedibili in quanto, contrariamente a ciò che avviene ad esempio su PC, non esisste un garbage collecor che va a "pulire" la memoria da oggetti non più utilizzati portanto a volte a blocchi e/o risultati non facilmente debuggabili.
Quindi segui il consiglio che ti abbiamo fornito ovvero trasforma la funzione dati da String a void, porta la definizione del vettore buf e poi richiami la funzione e usi direttamente buf, ovvero quello che ti ha suggerito pari pari @docdoc.
Il fatto di ricalcolare il nome del file ad ogni ciclo di loop effettivamente era uno spreco di risorse ma non è quello a farti piantare il tutto, comunque ben vengano le ottimizzazioni quindi potresti anche pensare di farlo una volta al mese! con una cosa del genere:

byte mesePrecedente = 13;
...
void loop()
{
 ..
  if (scritto==false && now.minute() == periodo ){      //verifico condizione per scrivere su file
    if(mesePrecedente != now.month())
    {
       sprintf(nomefile,"%02d%02d.txt",now.year(),now.month());
       mesePrecedente = now.month();
    }
}