Hi guys,
I'm quite new to C++ and Arduino programming, so please be kind to me
I'm trying to write a GPS logger with writing data to a SD-Card. This is the code I've got so far. Unfortunately at the line: "return(sz);" in the "print_int" function I do get the error "invalid conversion from 'char*' tp 'char'.
Any help is appreciated...
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <SD.h>Â Â Â Â Â Â Â Â Â Â Â Â // Standard Arduino SD card library
File myFile;
SoftwareSerial gpsSerial(3, 4);Â
TinyGPS gps;
unsigned long currentTime;
unsigned long loopTime;
void setup() {
 Serial.begin(115200);
 gpsSerial.begin(9600);
 Serial.println("Reading GPS");
// Initialize SD card
Serial.print("Initializing SD card...");
pinMode(10, OUTPUT);
currentTime = millis();
loopTime = currentTime;
Â
if (!SD.begin(10)) {
  Serial.println("initialization failed!");
  //return;
}
Serial.println("initialization done.");
Â
// End initialize SD Card
}
void loop() {
 currentTime = millis();
 while(gpsSerial.available()) { //check for gps data
  if(gps.encode(gpsSerial.read())) { //encode gps data
   if(currentTime >= (loopTime + 5000)) { // Update every 5 seconds
  Â
    gpsdump(gps);
   }
  }
 }
}
// Get and process GPS data
void gpsdump(TinyGPS &gps) {
 float lat, lng, altitude, courseTrue, speedKmph;
 unsigned long hdop, dateAge, fixAge, date, time, chars = 0;
 unsigned short sentences = 0, failed = 0;
 static char courseTrueCard, sats;
 static const float HOME_LAT = 51.508131, HOME_LNG = -0.128002;
Â
 sats = print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
 hdop = print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
 //set the position
 gps.f_get_position(&lat, &lng, &dateAge);
 lat = print_float(lat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5);
 lng = print_float(lng, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5);
 print_int(fixAge, TinyGPS::GPS_INVALID_AGE, 5);
 print_date(gps);
 altitude = print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2);
 courseTrue = print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
 speedKmph = print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
 courseTrueCard = print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
 print_int(lat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(lat, lng, HOME_LAT, HOME_LNG) / 1000, 0xFFFFFFFF, 9);
 print_float(lat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(lat, lng, HOME_LAT, HOME_LNG), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
 print_str(lat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(lat, lng, HOME_LAT, HOME_LNG)), 6);
Â
 gps.stats(&chars, &sentences, &failed);
 print_int(chars, 0xFFFFFFFF, 6);
 print_int(sentences, 0xFFFFFFFF, 10);
 print_int(failed, 0xFFFFFFFF, 9);
 /// And write it to SD card
 myFile = SD.open("gpsData.csv", FILE_WRITE);
Â
 // if the file opened okay, write to it:
 if (myFile) {
  Serial.print("Writing to gpsData.csv...");
  // display position
  Serial.println("Position: ");
  Serial.print("sats: ");Serial.print(sats); // print number of satellites
  Serial.print(", hdop: ");Serial.print(hdop); // print hdop
  Serial.print(", lat: ");Serial.print(lat);Serial.print(" ");// print latitude
  Serial.print(", lng: ");Serial.print(lng); // print longitude
  Serial.print(", fixAge: ");Serial.print(fixAge); // print fixAge
  Serial.print(", date: ");Serial.print(date); // print date
  Serial.print(", time: ");Serial.print(time); // print time
  Serial.print(", dateAge: ");Serial.print(dateAge); // print dateAge
  Serial.print(", altitude: ");Serial.print(altitude); // print altitude
  Serial.print(", courseTrue: ");Serial.print(courseTrue); // print courseTrue
  Serial.print(", speedKmph: ");Serial.println(speedKmph); // print speedKmph
  myFile.print("1234567891231"); //devideID - IMEI - todo: read the IMEI out of the GSM/GPRS Shield
  myFile.print(", ");
  myFile.print(sats);
  myFile.print(", ");
  myFile.print(hdop);
  myFile.print(", ");
  myFile.print(lat);
  myFile.print(", ");
  myFile.println(lng);
  myFile.print(", ");
  myFile.print(fixAge);
  myFile.print(", ");
  myFile.print(date);
  myFile.print(", ");
  myFile.print(time);
  myFile.print(", ");
  myFile.print(dateAge);
  myFile.print(", ");
  myFile.print(altitude);
  myFile.print(", ");
  myFile.print(courseTrue);
  myFile.print(", ");
  myFile.print(speedKmph);
  myFile.print(", ");
  // close the file:
  myFile.close();
  Serial.println("done.");
 } else {
  // if the file didn't open, print an error:
  Serial.println("error opening gpsData.csv");
 }
}
static char print_int(unsigned long val, unsigned long invalid, int len)
{
 char sz[32];
 if (val == invalid)
  strcpy(sz, "*******");
 else
  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);
 return(sz);
}
static char print_float(float val, float invalid, int len, int prec)
{
 char sz[32];
 if (val == invalid)
 {
  strcpy(sz, "*******");
  sz[len] = 0;
    if (len > 0)
     sz[len-1] = ' ';
  for (int i=7; i<len; ++i)
    sz[i] = ' ';
  Serial.print(sz);
  return(sz);
 }
 else
 {
  Serial.print(val, prec);
  int vi = abs((int)val);
  int flen = prec + (val < 0.0 ? 2 : 1);
  flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
  for (int i=flen; i<len; ++i)
   Serial.print(" ");
 }
}
static char print_date(TinyGPS &gps)
{
 int year;
 byte month, day, hour, minute, second, hundredths;
 unsigned long age;
 gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
 if (age == TinyGPS::GPS_INVALID_AGE) {
  Serial.print("*******  *******  ");
 }
 else
 {
  char sz[32];
  sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
    month, day, year, hour, minute, second);
  Serial.print(sz);
  return(sz);
 }
 print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
}
static char print_str(const char *str, int len)
{
 int slen = strlen(str);
 for (int i=0; i<len; ++i) {
  Serial.print(i<slen ? str[i] : ' ');
  return(i<slen ? str[i] : ' ');
 }
}