#include //====================================================================== // Program: NMEAloc.ino // // Description: This program only parses an RMC sentence for the lat/lon. // // Prerequisites: // 1) NMEA.ino works with your device (correct TX/RX pins and baud rate) // 2) The RMC sentence has been enabled. // 3) Your device sends an RMC sentence (e.g., $GPRMC). // // 'Serial' is for debug output to the Serial Monitor window. // // License: // Copyright (C) 2014-2017, SlashDevin // // This file is part of NeoGPS // // NeoGPS is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // NeoGPS is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with NeoGPS. If not, see . // //====================================================================== #include //------------------------------------------------------------ // Check that the config files are set up properly #if !defined( NMEAGPS_PARSE_RMC ) #error You must uncomment NMEAGPS_PARSE_RMC in NMEAGPS_cfg.h! #endif #if !defined( GPS_FIX_TIME ) #error You must uncomment GPS_FIX_TIME in GPSfix_cfg.h! #endif #if !defined( GPS_FIX_LOCATION ) #error You must uncomment GPS_FIX_LOCATION in GPSfix_cfg.h! #endif #if !defined( GPS_FIX_SPEED ) #error You must uncomment GPS_FIX_SPEED in GPSfix_cfg.h! #endif #if !defined( GPS_FIX_SATELLITES ) #error You must uncomment GPS_FIX_SATELLITES in GPSfix_cfg.h! #endif #ifdef NMEAGPS_INTERRUPT_PROCESSING #error You must *NOT* define NMEAGPS_INTERRUPT_PROCESSING in NMEAGPS_cfg.h! #endif //------------------------------------------------------------ static NMEAGPS gps; // This parses the GPS characters //---------------------------------------------------------------- // Print the 32-bit integer degrees *as if* they were high-precision floats static void printL( Print & outs, int32_t degE7 ); static void printL( Print & outs, int32_t degE7 ) { // Extract and print negative sign if (degE7 < 0) { degE7 = -degE7; outs.print( '-' ); } // Whole degrees int32_t deg = degE7 / 10000000L; outs.print( deg ); outs.print( '.' ); // Get fractional degrees degE7 -= deg*10000000L; // Print leading zeroes, if needed int32_t factor = 1000000L; while ((degE7 < factor) && (factor > 1L)){ outs.print( '0' ); factor /= 10L; } // Print fractional degrees outs.print( degE7 ); } static void doSomeWork( const gps_fix & fix ); static void doSomeWork( const gps_fix & fix ) { // This is the best place to do your time-consuming work, right after // the RMC sentence was received. If you do anything in "loop()", // you could cause GPS characters to be lost, and you will not // get a good lat/lon. // For this example, we just print the lat/lon. If you print too much, // this routine will not get back to "loop()" in time to process // the next set of GPS data. if (fix.valid.location) { if ( fix.dateTime.seconds < 10 ) DEBUG_PORT.print( '0' ); DEBUG_PORT.print( fix.dateTime.seconds ); DEBUG_PORT.print( ',' ); // DEBUG_PORT.print( fix.latitude(), 6 ); // floating-point display // DEBUG_PORT.print( fix.latitudeL() ); // integer display printL( DEBUG_PORT, fix.latitudeL() ); // prints int like a float DEBUG_PORT.print( ',' ); // DEBUG_PORT.print( fix.longitude(), 6 ); // floating-point display // DEBUG_PORT.print( fix.longitudeL() ); // integer display printL( DEBUG_PORT, fix.longitudeL() ); // prints int like a float DEBUG_PORT.print( ',' ); if (fix.valid.satellites) DEBUG_PORT.print( fix.satellites ); DEBUG_PORT.print( ',' ); DEBUG_PORT.print( fix.speed(), 6 ); DEBUG_PORT.print( F(" kn = ") ); DEBUG_PORT.print( fix.speed_mph(), 6 ); DEBUG_PORT.print( F(" mph") ); } else { // No valid location data yet! DEBUG_PORT.print( '?' ); } DEBUG_PORT.println(); } // doSomeWork //------------------------------------ static void GPSloop(); static void GPSloop() { while (gps.available( gpsPort )) doSomeWork( gps.read() ); } // GPSloop //-------------------------- void setup() { DEBUG_PORT.begin(9600); while (!DEBUG_PORT) ; DEBUG_PORT.print( F("NMEAloc.INO: started\n") ); DEBUG_PORT.print( F("fix object size = ") ); DEBUG_PORT.println( sizeof(gps.fix()) ); DEBUG_PORT.print( F("NMEAGPS object size = ") ); DEBUG_PORT.println( sizeof(gps) ); DEBUG_PORT.println( F("Looking for GPS device on " GPS_PORT_NAME) ); #ifdef NMEAGPS_NO_MERGING DEBUG_PORT.println( F("Only displaying data from xxRMC sentences.\n Other sentences may be parsed, but their data will not be displayed.") ); #endif DEBUG_PORT.flush(); gpsPort.begin(9600); } //-------------------------- void loop() { GPSloop(); }