Création d'un nom speudo-aléatoire de fichier

Bonjour à tous,

Pour un projet j'utilise l'arduino nano pour enregistré des données sur une carte sd, jusque la tout marche correctement !

Cependant à chaque allumage de mon montage celui-ci crée un nouveau fichier sur la carte sd cependant quelque fois mon programme réécrit sur un fichier existant...

Je voudrais donc créer un nom de fichiers ou il y a pas de chance ou très peu que celui éxiste ...

Pour cela je pensais à creer un nom de fichier en partie aléatoire, pour cela j'ai utilisé le programme suivant :

  char fileName[20];
  long Numfile = random(1,1000);
  //unsigned int Numfile = randnumber + Nbfile;
  sprintf(fileName,"/mesure%d.txt",Numfile);  
  Serial.println("fichiers  " + String(fileName) + " cree !");
  
  // ouverture du fichier
  
  file = SD.open(fileName, FILE_WRITE); // ouvre le fichier en écriture
  file.seek(file.size()); // positionnement à la fin du fichier
  file.println(" debut programme " );
  file.close(); // ferme le fichier
  Serial.println("fichiers  " + String(fileName) + " cree !");

Cependant, le nombre aléatoire donné est toujours le même, et j’ouvre donc toujours le même fichier :

Debut Initialisation...
Initialisation fini !
fichiers /mesure824.txt cree !
debut programme

Si vous savez pourquoi cela ne fonctionne pas, je suis preneur !

Merci d'avance :slight_smile:

jym92:
Si vous savez pourquoi cela ne fonctionne pas, je suis preneur !

Bonjour
Parce que le generateur aleatoire est en fait un generateur pseudo aleatoire :grin:
si tu n'utilise pas les AD (un suffit)
tu peux ajouter un randomseed
voir ça

Bonjour,

En effet random génère toujours la même séquence.
Il faut l'initialiser avec randomSeed() pour avoir une autre séquence
Si tu as un dateur tu peux composer le nom de fichier avec la date et l'heure

Merci depuis que j'ai rajouter le randomSeed, ca marche très bien :slight_smile:

randomSeed(analogRead(0));

Kamill, tu peux m'en dire un peu plus sur les dateurs, je ne trouve pas grand chose sur internet par contre le principe m'interesse beaucoup ...

C'est un composant externe non à l'arduino nano ?

Dateur: en anglais RTC (real time clock). C'est un composant externe qui permet d'avoir le date et l'heure sur l'arduino.
Les plus utilisés pour l'arduino sont le DS1307 et le DS3231

me voila encore la pour quelques questions !

Après avoir réussi à générer des noms de fichiers aléatoire, je me suis rendu compte que ceux-ci comporter la même date de création .

Hors mon système fonctionne de manière autonome, je n'ai donc aucun moyen de savoir quel est le dernier fichier enregistré lorsque je récupère ma carte sd...
De plus par manque de place, il est impossible pour moi d'ajouter un dateur.

J'ai donc pensé à créer un deuxième fichier texte, qui lui ne contiendrait que le numéro du dernier fichier enregistré !

Voila comment je m'y prends :

 File file; // création d'un objet SdFile pour le fichier utilisé
 File Namefile; // création d'un objet SdFile pour le répertoire racine

  int old_filenumber = 0;
  
  Namefile = SD.open("/name.txt");
  if (Namefile) 
  {
   while (Namefile.available()) 
     {
      //Serial.println("le dernier nom de fichier etait :  " + String(Namefile.read()) + " !");
      old_filenumber =int(Namefile.read());
      Namefile.close();
     }
   }
   else
    {
      old_filenumber = 1;
      Namefile.close();
    }
   
  Namefile = SD.open("/name.txt"); 
  int filenumber = old_filenumber + 1;
  char str_filenumber[6];
  dtostrf(filenumber, 4, 0, str_filenumber);
  Namefile.println(str_filenumber);
  Namefile.close();
  
  
  char fileName[15];
  sprintf(fileName,"/mesure%s.txt",str_filenumber);  
  Serial.println("fichiers  " + String(fileName) + " cree !");

  
  // ouverture du fichier
  file = SD.open(fileName, FILE_WRITE); // ouvre le fichier en écriture
  file.seek(file.size()); // positionnement à la fin du fichier
  file.println(" debut programme " );
  file.close(); // ferme le fichier

Mais comme vous vous en doutez cela ne fonctionne pas et ne trouve ou n'écrit jamais dans le fichier name.txt et il me génère toujours le fichier mesure2.txt ...

des idées ?

Merci :slight_smile:

C'est plus simple de créer des fichiers avec un numéro séquentiel.

l'algo est ultra-simple:

Au départ n=0

Tant que le fichier "mesure n" existe, augmenter n de 1

Créer le fichier "mesure n"

Oui effectivement cela peut paraitre plus simple c'est ce que j'ai essayé de faire, je l'ai expliqué sur un topic(nombre de fichiers présents sur une carte SD ? - Français - Arduino Forum).

Mais la détection de fichier ne fonctionne pas toujours notamment avec les fichiers crée mais vide...

Donc c'est pour cela que je cherche d'autres solutions.....

c’est bizarre ça… j’ai regardé ton autre sujet, ça me semble quand même compliqué de compter les fichiers…

moi j’ai fait comme ça pour mes logs:

	short		idx;
	char		name[13];
	
	idx = 0;
	do
	{
		snprintf (name, 13, "mesure%02d.log", idx++);
	}
	while (SD.exists (name) && idx < 100);

on teste l’existence du fichier “mesure00.log”, s’il existe on essaie avec “mesure01.log”, etc.

on est quand même limité à 100 fichiers (de 00 à 99), sinon il faut raccourcir la mention “mesure” pour utiliser trois chiffres ou même plus:

		snprintf (name, 13, "mes%03d.log", idx++);

Ah oui effectivement c'est bien plus simple comme test, merci ça marche très bien :slight_smile: