Errore Scrittura SD e Reset automatico

Vero, ma visto che dal log della SD ha fatto 155 cicli prima di crashare, a 5 byte per ciclo sarebbero solo 775 byte. Il problema secondo me è nell'accoppiata di questa malloc() e l'uso delle "String"! Ad esempio ha fatto tutte quelle righe con sprintf() per formattare data ed ora (tralasciamo per ora il malloc()) per poi costruirci due String (di cui poi una "data" totalmente inutile perché mai utilizzata), poi ha usato una funzione "pad2()" per fare semplicemente il pad di mese o giorno (che in realtà ha più correttamente fatto prima con sprintf()) ed anche qui altra String temporanea!

Insomma, un po' di confusione o un "minestrone" di pezzi di codice.
Per riassumere, togliere tutte le String è cosa buona e giusta, unita all'evitare il malloc() anche questo inutile, basta definire una variabile globale stringa (non "String") di dimensioni adeguate per poterla usare in ogni caso di conversione da numeri a stringa.

Quindi al nostro amico proporrei queste modifiche:

...
// NO! 
//String mese[12] = {"Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"};
char mese[][12] = {"Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"};
// Nuova variabile buffer per le conversioni in stringa
char buf[20];
...
    // non servono più
    //String data = "";
    //String ora = "";
...
    now = rtc.now();
    // Evitare...
    //char *res = malloc(5);
   // commentare tutte le successive righe per "data" e "ora"

    lcd.setCursor(0,0);

    //lcd.print (pad2(now.day()) + " " + mese[(now.month()-1)] + " " + ora);
    sprintf(buf, "%02d %s %02d:%02d:%02d", now.day(), mese[(now.month()-1)], now.hour(), now.minute(), now.second());
    lcd.print (buf);

...   ed infine:
    //String fileName = ""; // qui metto il nome del file cui vado a scrivere la riga
    //String log = ""; //qui metto la stringa della riga che vado a scrivere
    //fileName = String(now.year()) + "-" + pad2(now.month()) + ".log";
    //log = pad2(now.day()) + ";" + ora + ";" + String(Anemometer);
    //logFile = SD.open(fileName, FILE_WRITE);
    sprintf(buf, "%d-%02d.log", now.year(), now.month());
    logFile = SD.open(buf, FILE_WRITE);
    if (logFile) {
      // Non potendo usare sprintf per i float, dato che il valore iniziale è un 
      // byte usiamo questo workaround...
      sprintf(buf, "%02d;%02d;%d.%d",  now.day(), now.month(), 
          Anemometer_buf[4]/10, Anemometer_buf[4]-10*(Anemometer_buf[4]/10));
      logFile.println(buf);
      logFile.close();
    } else {
      lcd.clear();
      lcd.print("Errore Scrittura");
    }
1 Like