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