/* * NEO-6M GPS Module Test Code * Author: Lucienne Swart * Date: 2025/03/11 * * Description: * This program reads data from a NEO-6M GPS module using an Arduino Uno and * displays latitude, longitude, speed, number of satellites, and HDOP. * * Wiring: * - GPS TX -> Arduino Pin 4 (RX) * - GPS RX -> Arduino Pin 3 (TX) * - GPS VCC -> 5V (or 3.3V depending on module) * - GPS GND -> GND * * Dependencies: * - TinyGPS++ Library (by Mikal Hart) * - SoftwareSerial Library (for UART communication with GPS) * * Notes: * - The GPS module requires some time (up to 10–15 minutes for a cold start) * to acquire a satellite fix, especially when used for the first time. * - Ensure you are testing outdoors in an open space for the best signal reception. */ #include #include // Define pins for SoftwareSerial (adjust if needed) static const int RXPin = 4; // Connect to TX of NEO-6M static const int TXPin = 3; // Connect to RX of NEO-6M static const uint32_t GPSBaud = 9600; // Default baud rate for the NEO-6M // Create SoftwareSerial object for GPS communication SoftwareSerial gpsSerial(RXPin, TXPin); // Create a TinyGPS++ object TinyGPSPlus gps; void setup() { // Begin Serial communication for debugging output Serial.begin(115200); // Begin SoftwareSerial for the GPS module gpsSerial.begin(GPSBaud); Serial.println("NEO-6M GPS Comprehensive Stats"); Serial.println("Waiting for GPS data..."); } void loop() { // Process all available GPS data while (gpsSerial.available() > 0) { char c = gpsSerial.read(); gps.encode(c); } // If new GPS location data is available, display the stats if (gps.location.isUpdated()) { Serial.println("================================"); // Date Information Serial.print("Date: "); if (gps.date.isValid()) { Serial.print(gps.date.month()); Serial.print("/"); Serial.print(gps.date.day()); Serial.print("/"); Serial.println(gps.date.year()); } else { Serial.println("INVALID"); } // Time Information Serial.print("Time: "); if (gps.time.isValid()) { // Formatting to ensure two digits per field if (gps.time.hour() < 10) Serial.print("0"); Serial.print(gps.time.hour()); Serial.print(":"); if (gps.time.minute() < 10) Serial.print("0"); Serial.print(gps.time.minute()); Serial.print(":"); if (gps.time.second() < 10) Serial.print("0"); Serial.println(gps.time.second()); } else { Serial.println("INVALID"); } // Location: Latitude and Longitude Serial.print("Latitude: "); if (gps.location.isValid()) { Serial.print(gps.location.lat(), 6); } else { Serial.print("INVALID"); } Serial.print(" | Longitude: "); if (gps.location.isValid()) { Serial.println(gps.location.lng(), 6); } else { Serial.println("INVALID"); } // Speed Serial.print("Speed: "); if (gps.speed.isValid()) { Serial.print(gps.speed.kmph()); Serial.println(" km/h"); } else { Serial.println("INVALID"); } // Course Serial.print("Course: "); if (gps.course.isValid()) { Serial.print(gps.course.deg()); Serial.println("°"); } else { Serial.println("INVALID"); } // HDOP (Horizontal Dilution of Precision) Serial.print("HDOP: "); // The HDOP value is provided in hundredths; convert it to a float value. if (gps.hdop.isValid()) { Serial.println(gps.hdop.value() / 100.0); } else { Serial.println("INVALID"); } // Number of Satellites in view Serial.print("Satellites: "); Serial.println(gps.satellites.value()); Serial.println("================================\n"); } }