Tiny GPS Time and speed?

Hello i have a question I’m using the Tiny gps library and sketch. I’m trying to figure out how to get the time and date and well as the speed so far i have no luck i looked into i found a few things but i can not get to work my code is posted below unmodified can someone please help me out?

sorry i had to add it as file i couldn’t find the icon in here how to add it as code like before.

gpstest0.txt (740 Bytes)

Have you looked at the test_with_gps_device example that is installed with the TinyGPS library ?

Hello UkHeli no i don't see a folder or sketch with that name in there there was no examples in there just library.

Here is the example. The code tags are the </> at the far left of the top row of icons (above the smileys). Took me a while to find them, too.

#include <SoftwareSerial.h>

#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/

TinyGPS gps;
SoftwareSerial ss(4, 3);

static void smartdelay(unsigned long ms);
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(115200);
  
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  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("-------------------------------------------------------------------------------------------------------------------------------------");

  ss.begin(4800);
}

void loop()
{
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  
  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, 10, 6);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  print_date(gps);
  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 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 ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), 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);

  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);
  Serial.println();
  
  smartdelay(1000);
}

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

static void print_float(float val, float invalid, int len, int prec)
{
  if (val == invalid)
  {
    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);
}

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

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);
  smartdelay(0);
}

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[i] : ' ');
  smartdelay(0);
}

Awesome thank you. i will try it as soon as i make lunch hehe

I have always found it best to forgo any libraries, read the sentences myself and suck out any data I need. Here is documentation on the NMEA sentences: http://www.gpsinformation.org/dale/nmea.htm

The $GPRMC sentence has the data your want.

josephchrzempiec: Hello UkHeli no i don't see a folder or sketch with that name in there there was no examples in there just library.

The example has been posted now so you should be OK. There are 3 examples in the TinyGPS library that I have on my PC and I assume that they came with the library as I certainly did not write them.

Hello for some odd reason i couldn’t get the gps sketch to run i do not know why i found another sketch that did work sketch is below. this one works forever is there a possible way to instead of the course/degrees to show number that it can display north/sourth/east or west? i tried to look all over but i can’t find anything on it.

newgps.txt (1.46 KB)

In my copy of the TinyGPS library there is the cardinal function.

gps.cardinal (float course);
returns "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"

function definition from TinyGPS.cpp

const char *TinyGPS::cardinal (float course)
{
  static const char* directions[] = {"N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"};
  int direction = (int)((course + 11.25f) / 22.5f);
  return directions[direction % 16];
}

hello thank you not sure how to add this to it. i think it is gps.cardinal (gps.f_course()); ?

I added the cardinal function to your code (at the bottom). It compiles, but I don’t have a GPS right now to test it. Give it a whirl.

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

TinyGPS gps;
SoftwareSerial serialgps(3,2
);
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long chars;
unsigned short sentences, failed_checksum;

void setup()
{

    Serial.begin(115200);
    serialgps.begin(9600);
    Serial.println("");
    Serial.println("GPS Shield QuickStart Example Sketch v12");
    Serial.println(" ...waiting for lock... ");
    Serial.println("");
}

void loop()
{
    while(serialgps.available())
    {
        int c = serialgps.read();
        if(gps.encode(c))
        {
            float latitude, longitude;
            gps.f_get_position(&latitude, &longitude);
            Serial.print("Lat/Long: ");
            Serial.print(latitude,5);
            Serial.print(", ");
            Serial.println(longitude,5);
            gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
            Serial.print("Date: ");
            Serial.print(month, DEC);
            Serial.print("/");
            Serial.print(day, DEC);
            Serial.print("/");
            Serial.print(year);
            Serial.print(" Time: ");
            Serial.print(hour, DEC);
            Serial.print(":");
            Serial.print(minute, DEC);
            Serial.print(":");
            Serial.print(second, DEC);
            Serial.print(".");
            Serial.println(hundredths, DEC);
            Serial.print("Altitude (meters): ");
            Serial.println(gps.f_altitude());
            Serial.print("Course (degrees): ");
            Serial.println(gps.f_course());
            Serial.print("Speed(kmph): ");
            Serial.println(gps.f_speed_kmph());
            Serial.print("Satellites: ");
            Serial.println(gps.satellites());
            Serial.println();
            
            // adding cardinal course
            Serial.print("Cardinal Compass course  ");
            Serial.println(gps.cardinal(gps.f_course()));
            // give it a try

            gps.stats(&chars, &sentences, &failed_checksum);
        }
    }
}

thank you thank you it says I'm north :) i will try this tonight in my brother car.

Hello thank you it works it tells me where I'm thanks

Glad to be of help.