Go Down

Topic: datalog - gps - sdcard (Read 540 times) previous topic - next topic

sergiotux

Hello guys, please
I'm using the sample code TinyGPS, and I can not write the data to an SD card.
Can someone help me?

thanks...Sérgio

-----------------------------
#include <SoftwareSerial.h>
#include <TinyGPS.h>


TinyGPS gps;
SoftwareSerial nss(2, 3);

static void gpsdump(TinyGPS &gps);
static bool feedgps();
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{
  Serial.begin(19200);
  nss.begin(9600);
 
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
//  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));
  Serial.println();
  Serial.println("Sats HDOP Latitude Longitude Fix  Date       Time       Date Alt     Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)    (deg)     Age                        Age  (m)     --- from GPS ----  ---- to London  ----  RX    RX        Fail");
  Serial.println("--------------------------------------------------------------------------------------------------------------------------------------");
}

void loop()
{
  bool newdata = false;
  unsigned long start = millis();
 
  // Every second we print an update
  while (millis() - start < 1000)
  {
    if (feedgps())
      newdata = true;
  }
 
  gpsdump(gps);
}

static void gpsdump(TinyGPS &gps)
{
//Serial.println(); 
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const float LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
 
//Serial.println(); 
//  Serial.println("num de satelites, hdop, lat, lon, age");
  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);

//Serial.println();
//   Serial.println("data month, day, year, hour, minute, second");
  print_date(gps);
 
//Serial.println();
//  Serial.println("altitude    curso   velocidade  curso  contasd para londres");
  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2);
  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(flat, flon, 51.508131, -0.128002), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

//Serial.println();
//  Serial.println("char????  sentences????? error");
  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);
  Serial.println();
}

static void 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 = ' ';
  if (len > 0)
    sz[len-1] = ' ';
  Serial.print(sz);
  feedgps();
}

static void 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 = ' ';
    Serial.print(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(" ");
  }
  feedgps();
}

static void 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);
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  feedgps();
}

static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str : ' ');
  feedgps();
}

static bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}

PaulS

Quote
I'm using the sample code TinyGPS, and I can not write the data to an SD card.

Why can't you? Do you need permission?

Where do you even try?

sergiotux

no hit programming.
I do not know how to record this data in sdcard.

thanks

PaulS

Quote
I do not know how to record this data in sdcard.

First, you need to define what "this data" is.

Then, you need a SD card shield that you know you can write to/read from.

Next, you need to open a file, for write, and write the data of interest.

You have omitted details for three of these three items.

sergiotux


- Know what it is data

- I have the sd card and ok because I tested with another test pde

- I do not know how to take this data and write to the card, I do not plan well.

Thanks

PaulS

Quote
- Know what it is data

Good thing that one of use knows.

Quote
- I have the sd card and ok because I tested with another test pde

Excellent.

Quote
- I do not know how to take this data and write to the card, I do not plan well.

Sorry I can't help you. I have no idea what you want to write to the file on the SD card. Planning well and explaining well are two different things.

NickPyner

#6
Nov 12, 2012, 12:18 am Last Edit: Nov 12, 2012, 12:33 am by NickPyner Reason: 1
Every datalogging to SD card sketch I have seen has two things

1. The SD card library in the inclusions list
2. Commands for initialisation of the SD card in the setup section.

Yours apparently has neither. There is a faint possibility that the SD stuff is in your SoftwareSerial library, but it looks like the reason why you can't write to the SD is because you have made no provision in your sketch to do so. There is a datalogging sketch in the SD section of the Arduino examples which reveals all. You may find you can simply plug your GPS stuff into that.

Essentially it is just a case of having

open file
fileName.print(data)
close file

in your loop. I imagine the stuff you want on the SD is the same as the stuff you print on the serial monitor, so you already have that worked out and you write to the SD in the same way.

Note that the Arduino doesn't datestamp anything and you might need to include a clock. You can use that to name the file as well as supply data.


sergiotux

I found this and it's working.
I'll just change the data

thank you very much

http://arduino.cc/forum/index.php/topic,128847.0.html

Go Up