// Include TimedAction library to send GPS output every x milliseconds
#include
// Include and initialise TinyGPS
#include <TinyGPS++.h>
static const uint32_t GPSBaud = 4800;
TinyGPSPlus gps;
//This initializes a TimedAction class that will perform the NMEAout function every 2 seconds.
TimedAction timedAction = TimedAction(2000,NMEAout);
// Setup software serial port - select which line to use depending on whether you want bit inversion...
#include
// Include the following SoftwareSerial line if you do not require serial port bit inversion
// (e.g. you're using the Arduino Uno as in the prototype setup)
//SoftwareSerial ss(2, 3); //pins are (RXpin GPS, TXpin PC)
// Include the following SoftwareSerial line if you do require serial port bit inversion
// (e.g. you're using the Arduino Pro Mini at 3.3VDC TTL)
SoftwareSerial ss(2, 3, true); //pins are (RXpin GPS, TXpin PC)
// Note: must add the ", true" to SoftwareSerial on Pro Mini to implement RS-232/TTL bit inversion
void setup() {
// Open serial communications:
Serial.begin(9600); // 9600 baud rate for PC monitor and VX-8 radio interface
ss.begin(GPSBaud); // 4800 baud rate for NMEA GPS interface
}
void loop() {
while (ss.available() > 0)
if (gps.encode(ss.read()))
timedAction.check();
}
void NMEAout()
{
printGPGGA();
printGPRMC();
printGPZDA();
}
void printGPGGA()
{
Serial.print("$GPGGA,");
if (gps.time.isValid())
{
// hhmmss.sss
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
Serial.print(F("0"));
Serial.print(F(","));
// Latitude (ddmm.mmmm format)
float absLatitude = sqrt(sq(gps.location.lat()));
if (absLatitude < 10) Serial.print(F("0"));
Serial.print(int(absLatitude)); //dd
if ((60*(absLatitude-(int(absLatitude)))) < 10) Serial.print(F("0"));
Serial.print(60*(absLatitude-(int(absLatitude))), 4);
Serial.print(",");
// N or S
Serial.print(gps.location.rawLat().negative ? "S," : "N,");
// Longitude (dddmm.mmmm format)
float absLongitude = sqrt(sq(gps.location.lng()));
if (absLongitude < 100) Serial.print(F("0"));
if (absLongitude < 10) Serial.print(F("0"));
Serial.print(int(absLongitude)); //dd
if ((60*(absLongitude-(int(absLongitude)))) < 10) Serial.print(F("0"));
Serial.print(60*(absLongitude-(int(absLongitude))), 4);
Serial.print(",");
// E or W
Serial.print(gps.location.rawLng().negative ? "W," : "E,");
// x = GPS Quality indicator (0=no fix, 1=GPS fix, 2=Dif. GPS fix)
Serial.print("1,");
// xx = number of satellites in use
if (gps.satellites.value() < 10) Serial.print(F("0"));
Serial.print(gps.satellites.value());
Serial.print(",");
// x.x = horizontal dilution of precision (ignored)
// if (gps.hdop.value() < 10) Serial.print(F("0"));
// Serial.print(gps.hdop.value());
Serial.print("00.0,");
// x.x = Antenna altitude above mean-sea-level
if (gps.altitude.meters() < 10000) Serial.print(F("0"));
if (gps.altitude.meters() < 1000) Serial.print(F("0"));
if (gps.altitude.meters() < 100) Serial.print(F("0"));
if (gps.altitude.meters() < 10) Serial.print(F("0"));
Serial.print(int(gps.altitude.meters()));
Serial.print(".0,");
// M = units of antenna altitude, meters
Serial.print("M,");
// x.x = Geoidal separation (ignored)
Serial.print("0000.0,");
// M = units of geoidal separation, meters
Serial.print("M,");
// x.x = Age of Differential GPS data (seconds)
Serial.print("000.0,");
// xxxx = Differential reference station ID
Serial.print("0000,");
// End Of Message and "00" checksum
Serial.print(F("*00"));
// Carriage return and line feed
Serial.println();
}
}
void printGPRMC()
{
Serial.print("$GPRMC,");
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
Serial.print(F("0"));
Serial.print(F(","));
// Validity
Serial.print(F("A,"));
// Latitude (ddmm.mmmm format)
float absLatitude = sqrt(sq(gps.location.lat()));
if (absLatitude < 10) Serial.print(F("0"));
Serial.print(int(absLatitude)); //dd
if ((60*(absLatitude-(int(absLatitude)))) < 10) Serial.print(F("0"));
Serial.print(60*(absLatitude-(int(absLatitude))), 4);
Serial.print(",");
// N or S
Serial.print(gps.location.rawLat().negative ? "S," : "N,");
// Longitude (dddmm.mmmm format)
float absLongitude = sqrt(sq(gps.location.lng()));
if (absLongitude < 100) Serial.print(F("0"));
if (absLongitude < 10) Serial.print(F("0"));
Serial.print(int(absLongitude)); //dd
if ((60*(absLongitude-(int(absLongitude)))) < 10) Serial.print(F("0"));
Serial.print(60*(absLongitude-(int(absLongitude))), 4);
Serial.print(",");
// E or W
Serial.print(gps.location.rawLng().negative ? "W," : "E,");
// Speed in knots
if (gps.speed.knots() < 1000) Serial.print(F("0"));
if (gps.speed.knots() < 100) Serial.print(F("0"));
if (gps.speed.knots() < 10) Serial.print(F("0"));
Serial.print(gps.speed.knots());
Serial.print(F(","));
// Course in degrees true
if (gps.course.deg() < 100) Serial.print(F("0"));
if (gps.course.deg() < 10) Serial.print(F("0"));
Serial.print(gps.course.deg());
Serial.print(F(","));
// Date of fixe, ddmmyy
if (gps.date.day() < 10) Serial.print(F("0"));
Serial.print(gps.date.day());
if (gps.date.month() < 10) Serial.print(F("0"));
Serial.print(gps.date.month());
int yy = (gps.date.year() - 2000);
if (yy < 10) Serial.print(F("0"));
Serial.print(yy);
//End Of Message and 00 checksum
Serial.print(F(",,*00"));
// Carriage return and line feed
Serial.println();
}
}
void printGPZDA()
{
Serial.print("$GPZDA,");
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
Serial.print(F("0"));
Serial.print(F(","));
if (gps.date.day() < 10) Serial.print(F("0"));
Serial.print(gps.date.day());
Serial.print(F(","));
if (gps.date.month() < 10) Serial.print(F("0"));
Serial.print(gps.date.month());
Serial.print(F(","));
Serial.print(gps.date.year());
Serial.print(F(",,*00"));
// Carriage return and line feed
Serial.println();
}