Date from GPS and making a file name of that date in SD card.

Hello Everyone,

I'm working on my own project,To get the data from the GPS chip and logging the data to the micro SD card, I'm using Arduino Mega,Micro SD card Module,Quectel L80 (GPS CHIP), to get the data (Altitude,Latitude & Longitude, Time and Date) to the Arduino, I successfully can get the data from the chip and log that data into a SD card in a newly created file(in .tcx format). Here I'm using EEPROM to name every new file which includes new data from the GPS CHIP, Now I've bunch of file saved on my SD card and It's very difficult for me to identify which file was recorded on which day (I checked the files properties to know the date and time it was created but all shows only one time and date (01.01.2000),I was looking to create the file in SD card by naming it by taking Date from GPS chip and log into it.

Please help me.

Here is my code.

#include <TinyGPS++.h>
#include <SPI.h>
#include <SD.h>
#include <EEPROM.h>
int addr = 0;
TinyGPSPlus gps;
File dataFile;
char abc[32];
char def[32];
char aaa[32];
int dat=0,v=0;
float lat0=0.0,lat1=0.0,lng0=0.0,lng1=0.0,dis=0.0;
String kk;
void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(8, INPUT_PULLUP);
if (!SD.begin(49)) 
{
    Serial.println("Card failed");
    return;
}
  Serial.println("card initialized.");
v = EEPROM.read(0);
  v++;
   EEPROM.write(0,v);
  }


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);
if(dat==1)
{
  Serial.println("date got1");
  
kk = String(v)+".txt";
Serial.println(kk);
dataFile = SD.open(kk, FILE_WRITE);
  if (dataFile) {
    Serial.println("File created");
    dataFile.println(F("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"));
    dataFile.println(F("<TrainingCenterDatabase xmlns=\"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2\">"));
    dataFile.println(F("<Activities>"));
    dataFile.println(F("<Activity Sport=\"Other\">"));
    Serial.println(F("done 1st part"));
  dataFile.println("<Id>");
  dataFile.print(String(def));
  dataFile.print("T");
  dataFile.print(String(abc));
  dataFile.print(".000Z");
  dataFile.println("</Id>");
  dataFile.println("<Lap StartTime=\"");
  dataFile.print(String(def));
  dataFile.print("T");
  dataFile.print(String(abc));
  dataFile.print(".000Z\">");
  dataFile.println("<Track>");

do{ 
   lat0=(String(gps.location.lat(),6)).toFloat();
   lng0=(String(gps.location.lng(),6)).toFloat();
  }while(lat0==0.0);
  
  logging();
  }
  else {
   Serial.println("CANT OPEN FILE");
  }

}
}
void logging()
{
  Serial.println("came in loop 1");
  while(1)
  {
  if (digitalRead(8) == 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(def));
  dataFile.print("T");
  dataFile.print(String(abc));
  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");
}
  def[0] = NULL;
  abc[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");

  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(def, "%02d-%02d-%02d",d.year(),d.month(), d.day());
    Serial.print(def);
    dat=1;
  }
  
  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {
    
    sprintf(abc, "%02d:%02d:%02d", t.hour(), t.minute(), t.second());
    Serial.print(abc);
    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 (Serial1.available())
      gps.encode(Serial1.read());
  } while (millis() - start < ms);
}

Thanks

It's probably much the same as using an on-board clock.

char filename[] = "00000000.CSV";

void loop() {
.
.

  GetClock();
  if (hour == 0 && minute == 0 && second <2)
  {
   getFileName(); 
  }
.
.
}

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

This creates a new file at midnight, using the date as a name.

Thanks for the reply

Sorry a N00b here.

I made these changes as you stated please look at the sketch.

#include <TinyGPS++.h>
#include <SPI.h>
#include <SD.h>

int addr = 0;
TinyGPSPlus gps;
File dataFile;
char abc[32];
char def[32];
char aaa[32];
int dat = 0, v = 0;
float lat0 = 0.0, lat1 = 0.0, lng0 = 0.0, lng1 = 0.0, dis = 0.0;
String kk;
char filename[] = "00000000.CSV";
void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(8, 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);
  if (dat == 1)
  {
    Serial.println("date got1");

    kk = String(v) + ".txt";
    Serial.println(kk);
    dataFile = SD.open(kk, FILE_WRITE);
    if (dataFile) {
      Serial.println("File created");
      dataFile.println(F("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"));
      dataFile.println(F("<TrainingCenterDatabase xmlns=\"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2\">"));
      dataFile.println(F("<Activities>"));
      dataFile.println(F("<Activity Sport=\"Other\">"));
      Serial.println(F("done 1st part"));
      dataFile.println("<Id>");
      dataFile.print(String(def));
      dataFile.print("T");
      dataFile.print(String(abc));
      dataFile.print(".000Z");
      dataFile.println("</Id>");
      dataFile.println("<Lap StartTime=\"");
      dataFile.print(String(def));
      dataFile.print("T");
      dataFile.print(String(abc));
      dataFile.print(".000Z\">");
      dataFile.println("<Track>");

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

      logging();
    }
    else {
      Serial.println("CANT OPEN FILE");
    }

  }
}
void logging()
{
  Serial.println("came in loop 1");
  while (1)
  {
    if (digitalRead(8) == 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(def));
    dataFile.print("T");
    dataFile.print(String(abc));
    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");
    }
    def[0] = NULL;
    abc[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");

  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(def, "%02d-%02d-%02d", d.year(), d.month(), d.day());
    Serial.print(def);
    dat = 1;
  }

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

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

  }

  TinyGPSTime();
  
  if (t.hour == 0 && t.minute == 0 && t.second <2)
  {
   getFileName(); 
  }
  smartDelay(0);
}

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


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

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

C:\Users\Mudassir Hussain\Downloads\anadi_gps-2\anadi_gps-2.ino: In function 'void logging()':

C:\Users\Mudassir Hussain\Downloads\anadi_gps-2\anadi_gps-2.ino:135:12: warning: converting to non-pointer type 'char' from NULL [-Wconversion-null]

def[0] = NULL;

^

C:\Users\Mudassir Hussain\Downloads\anadi_gps-2\anadi_gps-2.ino:136:12: warning: converting to non-pointer type 'char' from NULL [-Wconversion-null]

abc[0] = NULL;

^

C:\Users\Mudassir Hussain\Downloads\anadi_gps-2\anadi_gps-2.ino: In function 'void printDateTime(TinyGPSDate&, TinyGPSTime&)':

anadi_gps-2:231: error: invalid use of member function (did you forget the '()' ?)

if (t.hour == 0 && t.minute == 0 && t.second <2)

^

anadi_gps-2:231: error: invalid use of member function (did you forget the '()' ?)

if (t.hour == 0 && t.minute == 0 && t.second <2)

^

anadi_gps-2:231: error: invalid use of member function (did you forget the '()' ?)

if (t.hour == 0 && t.minute == 0 && t.second <2)

^

anadi_gps-2:233: error: 'getFileName' was not declared in this scope

getFileName();

^

C:\Users\Mudassir Hussain\Downloads\anadi_gps-2\anadi_gps-2.ino: In function 'void smartDelay(long unsigned int)':

anadi_gps-2:250: error: a function-definition is not allowed here before '{' token

{

^

exit status 1
invalid use of member function (did you forget the '()' ?)

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

I can't comment much on your code, but I notice that

  1. you have already formed variable aaa in the same way.

  2. the if statements don't look right, but maybe that is a matter of style

  3. you seem to be writing to a file named "kk" rather than "filename".