From 7d09dfdda2f197dd6bb94e4f793cb367aebdaee1 Mon Sep 17 00:00:00 2001 From: Mike Barela Date: Thu, 9 May 2019 09:11:37 -0400 Subject: [PATCH] Create GPStest_RMC.ino --- GPStest_RMC/GPStest_RMC/GPStest_RMC.ino | 200 ++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 GPStest_RMC/GPStest_RMC/GPStest_RMC.ino diff --git a/GPStest_RMC/GPStest_RMC/GPStest_RMC.ino b/GPStest_RMC/GPStest_RMC/GPStest_RMC.ino new file mode 100644 index 000000000..63ed16274 --- /dev/null +++ b/GPStest_RMC/GPStest_RMC/GPStest_RMC.ino @@ -0,0 +1,200 @@ +// A simple sketch to read GPS data and parse the $GPRMC string +// see http://www.ladyada.net/make/gpsshield for more info + +// If using Arduino IDE prior to version 1.0, +// make sure to install newsoftserial from Mikal Hart +// http://arduiniana.org/libraries/NewSoftSerial/ +#if ARDUINO >= 100 + #include "Arduino.h" + #include "SoftwareSerial.h" +#else + #include "WProgram.h" + #include "NewSoftSerial.h" +#endif + +// Use pins 2 and 3 to talk to the GPS. 2 is the TX pin, 3 is the RX pin +#if ARDUINO >= 100 +SoftwareSerial mySerial = SoftwareSerial(2, 3); +#else +NewSoftSerial mySerial = NewSoftSerial(2, 3); +#endif + +// Use pin 4 to control power to the GPS +#define powerpin 4 + +// Set the GPSRATE to the baud rate of the GPS module. Most are 4800 +// but some are 38400 or other. Check the datasheet! +#define GPSRATE 4800 +//#define GPSRATE 38400 + +// The buffer size that will hold a GPS sentence. They tend to be 80 characters long +// so 90 is plenty. +#define BUFFSIZ 90 // plenty big + + +// global variables +char buffer[BUFFSIZ]; // string buffer for the sentence +char *parseptr; // a character pointer for parsing +char buffidx; // an indexer into the buffer + +// The time, date, location data, etc. +uint8_t hour, minute, second, year, month, date; +uint32_t latitude, longitude, trackangle; +uint8_t groundspeed; +char latdir, longdir; +char status; + +void setup() +{ + if (powerpin) { + pinMode(powerpin, OUTPUT); + } + + // Use the pin 13 LED as an indicator + pinMode(13, OUTPUT); + + // connect to the serial terminal at 9600 baud + Serial.begin(9600); + + // connect to the GPS at the desired rate + mySerial.begin(GPSRATE); + + // prints title with ending line break + Serial.println("GPS parser"); + + digitalWrite(powerpin, LOW); // pull low to turn on! +} + +uint32_t parsedecimal(char *str) { + uint32_t d = 0; + + while (str[0] != 0) { + if ((str[0] > '9') || (str[0] < '0')) + return d; + d *= 10; + d += str[0] - '0'; + str++; + } + return d; +} + +void readline(void) { + char c; + + buffidx = 0; // start at begninning + while (1) { + c=mySerial.read(); + if (c == -1) + continue; + Serial.print(c); + if (c == '\n') + continue; + if ((buffidx == BUFFSIZ-1) || (c == '\r')) { + buffer[buffidx] = 0; + return; + } + buffer[buffidx++]= c; + } +} + +void loop() +{ + uint32_t tmp; + + Serial.print("\n\rRead: "); + readline(); + + // check if $GPRMC (global positioning fixed data) + if (strncmp(buffer, "$GPRMC",6) == 0) { + + // hhmmss time data + parseptr = buffer+7; + tmp = parsedecimal(parseptr); + hour = tmp / 10000; + minute = (tmp / 100) % 100; + second = tmp % 100; + + parseptr = strchr(parseptr, ',') + 1; + status = parseptr[0]; + parseptr += 2; + + // grab latitude & long data + // latitude + latitude = parsedecimal(parseptr); + if (latitude != 0) { + latitude *= 10000; + parseptr = strchr(parseptr, '.')+1; + latitude += parsedecimal(parseptr); + } + parseptr = strchr(parseptr, ',') + 1; + // read latitude N/S data + if (parseptr[0] != ',') { + latdir = parseptr[0]; + } + + //Serial.println(latdir); + + // longitude + parseptr = strchr(parseptr, ',')+1; + longitude = parsedecimal(parseptr); + if (longitude != 0) { + longitude *= 10000; + parseptr = strchr(parseptr, '.')+1; + longitude += parsedecimal(parseptr); + } + parseptr = strchr(parseptr, ',')+1; + // read longitude E/W data + if (parseptr[0] != ',') { + longdir = parseptr[0]; + } + + + // groundspeed + parseptr = strchr(parseptr, ',')+1; + groundspeed = parsedecimal(parseptr); + + // track angle + parseptr = strchr(parseptr, ',')+1; + trackangle = parsedecimal(parseptr); + + + // date + parseptr = strchr(parseptr, ',')+1; + tmp = parsedecimal(parseptr); + date = tmp / 10000; + month = (tmp / 100) % 100; + year = tmp % 100; + + Serial.print("\n\tTime: "); + Serial.print(hour, DEC); Serial.print(':'); + Serial.print(minute, DEC); Serial.print(':'); + Serial.println(second, DEC); + Serial.print("\tDate: "); + Serial.print(month, DEC); Serial.print('/'); + Serial.print(date, DEC); Serial.print('/'); + Serial.println(year, DEC); + + Serial.print("\tLat: "); + if (latdir == 'N') + Serial.print('+'); + else if (latdir == 'S') + Serial.print('-'); + + Serial.print(latitude/1000000, DEC); Serial.print("* "); + Serial.print((latitude/10000)%100, DEC); Serial.print('\''); Serial.print(' '); + Serial.print((latitude%10000)*6/1000, DEC); Serial.print('.'); + Serial.print(((latitude%10000)*6/10)%100, DEC); Serial.println('"'); + + Serial.print("\tLong: "); + if (longdir == 'E') + Serial.print('+'); + else if (longdir == 'W') + Serial.print('-'); + Serial.print(longitude/1000000, DEC); Serial.print("* "); + Serial.print((longitude/10000)%100, DEC); Serial.print('\''); Serial.print(' '); + Serial.print((longitude%10000)*6/1000, DEC); Serial.print('.'); + Serial.print(((longitude%10000)*6/10)%100, DEC); Serial.println('"'); + + } + //Serial.println(buffer); +}