Go Down

Topic: TinyGPS datalogger (Read 1 time) previous topic - next topic

TravisH

Hi All,

I had an old GPS module laying around at home, which was a GPS module that had a prolific PL-2303 device in it. Using the good old interweb i found out that Pin 5 was the RX pin for the RS232 to USB device and amazingly managed to solder a wire onto that without shorting out the PL-2303 chip (i was quite surprised). I have connected this to my Arduino and using the code below got it outputting the GPS strings to the serial monitor.

I have an ethernet (POE) shield with a microSD card in it, and would ideally like to use this to datalog the GPS strings to a csv file. My end goal is to add a radiation sensor and other bits and peices (temp, humidity, environmental conditions) and record all of these to a MicroSD card.

I understand the below, but since i am new to this i am struggling to understand how to incorporate the below into a SD card datalogger. Can someone point me in the direction of code examples which might be similar, so its is not such a big jump to combine two different codes into one.

I understand that i want to pull the variable (day/month/year) (hour:minute:second), latitude, longitude, gps.f_altitude(), gps.f_speed_kmph(), environmental variables (e.g. Temperature, RH) from the first code example, into i guess a function that would write a new line to the SD card, but am unsure of the most simplistic and least complicated way to do this.

Code: [Select]

/*
 6-8-10
 Aaron Weiss
 SparkFun Electronics
 
 Example GPS Parser based off of arduiniana.org TinyGPS examples.
 
 Parses NMEA sentences from an EM406 running at 4800bps into readable
 values for latitude, longitude, elevation, date, time, course, and
 speed.
 
 For the SparkFun GPS Shield. Make sure the switch is set to DLINE.
 
 Once you get your longitude and latitude you can paste your
 coordinates from the terminal window into Google Maps. Here is the
 link for SparkFun's location.  
 http://maps.google.com/maps?q=40.06477,+-105.20997
 
 Uses the NewSoftSerial library for serial communication with your GPS,
 so connect your GPS TX and RX pin to any digital pin on the Arduino,
 just be sure to define which pins you are using on the Arduino to
 communicate with the GPS module.
 
 REVISIONS:
 1-17-11
   changed values to RXPIN = 2 and TXPIN = to correspond with
   hardware v14+. Hardware v13 used RXPIN = 3 and TXPIN = 2.
 1-15-12 (jseery)
   changed reference from NewSoftSerial library to Software Serial.
*/

// In order for this sketch to work, you will need to download
// NewSoftSerial and TinyGPS libraries from arduiniana.org and put them
// into the hardware->libraries folder in your ardiuno directory.
// Here are the lines of code that point to those libraries

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

// Define which pins you will use on the Arduino to communicate with your
// GPS. In this case, the GPS module's TX pin will connect to the
// Arduino's RXPIN which is pin 3.
#define RXPIN 2
#define TXPIN 3
//Set this value equal to the baud rate of your GPS
#define GPSBAUD 4800

// Create an instance of the TinyGPS object
TinyGPS gps;
// Initialize the SoftwareSerial library to the pins you defined above
SoftwareSerial mySerial = SoftwareSerial (RXPIN, TXPIN);

// This is where you declare prototypes for the functions that will be
// using the TinyGPS library.
void getgps(TinyGPS &gps);

// In the setup function, you need to initialize two serial ports; the
// standard hardware serial port (Serial()) to communicate with your
// terminal program an another serial port (NewSoftSerial()) for your
// GPS.
void setup()
{
 // This is the serial rate for your terminal program. It must be this
 // fast because we need to print everything before a new sentence
 // comes in. If you slow it down, the messages might not be valid and
 // you will likely get checksum errors.
 Serial.begin(115200);
 //Sets baud rate of your GPS
 mySerial.begin(GPSBAUD);
 
 Serial.println("");
 Serial.println("GPS Shield QuickStart Example Sketch v12");
 Serial.println("       ...waiting for lock...           ");
 Serial.println("");
}

// This is the main loop of the code. All it does is check for data on
// the RX pin of the ardiuno, makes sure the data is valid NMEA sentences,
// then jumps to the getgps() function.
void loop()
{
 while(mySerial.available())     // While there is data on the RX pin...
 {
     int c = mySerial.read();    // load the data into a variable...
     if(gps.encode(c))      // if there is a new valid sentence...
     {
       getgps(gps);         // then grab the data.
     }
 }
}

// The getgps function will get and print the values we want.
void getgps(TinyGPS &gps)
{
 // To get all of the data into varialbes that you can use in your code,
 // all you need to do is define variables and query the object for the
 // data. To see the complete list of functions see keywords.txt file in
 // the TinyGPS and NewSoftSerial libs.
 
 // Define the variables that will be used
 float latitude, longitude;
 // Then call this function
 gps.f_get_position(&latitude, &longitude);
 // You can now print variables latitude and longitude
 Serial.print("Lat/Long: ");
 Serial.print(latitude,5);
 Serial.print(", ");
 Serial.println(longitude,5);
 
 // Same goes for date and time
 int year;
 byte month, day, hour, minute, second, hundredths;
 gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
 // Print data and time
 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);
 //Since month, day, hour, minute, second, and hundr
 
 // Here you can print the altitude and course values directly since
 // there is only one value for the function
 Serial.print("Altitude (meters): "); Serial.println(gps.f_altitude());  
 // Same goes for course
 Serial.print("Course (degrees): "); Serial.println(gps.f_course());
 // And same goes for speed
 Serial.print("Speed(kmph): "); Serial.println(gps.f_speed_kmph());
 Serial.println();
 Serial.print("http://maps.google.com/maps?q="); Serial.print(latitude,8); Serial.print(",+");  Serial.println(longitude,8);
 
 // Here you can print statistics on the sentences.
 unsigned long chars;
 unsigned short sentences, failed_checksum;
 gps.stats(&chars, &sentences, &failed_checksum);
 //Serial.print("Failed Checksums: ");Serial.print(failed_checksum);
 //Serial.println(); Serial.println();
}

PaulS

Quote
I understand that i want to pull the variable (day/month/year) (hour:minute:second), latitude, longitude, gps.f_altitude(), gps.f_speed_kmph(), environmental variables (e.g. Temperature, RH) from the first code example

Yes, you do.

Quote
into i guess a function that would write a new line to the SD card, but am unsure of the most simplistic and least complicated way to do this.

A function is not necessary. More convenient, perhaps. Have you looked at any of the examples that come with the SD library? What you want to do is trivial.

Go Up