Libreria SD ed apertura di file in sequenza

Ciao a tutti,

Sto lavorando su un progetto IoT ed il primo prototipo dovrebbe salvare sulla scheda SD i dati di vari sensori, con un file per ognuno di essi.
Utilizzo un Arduino Zero con shield Wifi.

Il codice di esempio ReadWrite della libreria SD funziona quasi sempre, dove per quasi intendo il fatto che ogni tanto alla prima accensione bisogna dare un reset (o fare togli e metti con l'SD) altrimenti non trova il file sulla scheda.

Quello che invece mi turba è che modificando lo sketch per le mie esigenze, cioè se apro più file uno dopo l'altro, e quindi dopo avere chiuso quello precedente, molto spesso la funzione SD.open() fallisce.

Ho creato uno sketch di esempio:

Lo sketch che ho provato è il seguente:

  #include <Wire.h>
  #include "RTClib.h"
  #include <SD.h>

  RTC_DS1307 rtc;


  void setup()
  {
    pinMode(LED_BUILTIN, OUTPUT);

    Wire.begin();

    Serial.begin(9600);
    Serial.println(F("Starting in 5 seconds"));
    delay(5000);

    if (! rtc.begin())
      Serial.println("Couldn't find RTC");




  }

  void loop()
  {
    bool status=true;

    DateTime now = rtc.now();

    int light, temp, hum, CO2, eCO2, tVOC;

    delay(1000);                    //IMPORTANT


    File myFile;

    myFile = SD.open("LUX.txt", FILE_WRITE);
    // if the file opened okay, write to it:
    if (myFile) {
      Serial.print(F("Writing to LUX.txt..."));
      myFile.print(light);
      myFile.print(F(" "));
      myFile.print(now.year(), DEC);
      myFile.print(F("/"));
      myFile.print(now.month(), DEC);
      myFile.print(F("/"));
      myFile.print(now.day(), DEC);
      myFile.print(F(" "));
      myFile.print(now.hour(), DEC);
      myFile.print(F(":"));
      myFile.print(now.minute(), DEC);
      myFile.print(F(":"));
      myFile.println(now.second(), DEC);
      // close the file:
      myFile.close();
      Serial.println(F("done."));
    }
    else
    {
      Serial.println(F("error opening LUX.txt"));
      status=false;
    }

    myFile = SD.open("temp.txt", FILE_WRITE);
    // if the file opened okay, write to it:
    if (myFile) {
      Serial.print(F("Writing to TH.txt..."));
      myFile.print(temp);
      myFile.print(F(" "));
      myFile.print(now.year(), DEC);
      myFile.print(F("/"));
      myFile.print(now.month(), DEC);
      myFile.print(F("/"));
      myFile.print(now.day(), DEC);
      myFile.print(F(" "));
      myFile.print(now.hour(), DEC);
      myFile.print(F(":"));
      myFile.print(now.minute(), DEC);
      myFile.print(F(":"));
      myFile.println(now.second(), DEC);
      // close the file:
      myFile.close();
      Serial.println(F("done."));
    }
    else
    {
      Serial.println(F("error opening TH.txt"));
      status=false;
    }

    myFile = SD.open("HUM.txt", FILE_WRITE);
    // if the file opened okay, write to it:
    if (myFile) {
      Serial.print(F("Writing to HUM.txt..."));
      myFile.print(hum);
      myFile.print(F(" "));
      myFile.print(now.year(), DEC);
      myFile.print(F("/"));
      myFile.print(now.month(), DEC);
      myFile.print(F("/"));
      myFile.print(now.day(), DEC);
      myFile.print(F(" "));
      myFile.print(now.hour(), DEC);
      myFile.print(F(":"));
      myFile.print(now.minute(), DEC);
      myFile.print(F(":"));
      myFile.println(now.second(), DEC);
      // close the file:
      myFile.close();
      Serial.println(F("done."));
    }
    else
    {
      Serial.println(F("error opening HUM.txt"));
      status=false;
    }

    myFile = SD.open("ECO2.txt", FILE_WRITE);
    // if the file opened okay, write to it:
    if (myFile) {
      Serial.print(F("Writing to ECO2.txt..."));
      myFile.print(eCO2);
      myFile.print(F(" "));
      myFile.print(now.year(), DEC);
      myFile.print(F("/"));
      myFile.print(now.month(), DEC);
      myFile.print(F("/"));
      myFile.print(now.day(), DEC);
      myFile.print(F(" "));
      myFile.print(now.hour(), DEC);
      myFile.print(F(":"));
      myFile.print(now.minute(), DEC);
      myFile.print(F(":"));
      myFile.println(now.second(), DEC);
      // close the file:
      myFile.close();
      Serial.println(F("done."));
    }
    else
    {
      Serial.println(F("error opening ECO2.txt"));
      status=false;
    }

    myFile = SD.open("TVOC.txt", FILE_WRITE);
    // if the file opened okay, write to it:
    if (myFile) {
      Serial.print(F("Writing to TVOC.txt..."));
      myFile.print(tVOC);
      myFile.print(F(" "));
      myFile.print(now.year(), DEC);
      myFile.print(F("/"));
      myFile.print(now.month(), DEC);
      myFile.print(F("/"));
      myFile.print(now.day(), DEC);
      myFile.print(F(" "));
      myFile.print(now.hour(), DEC);
      myFile.print(F(":"));
      myFile.print(now.minute(), DEC);
      myFile.print(F(":"));
      myFile.println(no
 w.second(), DEC);
      // close the file:
      myFile.close();
      Serial.println(F("done."));
    }
    else
    {
      Serial.println(F("error opening TVOC.txt"));
      status=false;
    }


    myFile = SD.open("CO2.txt", FILE_WRITE);
    // if the file opened okay, write to it:
    if (myFile) {
      Serial.print(F("Writing to CO2.txt..."));
      myFile.print(CO2);
      myFile.print(F(" "));
      myFile.print(now.year(), DEC);
      myFile.print(F("/"));
      myFile.print(now.month(), DEC);
      myFile.print(F("/"));
      myFile.print(now.day(), DEC);
      myFile.print(F(" "));
      myFile.print(now.hour(), DEC);
      myFile.print(F(":"));
      myFile.print(now.minute(), DEC);
      myFile.print(F(":"));
      myFile.println(now.second(), DEC);
      // close the file:
      myFile.close();
      Serial.println(F("done."));
    }
    else
    {
      Serial.println(F("error opening CO2.txt"));
      status=false;
    }

    digitalWrite(LED_BUILTIN, status);


  }

Come vedete lo sketch non fa altro che salvare 6 interi, per il momento senza significato, su 6 file differenti insieme ad un timestamp.
Quello che succede 9 volte su 10, aprendo la seriale, è il fallimento a catena dell'apertura di più file.
Mi spiego meglio:
Quasi sempre non riesce ad aprire il primo file, quindi non ne apre nessuno dopo, restituendo:
error opening LUX.txt
error opening TEMP.txt
error opening HUM.txt
error opening ECO2.txt
error opening TVOC.txt
error opening CO2.txt

A volte invece magari apre i primi due, al terzo fallisce e di conseguenza anche il quarto quinto e sesto, tipo:
Writing to LUX.txt
Writing to TEMP.txt
error opening HUM.txt
error opening ECO2.txt
error opening TVOC.txt
error opening CO2.txt

Quello che invece ho notato è che se non collego l'arduino alla seriale, ma lo alimento tramite un alimentatore, come ho fatto per tutta questa notte, non fallisce mai nessuna apertura dei file.
Lo so perchè ho i file che ha scritto durante questa notte con i relativi timestamp, facendo prima vari riavvii e vedendo che funzionava sempre. (Magari ho avuto dei colpi di culo consecutivi :slight_smile: )

Qualcuno sa aiutarmi? Ho provato a formattare l'SD in vari modi, sia con i tool di sistema (macOS), sia con quello sviluppato da Tuxera che si chiama "SD Card Formatter".

Boh, ho provato lo stesso codice su di un arduino MKR1000 e shield ethernet e non sembra dare più problemi :roll_eyes: