Aucune données écrites sur la carte SD

Bonjour,

Voila pour expliquer rapidement, mon programme a pour but de récupérer les données GPS d'un shield DS-GPM. Donc la dessus je pense que ce que j'ai fait est bien. Mais ensuite il doit enregistrer ces données sur une carte SD dans un fichier GPX et ecrit en XML.

N'ayant pas réussi à créer un fichier sur la carte SD via l'arduino je l'ai créer depuis mon pc et le fait lire par le arduino. Mais malheureusement une fois que le programme à tourner je ne trouve aucune données sur ma carte SD et je ne comprends pas pourquoi.

#include <Wire.h>
#define GPM 0x68
#include <SPI.h> 
#include <SD.h> 

const byte SD_Carte = 4;

float avlat;
int Trace;

byte Address;
byte Data;

byte Data_9,Data_8,Data_7,Data_6,Data_5,Data_4,Data_3,Data_2,Data_1;
int Latitude_1, Longitude_1;
long Latitude_2, Longitude_2;
float Latitude_C, Longitude_C;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  Ini_Trace();
}

void loop() {
  
  avlat = Latitude_C;
  
  Serial.print("Latitude :");
  calcul_lat();
  Serial.println(Latitude_C,6);

  Serial.print("Longitude :");
  calcul_long();
  Serial.println(Longitude_C,6);
  
  if(avlat != Latitude_C)
  {
    Crea_Trace();
  }
  
  delay(2000);
}

int Single()
{
 int Value = 0;

   Wire.beginTransmission(GPM);
   Wire.write(Address);
   Wire.endTransmission();

   Wire.requestFrom(GPM, 1);
   while(Wire.available() < 1);
   Value = Wire.read();

   return(Value);
}

double calcul_lat()
{
  Address = 14;
  Data_8 = Single();

  Address = 15;
  Data_7 = Single();

  Address = 16;
  Data_6 = Single();

  Address = 17;
  Data_5 = Single();

  Address = 18;
  Data_4 = Single();

  Address = 19;
  Data_3 = Single();

  Address = 20;
  Data_2 = Single();

  Address = 21;
  Data_1 = Single();
  
  Latitude_1=(Data_8*10+Data_7); 
  Latitude_2=(Data_6*1E5+Data_5*1E4+Data_4*1E3+Data_3*1E2+Data_2*1E1+Data_1);
  Latitude_2=(Latitude_2/60);
    Latitude_C = (Latitude_1+(Latitude_2*1E-4));  
  return(Latitude_C);
}

double calcul_long()
{
  Address = 23;
  Data_9 = Single();
  
  Address = 24;
  Data_8 = Single();

  Address = 25;
  Data_7 = Single();

  Address = 26;
  Data_6 = Single();

  Address = 27;
  Data_5 = Single();

  Address = 28;
  Data_4 = Single();

  Address = 29;
  Data_3 = Single();

  Address = 30;
  Data_2 = Single();

  Address = 31;
  Data_1 = Single();
  
  
  Longitude_1=(Data_9*1E2+Data_8*10+Data_7); 
  Longitude_2=(Data_6*1E5+Data_5*1E4+Data_4*1E3+Data_3*1E2+Data_2*1E1+Data_1);
  Longitude_2=(Longitude_2/60);
    Longitude_C = (Longitude_1+(Longitude_2*1E-4)); 
  return(Longitude_C);
}

void Ini_Trace()
{
  File fichier = SD.open("Trace.gpx");
  fichier.println("<?xml version='1.0' encoding='ISO-8859-1'?>");
  fichier.println("<gpx version='1.1'>");
  fichier.println();
}

void Crea_Trace()
{
  File fichier = SD.open("Trace.gpx");
  
  Trace = Trace+1;
  
  fichier.print("<wpt lat='");
  fichier.print(Latitude_C,6);
  fichier.print("' lon='");
  fichier.print(Longitude_C,6);
  fichier.println("'>");
  fichier.print("<name>Trace");
  fichier.print(Trace);
  fichier.println("</name>");
  fichier.println("</wpt>");
  fichier.println();
  
  Serial.println("donnees sauvgardees");
  Serial.println();
}

Merci d'avance pour votre aide.

J'ai lu le code en diagonale et si j'en crois la documentation de la librairie SD, il manque le SD.begin() pour initialiser la librairie. et il manque le fichier.close() pour fermer le fichier

Une bonne pratique, lorsque tu fais ça:
File fichier = SD.open("Trace.gpx");il faut tester si fichier est non nul, signe que le fichier a été vraiment ouvert. Si fichier == 0 alors il n'a pas été créé et c'est inutile d'aller plus loin.

J'ai donc rajouté :

 SD.begin(4);

et j'ai fermé le fichier après chaque utilisation.
j'ai aussi rajouté :

if( fichier == 0 )
  {Serial.println("ERROR");}

Mais aucune trace de ERROR sur mon Moniteur serie donc le fichier et belle est bien vu par l'arduino.
Mais toujours aucune trace de donées sur la carte SD.

LeFolisophe:
Mais malheureusement une fois que le programme à tourner je ne trouve aucune données sur ma carte SD et je ne comprends pas pourquoi.

Dans tous les cas, il faut prendre ça avec Folisophie ...

Il y a un truc avec les écritures, je ne m'en souviens jamais : tu utilises fichier.print et fichier.println. Essaye avec fichier.write et fichier.writeln

La différence est subtile, l'un écrit en ASCII, l'autre pas, mais je ne me souviens jamais lequel fait quoi...

avec write j'obtient le message d'erreur suivant :

error: "class Flile" n'a pas de membre nommé "writeln"

comment faire pour que la commande write soit reconnue ?

Et si tu testais la valeur retournée de SD.begin() ?

Pourquoi ne pas partir d'un exemple de la librairie ?

Si write est reconnu mais par writeln, tu peux utiliser write et mettre \n à la fin de ta chaine. Exemple

file.writeln ("abcdef");

est équivalent à

file.write("abcdef\n");

write écrit des données brutes
print formate les données pour qu'elles soient humainement lisible.

Pour du texte cela n'a pas grande importance.
Mais sur des variables numériques le résultat est différent.
Soit une variable

int toto=0x4545;

si tu fais un write tu écriras dans ton fichier un octet contenant le nombre 45 suivit d'un autre octet contenant 45
si tu fais un print tu écriras une chaine de 4 caractères dans le fichier '4', '5', '4', '5'
si tu fais un println tu écriras une chaine de 6 caractères dans le fichier '4', '5', '4', '5', '\n', '\r'

Merci pour toute vos réponse, je n'ai plus acces aux matériels avant vendredi donc je vous redis ça vendredi.

Merci beaucoup

Lorsque tu fais SD.open(), si tu ne précises pas le mode le fichier est ouvert en écriture seule (voir la doc)
Lorsque tu fais un fichier.write() ou .print() il faut lire la valeur retournée. C'est le nombre d'octets écrits. Je pense qu'en l'état actuel des choses (ouverture en lecture seule) write() ou print() doit retourner 0 ce qui n'est sans doute pas ce que tu veux.