ADF-MICROSD-BREAKOUT-Fonctions

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche

Ecriture de fichiers

Le sketch suivant est une démonstration de base d'écriture dans un fichier.

C'est la méthode utilisée habituellement pour enregistrer des données.

#include <SD.h>

File myFile;

void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
// Sur la platine Ethernet, CS est la broche 4. Elle est définie comme une sortie par défaut.
// Notez que même que si elle n'est pas utilisée comme broche CS, la broche SS 
// (10 sur la plupart des cartes Arduino, 53 sur les Méga) doit être laissée comme une sortie 
// ou les fonctions de la bibliothèque SD ne fonctionneront pas.
   pinMode(10, OUTPUT);

  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

// Ouvrir le fichier. notez qu'un seul fichier peut être ouvert à la fois,
// Il faut donc fermer celui-ci avant d'en ouvrir une autre.
  myFile = SD.open("test.txt", FILE_WRITE);

  // Si le fichier s'est ouvert : nous pouvons y écrire
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
        // fermer le fichier :
    myFile.close();
    Serial.println("done.");
  } else {
    // Si le fichier ne s'ouvre pas, afficher une erreur :
    Serial.println("error opening test.txt");
  }
}

void loop()
{
        // Il n'y a rien à faire ici, après setup()
}

Lorsque vous l'exécuterez, vous devriez voir ceci:

 
Crédit: AdaFruit Industries www.adafruit.com

Vous pouvez ensuite ouvrir le fichier à l'aide de votre système d'exploitation en insérant la carte dans le slot ad hoc de votre PC. Vous verrez une ligne pour chaque fois que le sketch aura été exécuté. C'est-à-dire que le sketch ajoute dans le fichier, et qu'il n'écrase pas le contenu.

 
Crédit: AdaFruit Industries www.adafruit.com

Certains point sont à relever :

  • Vous pouvez avoir plusieurs fichiers ouverts en même temps, et y écrire comme vous le souhaitez.
  • Vous pouvez utiliser print et println() comme des commandes du port série (Serial), pour écrire des chaînes de caractères (string), des variables, etc
  • Vous devez fermer close() le(s) fichier(s) lorsque vous avez terminé pour s'assurer que toutes les données sont écrites de façon permanente!(vider les buffer)
  • Vous pouvez ouvrir des fichiers dans un répertoire. Par exemple, si vous voulez ouvrir un fichier dans le répertoire comme /MesFichiers/exemple.txt vous pouvez appeler SD.open("/MesFichiers/exemple.txt") (indique le chemin complet).

Lecture de fichiers

Ensuite, nous allons vous montrer comment lire un fichier, c'est une opération très similaire à l'écriture. Pour la réaliser, nous utiliserons SD.open() pour ouvrir le fichier mais cette fois on ne passe pas le paramètre FILE_WRITE durant l'appel. Cela évitera d'écrire accidentellement dans le fichier (car il sera ouvert en lecture seule). Vous pouvez alors appeler la fonction available() (elle indique s'il reste des données à lire) et un read() sur le fichier (pour lire l'octet suivant).

#include <SD.h>

File myFile;

void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  // Sur la platine Ethernet, CS est la broche 4. Elle est définie comme une sortie par défaut.
  // Notez que même si elle n'est pas utilisée comme broche CS, la broche SS 
  // (10 sur la plupart des cartes Arduino, 53 sur les Méga) doit être laissée comme une sortie
  // sinon les fonctions de la bibliothèque SD ne fonctionneront pas.
  pinMode(10, OUTPUT);

  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // ouvrir le fichier pour la lecture :
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // lire le fichier jusqu'à la fin :
    while (myFile.available()) {
        Serial.write(myFile.read());
    }
    // fermer le fichier :
    myFile.close();
  } else {
    // si le fichier ne se ferme pas, afficher une erreur :
    Serial.println("error opening test.txt");
  }
}

void loop()
{
        // Il n'y a rien à faire après setup()
}


Certaines éléments sont à noter:

  • Vous pouvez avoir plusieurs fichiers ouverts en même temps, et lire à partir de chacun d'eux comme vous le souhaitez.
  • La fonction read() retourne un seul octet à la fois. Elle ne lit pas une ligne complète ou un nombre!
  • Vous devez fermer le(s) fichier(s) avec la fonction close() lorsque vous avez terminé pour réduire la quantité de RAM utilisée

Enumérer / lire récursivement les fichiers

Le dernier exemple nous montre une utilisation plus avancée. Un besoin courant est, par exemple, énumération tous les fichiers de la carte SD ou de jouer les fichiers musicaux les un après les autres. Dans la dernière version de la bibliothèque SD, vous pouvez parcourir un répertoire et appeler openNextFile() pour obtenir et ouvrir le fichier suivant disponible dans le répertoire. Ils n’apparaîtront pas dans l'ordre alphabétique, mais dans l'ordre de leur création; souvenez vous en car cela est important!

Pour voir l'exemple, chargez et exécutez le sketch d'exemple SD→listfiles

Vous pouvez constater que nous avons un sous-répertoire ANIM (des fichiers d'animation y sont placés). Les chiffres à la suite des noms de fichier représentent la taille en octets des fichiers.

Ce sketch est utile pour découvrir les noms de fichiers tels qu'ils sont stockés sur votre carte. Le sketch montre également comment manipuler le(s) répertoire(s)

 
Crédit: AdaFruit Industries www.adafruit.com

Autres fonctions utiles

Quelques manipulations utiles sont possibles avec des fonctions SD, nous allons en énumérer quelques-unes ici:

  • Si vous voulez juste vérifier l'existence d'un fichier, utilisez SD.exists("filename.txt") elle retournera vrai ou faux (1 ou 0)
  • Vous pouvez supprimer un fichier en appelant SD.remove("unwanted.txt") - attention! Elle supprimera vraiment le fichier, et il n'y a pas de "poubelle" pour corriger une erreur.
  • Vous pouvez créer un sous-répertoire en appelant SD.mkdir("/mynewdir") très pratique lorsque vous voulez rassembler des fichiers dans un emplacement commun (un fichier par jour... et un répertoire par semaine). Rien ne se passe si il existe déjà, mais vous pouvez toujours appeler SD.exists() en premier tel que décrit ci-dessus.

Quelques fonctions utiles pour manipuler des fichiers :

  • Vous pouvez appeler seek() sur un fichier. Ceci déplacera le pointeur de lecture/écriture vers le nouvel emplacement indiqué. Par exemple seek(0) vous amène au début du fichier, ce qui peut être très pratique!
  • De même, vous pouvez appeler la fonction position() elle renvoi l'emplacement actuel du pointeur de lecture/écriture dans le fichier (nombre d'octets parcourus).
  • Si vous voulez connaître la taille d'un fichier, appelez size() pour obtenir la taille du fichier en octets (bytes).
  • Les répertoires/dossiers sont des fichiers spéciaux, vous pouvez déterminer si un fichier est un répertoire en appelant isDirectory()
  • Lorsqu'un répertoire est reconnu, vous pouvez commencer à énumerer tous les fichiers disponibles dans ce répertoire en appelant openNextFile()
  • S'il est nécessaire de connaître le nom d'un fichier (par exemple lorsque vous avez appelé openNextFile()) dans un répertoire. Dans ce cas, la fonction name() retourne un pointeur vers le tableau de caractères contenant le nom de fichier au format 8.3. Vous pouvez envoyer directement le contenu du tableau directement sur la console avec Serial.print().

Source: Micro SD card Tutorial created by LadyAda for AdaFruit Industries

Réalisé avec l'aide de Mr Carette J. à qui nous remettons tous nos remerciements.

Tutoriel créé par LadyAda pour AdaFruit Industries. Tutorial created by LadyAda for AdaFruit Industries

Traduit avec l'autorisation d'AdaFruit Industries - Translated with the permission from Adafruit Industries - www.adafruit.com

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.