Creating File name According to GPS date in SD Card and logging GPS data into it

Hello everybody,

I'm making my own GPS data logger for my fitness tracker and locator, I'm saving all the data in the SD card from GPS (Quectel L86 Module), my setup is able to log the data if i created a file from my computer into the SD card and use it to log the date, But i want my setup to use the GPS date and create the file naming after the date and log all the data into it.

I've made the below line in my code,Trying to create the file name with the date from Gps but there's no file in the SD card after i save the logging.

sdfile = String(ddate) + ".txt";

Here is my full code

#include <TinyGPS++.h>
#include <SPI.h>
#include <SD.h>
TinyGPSPlus gps;
File dataFile;
char ttime[32];
char ddate[32];
char aaa[32];
int dat = 0;
float lat0 = 0.0, lat1 = 0.0, lng0 = 0.0, lng1 = 0.0, dis = 0.0;
String sdfile;
int LED = 5;
int LEDD = 6;
void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(LEDD, OUTPUT);

  Serial.begin(9600);
  Serial2.begin(9600);
  pinMode(7, INPUT_PULLUP);
  if (!SD.begin(53))
  {
    Serial.println("Card failed");
    return;
  }
  Serial.println("card initialized.");

}


void loop()
{

  printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
  printInt(gps.hdop.value(), gps.hdop.isValid(), 5);
  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  printDateTime(gps.date, gps.time);
  printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
  Serial.println();

  smartDelay(1000);
  
  if (millis() > 5000 && gps.charsProcessed() < 10)
  Serial.println(F("No GPS data received: check wiring"));
  Serial.println(dat);

  do {
    lat0 = (String(gps.location.lat(), 6)).toFloat();
    lng0 = (String(gps.location.lng(), 6)).toFloat();

  }
  while (lat0 == 0.0);


  if (lat0 !=  0.0 && dat == 1)
  {
    sdfile = String(ddate) + ".txt"; // File created with the date from GPS
    dataFile = SD.open(sdfile, FILE_WRITE);
    if (dataFile) {
      Serial.println("File created");
      dataFile.println("<Id>");
      dataFile.print(String(ddate));
      dataFile.print("T");
      dataFile.print(String(ttime));
      dataFile.print(".000Z");
      dataFile.println("</Id>");
      dataFile.println("<Lap StartTime=\"");
      dataFile.print(String(ddate));
      dataFile.print("T");
      dataFile.print(String(ttime));
      dataFile.print(".000Z\">");
      dataFile.println("<Track>");

      digitalWrite(LED, HIGH);
    }
    else
    {
      digitalWrite(LED, LOW);
    }
    logging();
  }
  else {
    Serial.println("CANT OPEN FILE");
  }

}

void logging()
{
  while (1)
  {
    if (digitalRead(7) == LOW)
      endtask();
    printDateTime(gps.date, gps.time);
    if (millis() > 5000 && gps.charsProcessed() < 10)
      Serial.println(F("No GPS data received: check wiring"));

    dataFile.println("<Trackpoint>");
    dataFile.println("<Time>");
    dataFile.print(String(ddate));
    dataFile.print("T");
    dataFile.print(String(ttime));
    dataFile.print(".000Z");
    dataFile.print("</Time>");
    dataFile.println("<Position>");
    {
      lat1 = (String(gps.location.lat(), 6)).toFloat();
      lng1 = (String(gps.location.lng(), 6)).toFloat();

      float distLat = abs(lat0 - lat1) * 111194.9;
      float distLong = 111194.9 * abs(lng0 - lng1) * cos(radians((lat0 + lat1) / 2));
      dis = dis + sqrt(pow(distLat, 2) + pow(distLong, 2));
      Serial.println(dis, 6);
      lat0 = lat1;
      lng0 = lng1;
    }
    {
      dataFile.print("<LatitudeDegrees>");
      dataFile.print(String(lat1, 6));
      Serial.println(String(lat1, 6));
      dataFile.println("</LatitudeDegrees>");
      dataFile.print("<LongitudeDegrees>");
      dataFile.print(String(lng1, 6));
      Serial.println(String(lng1, 6));
      dataFile.println("</LongitudeDegrees>");
      dataFile.println("</Position>");
      dataFile.print("<AltitudeMeters>");
      dataFile.print((String(gps.altitude.meters(), 2)));
      dataFile.println("</AltitudeMeters>");
      dataFile.println("<DistanceMeters>");
      dataFile.println(String(dis, 6));
      dataFile.println("</DistanceMeters>");
      dataFile.println("</Trackpoint>");
      Serial.print("Recorded");
    }
    ddate[0] = NULL;
    ttime[0] = NULL;
    smartDelay(1000);
  }
}


static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i = flen; i < len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}

void endtask()
{
  dataFile.println("</Track>");
  dataFile.println("</Lap>");
  dataFile.println("</Activity>");
  dataFile.println("</Activities>");
  dataFile.println("</TrainingCenterDatabase>");
  dataFile.close();
  Serial.print("file close");
  digitalWrite(LEDD, HIGH);

  while (1);
}







static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i = strlen(sz); i < len; ++i)
    sz[i] = ' ';
  if (len > 0)
    sz[len - 1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}






static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
    dat = 0;
  }
  else
  {

    sprintf(ddate, "%02d-%02d-%02d", d.year(), d.month(), d.day());
    Serial.print(ddate);
    dat = 1;
  }

  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {

    sprintf(ttime, "%02d:%02d:%02d", t.hour(), t.minute(), t.second());
    Serial.print(ttime);
    sprintf(aaa, "%02d%02d%02d", t.hour(), t.minute(), t.second());
    Serial.print(aaa);

  }
  smartDelay(0);
}

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (Serial2.available())
      gps.encode(Serial2.read());
  } while (millis() - start < ms);
}

Please help me,

Thanks

Subroutine accessed only at midnight

void getFileName(){
sprintf(filename, "%02d%02d%02d.csv", year, month, day);
}

Thanks man for the reply,

I've made the changes as you've mentioned above, the resultant code is below, and I'm getting an error in it.

#include <TinyGPS++.h>
#include <SPI.h>
#include <SD.h>
TinyGPSPlus gps;
File dataFile;
char ttime[32];
char ddate[32];
char aaa[32];
int dat = 0;
float lat0 = 0.0, lat1 = 0.0, lng0 = 0.0, lng1 = 0.0, dis = 0.0;
String sdfile;
int LED = 5;
int LEDD = 6;
void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(LEDD, OUTPUT);

  Serial.begin(9600);
  Serial2.begin(9600);
  pinMode(7, INPUT_PULLUP);
  if (!SD.begin(53))
  {
    Serial.println("Card failed");
    return;
  }
  Serial.println("card initialized.");

}


void loop()
{

  printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
  printInt(gps.hdop.value(), gps.hdop.isValid(), 5);
  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  printDateTime(gps.date, gps.time);
  printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
  Serial.println();

  smartDelay(1000);
  
  if (millis() > 5000 && gps.charsProcessed() < 10)
  Serial.println(F("No GPS data received: check wiring"));
  Serial.println(dat);

  do {
    lat0 = (String(gps.location.lat(), 6)).toFloat();
    lng0 = (String(gps.location.lng(), 6)).toFloat();

  }
  while (lat0 == 0.0);


  if (lat0 !=  0.0 && dat == 1)
  {
    
    dataFile = SD.open(getFileName, FILE_WRITE);
    if (dataFile) {
      Serial.println("File created");
      dataFile.println("<Id>");
      dataFile.print(String(ddate));
      dataFile.print("T");
      dataFile.print(String(ttime));
      dataFile.print(".000Z");
      dataFile.println("</Id>");
      dataFile.println("<Lap StartTime=\"");
      dataFile.print(String(ddate));
      dataFile.print("T");
      dataFile.print(String(ttime));
      dataFile.print(".000Z\">");
      dataFile.println("<Track>");

      digitalWrite(LED, HIGH);
    }
    else
    {
      digitalWrite(LED, LOW);
    }
    logging();
  }
  else {
    Serial.println("CANT OPEN FILE");
  }

}

void logging()
{
  while (1)
  {
    if (digitalRead(7) == LOW)
      endtask();
    printDateTime(gps.date, gps.time);
    if (millis() > 5000 && gps.charsProcessed() < 10)
      Serial.println(F("No GPS data received: check wiring"));

    dataFile.println("<Trackpoint>");
    dataFile.println("<Time>");
    dataFile.print(String(ddate));
    dataFile.print("T");
    dataFile.print(String(ttime));
    dataFile.print(".000Z");
    dataFile.print("</Time>");
    dataFile.println("<Position>");
    {
      lat1 = (String(gps.location.lat(), 6)).toFloat();
      lng1 = (String(gps.location.lng(), 6)).toFloat();

      float distLat = abs(lat0 - lat1) * 111194.9;
      float distLong = 111194.9 * abs(lng0 - lng1) * cos(radians((lat0 + lat1) / 2));
      dis = dis + sqrt(pow(distLat, 2) + pow(distLong, 2));
      Serial.println(dis, 6);
      lat0 = lat1;
      lng0 = lng1;
    }
    {
      dataFile.print("<LatitudeDegrees>");
      dataFile.print(String(lat1, 6));
      Serial.println(String(lat1, 6));
      dataFile.println("</LatitudeDegrees>");
      dataFile.print("<LongitudeDegrees>");
      dataFile.print(String(lng1, 6));
      Serial.println(String(lng1, 6));
      dataFile.println("</LongitudeDegrees>");
      dataFile.println("</Position>");
      dataFile.print("<AltitudeMeters>");
      dataFile.print((String(gps.altitude.meters(), 2)));
      dataFile.println("</AltitudeMeters>");
      dataFile.println("<DistanceMeters>");
      dataFile.println(String(dis, 6));
      dataFile.println("</DistanceMeters>");
      dataFile.println("</Trackpoint>");
      Serial.print("Recorded");
    }
    ddate[0] = NULL;
    ttime[0] = NULL;
    smartDelay(1000);
  }
}


static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i = flen; i < len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}

void endtask()
{
  dataFile.println("</Track>");
  dataFile.println("</Lap>");
  dataFile.println("</Activity>");
  dataFile.println("</Activities>");
  dataFile.println("</TrainingCenterDatabase>");
  dataFile.close();
  Serial.print("file close");
  digitalWrite(LEDD, HIGH);

  while (1);
}
static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i = strlen(sz); i < len; ++i)
    sz[i] = ' ';
  if (len > 0)
    sz[len - 1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}






static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
    dat = 0;
  }
  else
  {

    sprintf(ddate, "%02d-%02d-%02d", d.year(), d.month(), d.day());
    Serial.print(ddate);
    dat = 1;
  }

  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {

    sprintf(ttime, "%02d:%02d:%02d", t.hour(), t.minute(), t.second());
    Serial.print(ttime);
    sprintf(aaa, "%02d%02d%02d", t.hour(), t.minute(), t.second());
    Serial.print(aaa);

  }
  smartDelay(0);
}

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (Serial2.available())
      gps.encode(Serial2.read());
  } while (millis() - start < ms);
}

void getFileName(TinyGPSDate &d){
    sprintf(ddate, "%02d-%02d-%02d.csv", d.year(), d.month(), d.day());
}

error

Arduino: 1.6.7 (Windows 10), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

C:\Users\MUDASS~1\AppData\Local\Temp\arduino_78b0109cdd8191fc915cfa152f81fbdb\date_test.ino: In function 'void loop()':

date_test:60: error: no matching function for call to 'SDLib::SDClass::open(void (&)(TinyGPSDate&), int)'

dataFile = SD.open(getFileName, FILE_WRITE);

^

C:\Users\MUDASS~1\AppData\Local\Temp\arduino_78b0109cdd8191fc915cfa152f81fbdb\date_test.ino:60:47: note: candidates are:

In file included from C:\Users\MUDASS~1\AppData\Local\Temp\arduino_78b0109cdd8191fc915cfa152f81fbdb\date_test.ino:3:0:

C:\Program Files (x86)\Arduino\libraries\SD\src/SD.h:75:8: note: SDLib::File SDLib::SDClass::open(const char*, uint8_t)

File open(const char *filename, uint8_t mode = FILE_READ);

^

C:\Program Files (x86)\Arduino\libraries\SD\src/SD.h:75:8: note: no known conversion for argument 1 from 'void(TinyGPSDate&)' to 'const char*'

C:\Program Files (x86)\Arduino\libraries\SD\src/SD.h:76:8: note: SDLib::File SDLib::SDClass::open(const String&, uint8_t)

File open(const String &filename, uint8_t mode = FILE_READ) { return open( filename.c_str(), mode ); }

^

C:\Program Files (x86)\Arduino\libraries\SD\src/SD.h:76:8: note: no known conversion for argument 1 from 'void(TinyGPSDate&)' to 'const String&'

exit status 1
no matching function for call to 'SDLib::SDClass::open(void (&)(TinyGPSDate&), int)'

This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.

Help

Thanks

Your getFileName is a function pointer. Call that function, then use ddate in the open call.

// replace this
    dataFile = SD.open(getFileName, FILE_WRITE);
// with this
    dataFile = SD.open(ddate, FILE_WRITE);

I replaced it, but there's no file I can find in the SD card :frowning:

I've made this editing in the code, But i cannot see any file in the SD card

Here is the code

#include <TinyGPS++.h>
#include <SPI.h>
#include <SD.h>
TinyGPSPlus gps;
File dataFile;
char ttime[32];
char ddate[32];
char aaa[32];
int dat = 0;
float lat0 = 0.0, lat1 = 0.0, lng0 = 0.0, lng1 = 0.0, dis = 0.0;
String sdfile;
int LED = 5;
int LEDD = 6;
void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(LEDD, OUTPUT);

  Serial.begin(9600);
  Serial2.begin(9600);
  pinMode(7, INPUT_PULLUP);
  if (!SD.begin(53))
  {
    Serial.println("Card failed");
    return;
  }
  Serial.println("card initialized.");
  dataFile = SD.open(ddate, FILE_WRITE);
}


void loop()
{

  printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
  printInt(gps.hdop.value(), gps.hdop.isValid(), 5);
  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  printDateTime(gps.date, gps.time);
  printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
  Serial.println();

  smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("No GPS data received: check wiring"));
  Serial.println(dat);

  do {
    lat0 = (String(gps.location.lat(), 6)).toFloat();
    lng0 = (String(gps.location.lng(), 6)).toFloat();

  }
  while (lat0 == 0.0);


  if (lat0 !=  0.0 && dat == 1)
  {
    if (dataFile) {
      Serial.println("File created");
      dataFile.println("<Id>");
      dataFile.print(String(ddate));
      dataFile.print("T");
      dataFile.print(String(ttime));
      dataFile.print(".000Z");
      dataFile.println("</Id>");
      dataFile.println("<Lap StartTime=\"");
      dataFile.print(String(ddate));
      dataFile.print("T");
      dataFile.print(String(ttime));
      dataFile.print(".000Z\">");
      dataFile.println("<Track>");

      digitalWrite(LED, HIGH);
    }
    else
    {
      digitalWrite(LED, LOW);
    }
    logging();
  }
  else {
    Serial.println("CANT OPEN FILE");
  }

}

void logging()
{
  while (1)
  {
    if (digitalRead(7) == LOW)
      endtask();
    printDateTime(gps.date, gps.time);
    if (millis() > 5000 && gps.charsProcessed() < 10)
      Serial.println(F("No GPS data received: check wiring"));

    dataFile.println("<Trackpoint>");
    dataFile.println("<Time>");
    dataFile.print(String(ddate));
    dataFile.print("T");
    dataFile.print(String(ttime));
    dataFile.print(".000Z");
    dataFile.print("</Time>");
    dataFile.println("<Position>");
    {
      lat1 = (String(gps.location.lat(), 6)).toFloat();
      lng1 = (String(gps.location.lng(), 6)).toFloat();

      float distLat = abs(lat0 - lat1) * 111194.9;
      float distLong = 111194.9 * abs(lng0 - lng1) * cos(radians((lat0 + lat1) / 2));
      dis = dis + sqrt(pow(distLat, 2) + pow(distLong, 2));
      Serial.println(dis, 6);
      lat0 = lat1;
      lng0 = lng1;
    }
    {
      dataFile.print("<LatitudeDegrees>");
      dataFile.print(String(lat1, 6));
      Serial.println(String(lat1, 6));
      dataFile.println("</LatitudeDegrees>");
      dataFile.print("<LongitudeDegrees>");
      dataFile.print(String(lng1, 6));
      Serial.println(String(lng1, 6));
      dataFile.println("</LongitudeDegrees>");
      dataFile.println("</Position>");
      dataFile.print("<AltitudeMeters>");
      dataFile.print((String(gps.altitude.meters(), 2)));
      dataFile.println("</AltitudeMeters>");
      dataFile.println("<DistanceMeters>");
      dataFile.println(String(dis, 6));
      dataFile.println("</DistanceMeters>");
      dataFile.println("</Trackpoint>");
      Serial.print("Recorded");
    }
    ddate[0] = NULL;
    ttime[0] = NULL;
    smartDelay(1000);
  }
}


static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i = flen; i < len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}

void endtask()
{
  dataFile.println("</Track>");
  dataFile.println("</Lap>");
  dataFile.println("</Activity>");
  dataFile.println("</Activities>");
  dataFile.println("</TrainingCenterDatabase>");
  dataFile.close();
  Serial.print("file close");
  digitalWrite(LEDD, HIGH);

  while (1);
}
static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i = strlen(sz); i < len; ++i)
    sz[i] = ' ';
  if (len > 0)
    sz[len - 1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}






static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
    dat = 0;
  }
  else
  {

    sprintf(ddate, "%02d-%02d-%02d", d.year(), d.month(), d.day());
    Serial.print(ddate);
    dat = 1;
  }

  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {

    sprintf(ttime, "%02d:%02d:%02d", t.hour(), t.minute(), t.second());
    Serial.print(ttime);
    sprintf(aaa, "%02d%02d%02d", t.hour(), t.minute(), t.second());
    Serial.print(aaa);

  }
  smartDelay(0);
}

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (Serial2.available())
      gps.encode(Serial2.read());
  } while (millis() - start < ms);
}

void getFileName(TinyGPSDate &d) {
  sprintf(ddate, "%02d-%02d-%02d.csv", d.year(), d.month(), d.day());
}

Please help

Thanks

dataFile = SD.open(ddate, FILE_WRITE);

At the time you call this in setup() ddate is an empty 32 element char array.

You fill it twice with different strings in getFileName() and in printDateTime(), but you don't call either before SD.open().

I would recommend that the original declaration should be
char ddate[] = "00000000.csv"; and then fill it with sprintf in getFileName()

I would recommend that you write a simple piece of test code without any GPS to just name, create, open, write, and close a file with a dynamic file name.

I've made the code as you said above, it's creating a file but the name of the file is 00000000.csv

Here is my code

#include <TinyGPS++.h>
#include <SPI.h>
#include <SD.h>
TinyGPSPlus gps;
File dataFile;
char ttime[32];
char ddate[] = "00000000.csv";
char aaa[32];
int dat = 0;
float lat0 = 0.0, lat1 = 0.0, lng0 = 0.0, lng1 = 0.0, dis = 0.0;
String sdfile;
int LED = 5;
int LEDD = 6;
void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(LEDD, OUTPUT);

  Serial.begin(9600);
  Serial2.begin(9600);
  pinMode(7, INPUT_PULLUP);
  if (!SD.begin(53))
  {
    Serial.println("Card failed");
    return;
  }
  Serial.println("card initialized.");

}


void loop()
{

  printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
  printInt(gps.hdop.value(), gps.hdop.isValid(), 5);
  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  printDateTime(gps.date, gps.time);
  printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
  Serial.println();

  smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("No GPS data received: check wiring"));
  Serial.println(dat);

  do {
    lat0 = (String(gps.location.lat(), 6)).toFloat();
    lng0 = (String(gps.location.lng(), 6)).toFloat();

  }
  while (lat0 == 0.0);


  if (lat0 !=  0.0 && dat == 1)
  {
    if (dataFile) {
      dataFile = SD.open(ddate, FILE_WRITE);
      Serial.println("File created");
      dataFile.println("<Id>");
      dataFile.print(String(ddate));
      dataFile.print("T");
      dataFile.print(String(ttime));
      dataFile.print(".000Z");
      dataFile.println("</Id>");
      dataFile.println("<Lap StartTime=\"");
      dataFile.print(String(ddate));
      dataFile.print("T");
      dataFile.print(String(ttime));
      dataFile.print(".000Z\">");
      dataFile.println("<Track>");

      digitalWrite(LED, HIGH);
    }
    else
    {
      digitalWrite(LED, LOW);
    }
    logging();
  }
  else {
    Serial.println("CANT OPEN FILE");
  }

}

void logging()
{
  while (1)
  {
    if (digitalRead(7) == LOW)
      endtask();
    printDateTime(gps.date, gps.time);
    if (millis() > 5000 && gps.charsProcessed() < 10)
      Serial.println(F("No GPS data received: check wiring"));

    dataFile.println("<Trackpoint>");
    dataFile.println("<Time>");
    dataFile.print(String(ddate));
    dataFile.print("T");
    dataFile.print(String(ttime));
    dataFile.print(".000Z");
    dataFile.print("</Time>");
    dataFile.println("<Position>");
    {
      lat1 = (String(gps.location.lat(), 6)).toFloat();
      lng1 = (String(gps.location.lng(), 6)).toFloat();

      float distLat = abs(lat0 - lat1) * 111194.9;
      float distLong = 111194.9 * abs(lng0 - lng1) * cos(radians((lat0 + lat1) / 2));
      dis = dis + sqrt(pow(distLat, 2) + pow(distLong, 2));
      Serial.println(dis, 6);
      lat0 = lat1;
      lng0 = lng1;
    }
    {
      dataFile.print("<LatitudeDegrees>");
      dataFile.print(String(lat1, 6));
      Serial.println(String(lat1, 6));
      dataFile.println("</LatitudeDegrees>");
      dataFile.print("<LongitudeDegrees>");
      dataFile.print(String(lng1, 6));
      Serial.println(String(lng1, 6));
      dataFile.println("</LongitudeDegrees>");
      dataFile.println("</Position>");
      dataFile.print("<AltitudeMeters>");
      dataFile.print((String(gps.altitude.meters(), 2)));
      dataFile.println("</AltitudeMeters>");
      dataFile.println("<DistanceMeters>");
      dataFile.println(String(dis, 6));
      dataFile.println("</DistanceMeters>");
      dataFile.println("</Trackpoint>");
      Serial.print("Recorded");
    }
    ddate[0] = NULL;
    ttime[0] = NULL;
    smartDelay(1000);
  }
}


static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i = flen; i < len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}

void endtask()
{
  dataFile.println("</Track>");
  dataFile.println("</Lap>");
  dataFile.println("</Activity>");
  dataFile.println("</Activities>");
  dataFile.println("</TrainingCenterDatabase>");
  dataFile.close();
  Serial.print("file close");
  digitalWrite(LEDD, HIGH);

  while (1);
}
static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i = strlen(sz); i < len; ++i)
    sz[i] = ' ';
  if (len > 0)
    sz[len - 1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}






static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
    dat = 0;
  }
  else
  {

    sprintf(ddate, "%02d-%02d-%02d", d.year(), d.month(), d.day());
    Serial.print(ddate);
    dat = 1;
  }

  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {

    sprintf(ttime, "%02d:%02d:%02d", t.hour(), t.minute(), t.second());
    Serial.print(ttime);
    sprintf(aaa, "%02d%02d%02d", t.hour(), t.minute(), t.second());
    Serial.print(aaa);

  }
  smartDelay(0);
}

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (Serial2.available())
      gps.encode(Serial2.read());
  } while (millis() - start < ms);
}

void getFileName(TinyGPSDate &d) {
  sprintf(ddate, "%02d-%02d-%02d.csv", d.year(), d.month(), d.day());
}

I've also tested the file creationg,reading and writing examples from Sd library.

I think i'm missing this

String date2;
void setup() {
}


void loop() {
  if (dataFile) {
  }
  date2 = String(ddate) + ".csv";
  dataFile = SD.open(date2, FILE_WRITE);
}

Please help

Thanks

I've edited my code and tested on Arduin UNO

There is little issue, when i want to save the file according to date specifically in this format "dd-mm-year" it's not creating any of the file in SD card,I can only get "ddmmyy" format without "-" perhaps when i do the same thing with time in this format "hh-mm-ss" it's creating the file and infilling gps data

by the way, I've changed .csv to .tcx

here is my edited code

#include <TinyGPS++.h>
#include <SPI.h>
#include <SD.h>
TinyGPSPlus gps;
File dataFile;
char ttime[32];
char ddate[32];
char filename[] = "00000000.tcx";
int dat = 0;
float lat0 = 0.0, lat1 = 0.0, lng0 = 0.0, lng1 = 0.0, dis = 0.0;
int LED = 5;
int LEDD = 6;
void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(LEDD, OUTPUT);

  Serial.begin(9600);
  pinMode(7, INPUT_PULLUP);
  if (!SD.begin(10))
  {
    Serial.println("Card failed");
    return;
  }
  Serial.println("card initialized.");
}


void loop()
{


  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  printDateTime(gps.date, gps.time);

  Serial.println();

  smartDelay(1000);

  do {
    lat0 = (String(gps.location.lat(), 6)).toFloat();
    lng0 = (String(gps.location.lng(), 6)).toFloat();

  }
  while (lat0 == 0.0);


  if (lat0 !=  0.0 && dat == 1)
  {
    Serial.println("Co-ordinates Achived");
    Serial.println("Date Achived");
    dataFile = SD.open(filename , FILE_WRITE);
    Serial.println(filename);
    if (dataFile) {
      Serial.println("File created");
      dataFile.println(F("<Activity Sport=\"Other\">"));
      dataFile.println("<Id>");
      dataFile.print(String(ddate));
      dataFile.print("T");
      dataFile.print(String(ttime));
      dataFile.print(".000Z");
      dataFile.println("</Id>");
      dataFile.println("<Lap StartTime=\"");
      dataFile.print(String(ddate));
      dataFile.print("T");
      dataFile.print(String(ttime));
      dataFile.print(".000Z\">");
      dataFile.println("<Track>");
      Serial.println("UPTO HERE!!!!");

      digitalWrite(LED, HIGH);
    }
    else
    {
      digitalWrite(LED, LOW);
    }
    logging();
  }
  else {
    Serial.println("CANT OPEN FILE");
  }

}

void logging()
{
  Serial.println("came in loop 1");
  while (1)
  {
    if (digitalRead(7) == LOW)
      endtask();
    printDateTime(gps.date, gps.time);
    dataFile.println("<Trackpoint>");
    dataFile.println("<Time>");
    dataFile.print(String(ddate));
    dataFile.print("T");
    dataFile.print(String(ttime));
    dataFile.print(".000Z");
    dataFile.print("</Time>");
    dataFile.println("<Position>");
    {
      lat1 = (String(gps.location.lat(), 6)).toFloat();
      lng1 = (String(gps.location.lng(), 6)).toFloat();

      float distLat = abs(lat0 - lat1) * 111194.9;
      float distLong = 111194.9 * abs(lng0 - lng1) * cos(radians((lat0 + lat1) / 2));
      dis = dis + sqrt(pow(distLat, 2) + pow(distLong, 2));
      // Serial.println(dis, 6);
      lat0 = lat1;
      lng0 = lng1;
    }
    {
      dataFile.print("<LatitudeDegrees>");
      dataFile.print(String(lat1, 6));
      Serial.println(String(lat1, 6));
      dataFile.println("</LatitudeDegrees>");
      dataFile.print("<LongitudeDegrees>");
      dataFile.print(String(lng1, 6));
      Serial.println(String(lng1, 6));
      dataFile.println("</LongitudeDegrees>");
      dataFile.println("</Position>");

      Serial.print("Recorded");
      Serial.println("123456789");
    }
    ddate[0] = NULL;
    ttime[0] = NULL;
    smartDelay(1000);
  }
}


static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i = flen; i < len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}



void endtask()
{
  Serial.print("file close");
  digitalWrite(LEDD, HIGH);

  while (1);
}







static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i = strlen(sz); i < len; ++i)
    sz[i] = ' ';
  if (len > 0)
    sz[len - 1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}


static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
    dat = 0;
  }
  else
  {

    sprintf(ddate, "%02d%02d%02d", d.day(), d.month(), d.year());
    //Serial.print(ddate);

    dat = 1;
  }

  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {

    sprintf(ttime, "%02d%02d%02d", t.hour(), t.minute(), t.second());
    //Serial.print(ttime);

  }

    sprintf(filename, "%02d-%02d-%02d.tcx", t.hour(), t.minute(), t.second());
    smartDelay(0);
}

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (Serial.available())
      gps.encode(Serial.read());
  } while (millis() - start < ms);
}

and can i get both date and time at a time as my file name like in this format

DD-MM-YY-T-HH-MM-SS

Thank you

I solved it, I used SDfat library and it works

I've used this

    sprintf(filename, "%02d-%02d-%02d-T-%02d-%02d-%02d.tcx",t.hour(), t.minute(), t.second(), d.day(),d.month(), d.year());

Thank you everybody
:slight_smile: :slight_smile: