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