[Résolu] Arduino - Créer fichier carte SD

Bonjour,

J'ai acheté un lecteur de carte SD pour Arduino. En effectuant des tests pour voir si tout fonctionnait bien, j'ai remarqué que l'arduino n'arrivait pas à créer plus de 5 fichiers. (Mes fichiers sont en extensions .mid).

Le contexte:

Ce programme est censé récupérer les données envoyées par mon piano et les stocker dans un fichier.

myScreen est un écran LCD.

BPS représente le PIN d'un bouton poussoir.

J'ai une fonction (checkFile) qui regarde quel est le nom du dernier fichier créer (par exemple s'il y a un fichier 1.mid il va créer le fichier 2.mid).

Ensuite cette fonction envoie le nom du fichier à une autre fonctino (writeMess) qui va créer le fichier.

Voici le programme que j'ai fait:

int i =0;
void checkFile(int i)
{
  if (SD.exists( String(i) + ".mid") == true)
  {
    checkFile(i+1);
  }
  else
  {
    myScreen.clear();
    myScreen.print("Check done");
    myScreen.setCursor(0,1);
    myScreen.print(String(i));
    delay(1000);
    writeMess(i);
  }
}
 
void writeMess(int i)
{
      char fileName[7];
      fileName[0] = i +'0';
      fileName[1] = '.';
      fileName[2] = 'm';
      fileName[3] = 'i';
      fileName[4] = 'd';
      fileName[5] = '\0';
             
      myFile = SD.open(fileName, FILE_WRITE);
       
      if(!myFile)
      {
        myScreen.clear();
        myScreen.println("Erreur");
        myScreen.setCursor(0,1);
        myScreen.print(fileName);
        delay(1000);
        myScreen.clear();
        return;
      }
       
      if(myFile)
      {
        myScreen.clear();
        myScreen.print("Writing...");
        myScreen.setCursor(0,1);
        myScreen.print(fileName);
        while(digitalRead(BPS)== 0)
        {
          /*message = MIDI.read();
          myFile.print(message);*/
        }
        myFile.close();
      }
      myScreen.clear();
      myScreen.print("Write done");
      delay(1000);
      myScreen.clear();
      return;
}

Donc je rappel le soucis le programme créer bien les premiers fichiers et à partir du cinquième donc "4.mid" il n'arrive pas à créer le fichier et rentre donc dans le code à exécuter si le fichier ne peut pas être ouvert.

void checkFile(int i)
{
  if (SD.exists( String(i) + ".mid") == true)
  {
    checkFile(i+1);
  }
  else
...

Il n'y a pas tout le code,mais je suppose qu'il y a autre chose, et si l'Arduino n'a pas plus trop de mémoire disponible, il y a un appel récursif qui va remplir la mémoire:
Supposons que la mémoire disponible ne soit plus très importante (la bibliothèque SD mange déjà 500 octets)
On appelle checkFile(0); et le fichier 0.mid existe. La fonction checkFile(0) n'est pas finie, mais elle appelle checkFile(1). Dans la pile, il y a le retour de checkFile(0) avec ses paramètres notamment copie de i, peut ête aussi la string "0.mid".
Le fichier 1.mid existe. La fonction checkFile(1) n'est pas finie, mais elle appelle
checkFile(2). Dans la pile, il y a le retour de checkFile(0) avec ses paramètres notamment copie de i, peut être aussi la string "0.mid", le retour de checkFile(1) avec ses paramètres notamment copie de i, peut être aussi la string "1.mid", ...

Le fichier 4.mid existe. La fonction checkFile(4) n'est pas finie, mais elle appelle checkFile(5). Dans la pile, il y a le retour de checkFile(0) avec ses paramètres notamment copie de i, peut être aussi la string "0.mid", le retour de checkFile(1) avec ses paramètres notamment copie de i, peut être aussi la string "1.mid" le retour de checkFile(2) avec ses paramètres notamment copie de i, peut être aussi la string "2.mid", le retour de checkFile(3) avec ses paramètres notamment copie de i, peut être aussi la string "3.mid", le retour de checkFile(4) avec ses paramètres notamment copie de i, peut être aussi la string "4.mid".
La pile déborde de joie et elle plante l'Arduino

On peut dans checkFile rechercher le premier i possible et faire la suite dans le genre

void checkFile(int i)
{
  while (SD.exists( String(i) + ".mid") == true) i++;

  myScreen.clear();
  myScreen.print("Check done");
  myScreen.setCursor(0, 1);
  myScreen.print(String(i));
  delay(1000);
  writeMess(i);

}

Merci beaucoup pour ta réponse ! J'ai utilisé ta fonction checkFile et d'un coup plus de problème tout fonctionne !
Je vais quand même surveiller la mémoire pour éviter de rencontrer ce genre d'erreur.
Merci beaucoup !