Embedded B.Tech Beginner

Arduino Location Tracker using SIM800L GSM Module and NEO-6M GPS Module

Learn how to build a GPS tracker using Arduino UNO, SIM800L GSM module, and NEO-6M GPS with GeoLinker. This DIY project offers real-time location tracking, historical

  • Suitable forB.Tech Embedded students
  • Build time3-4 weeks
  • LevelBeginner
  • Available atAjvika Labs, Kakinada

About this project

Ever wanted to track your bike, car, or even monitor your loved one's location in real-time? Building your own Arduino GPS tracker gives you complete control over your tracking data without expensive monthly subscriptions. This comprehensive project shows you how to create a fully functional GPS tracking system using Arduino UNO R3, SIM800L GSM module, and NEO-6M GPS module, a perfect low-cost DIY combination for vehicle monitoring, asset protection, or personal safety applications. Explore our other GPS tracker builds, like a GPS tracker using ESP32 and a Raspberry Pi Pico GPS tracker . Explore hands-on, simple Arduino projects with complete source code, circuit diagrams, and step-by-step explanations. Perfect for beginners and advanced makers looking to create real-world applications. Master electronics by working on practical DIY electronic projects for students and engineers alike.

Commercial GPS trackers can cost $20-50 monthly in subscription fees, but our Arduino-based GPS tracker only requires a basic SIM card data plan. This article provides you complete step-by-step guide on how to build a practical GPS tracking device using Arduino to send real-time location data to the cloud, including web dashboard access and historical tracking. Yes, we wanted this project to be low-cost, simple to build, and yet practical so that you can use it in real life. Which is why we did not stop with just providing the Circuit Diagram and Code, but built a complete GPS Tracking platform called Geolinker , which is completely free to use. Basically, the Arduino hardware reads the GPS location data from satellite using the NEO-6M GPS module and sends it to the GeoLinker GPS visualizer via an API using the SIM800L Module, as shown in the infographic GIF below. We have also built the GeoLinker Lite Arduino Library that allows you to easily communicate with the GeoLinker web App from Arduino. We will discuss more on this later in this article.

Explore our other GPS tracker builds, like a GPS tracker using ESP32 and a Raspberry Pi Pico GPS tracker . We've built many other projects using an Arduino that we think you'll enjoy.

In fact, we have tested this Arduino-based GPS tracker project extensively at CircuitDigest around our office, and you can see a small snippet of the result in the first image. Notice how the GPS location is updated as the actual hardware (shown inside the purple box) is moving around outside.

This way, you can not only track the location history of your Arduino-based GPS Tracker but can also use the GeoLinker web app to save the results, share them with someone, calculate the speed and distance, etc. Sounds interesting, right?! So let's get right into it and start building....

Arduino GPS Tracker using SIM800L and NEO-6M - Overview

Build Time: 6-8 hours | Cost: $25-35 | Difficulty: Intermediate

What You'll Learn: GPS data parsing, GSM communication, Cloud integration, Serial communication

Applications: Vehicle tracking, Asset monitoring, Personal safety, Location history analysis

Why Build Your Own Arduino GPS Tracker?

└ Neo-6M GPS Module Connections

└ SIM800L GSM Module Connections (Requires Level Shifting)

└ Critical Connection Notes

└ GeoLinker Lite Arduino Library

Troubleshooting Guide

Building this Arduino GPS tracker requires readily available components with an estimated total cost of $25-35. All components can be sourced from electronics suppliers like Amazon, AliExpress, or local electronics stores. Here's everything you need for this GPS tracking system using Arduino :

Estimated Cost USD - (INR)

Main microcontroller board

2G cellular communication

GPS receiver for location data

Prototype circuit connections

Resistors (4.7kΩ, 10kΩ)

Voltage divider for SIM800L

Additional Requirements: You'll also need a 2G-compatible SIM card with a data plan ($5-10/month) and a power bank for portable operation. For permanent installations, consider using a 12V to 5V converter for the vehicle power supply. Also, if you are using from India, you will need an Airtel, Vodafone, or BSNL sim card with an active data plan. Please note we are using a 2G GSM module like SIM800L, so JIO and other 4G or 5G only networks will not work. We are also building a 4G GPS tracker. Stay tuned if you need more information on that.

Why Build Your Own Arduino GPS Tracker?

⇒ Zero Monthly Subscription Fees - Unlike commercial trackers charging $20-50/month, our Arduino GPS tracker only needs a basic SIM card data plan (typically $5-10/month)

⇒ Real-time Location Monitoring - Track your vehicle, bike, or assets anywhere with continuous GPS updates showing exact latitude, longitude, and timestamps

⇒ Professional Web Dashboard - Access your tracker's location from any device through our user-friendly GeoLinker Cloud interface - no app downloads required

⇒ Complete Hardware Control - Modify tracking intervals, add sensors, or integrate with your own systems using our open-source approach

⇒ Comprehensive Data Analysis - Download location history in CSV format to analyse travel patterns, time spent at locations, or create detailed reports

⇒ Memory Optimised for Arduino UNO - Built specifically for Arduino UNO R3's 2KB RAM limitation using our lightweight GeoLinker Lite library

⇒ Global GSM Network Support - Works on any 2G network worldwide, ensuring your GPS tracker using Arduino stays connected even in remote areas

⇒ Scalable Multi-device Platform - Track multiple vehicles or assets from a single GeoLinker Cloud account with enterprise-grade reliability

Arduino GPS Tracker Circuit Diagram

The Arduino GPS tracker circuit connects three main components: Arduino UNO R3, NEO-6M GPS module, and SIM800L GSM module. This design uses both hardware and software serial communication since Arduino UNO has only one hardware serial port. Follow the diagram below for proper connections.

The NEO-6M GPS module requires only three connections to the Arduino. This module continuously sends location data that the Arduino reads and processes for our GPS tracking system . If you are completely new to the NEO-6 M GPS module, I will definitely recommend that you check out our NEO-6M Arduino Tutorial to understand the basics of how this GPS module works.

Powered by Arduino 5V

GPS → Arduino for receiving location data

Not connected (Reserved for Serial Debugging)

Not needed (Arduino doesn’t send commands to GPS)

The SIM800L module needs special attention because it operates at 3.3V logic levels while Arduino uses 5V. We need a voltage divider circuit to protect the SIM800L from damage. If you are new to the SIM800L GSM module, check out our Arduino SIM800L tutorial to understand the basics of this module and how to use it with Arduino.

Important: Power the SIM800L through a diode from Arduino's 5V pin when using a power bank for adequate current supply.

Diode drop from Arduino 5V (~4.3V) using power bank

Pin 8 (via Voltage Divider)

Arduino → SIM800L for sending AT commands

SIM800L → Arduino; 3.3V compatible with Arduino 5V input

Power Requirements: Never power this Arduino GPS tracker from a computer USB port alone. The SIM800L requires up to 2A during transmission, which standard USB ports cannot provide. Always use a power bank or external 5V power supply.

Reset Pin Connection: Connect Arduino Pin 2 to the RST (reset) pin. This enables automatic switching between GPS and GSM modes to prevent memory corruption issues common with Arduino UNO's limited 2KB RAM.

Programming Tip: Always disconnect the GPS module's TX wire from Arduino Pin 0 before uploading code. The continuous GPS data interferes with programming. Reconnect after successful upload.

As mentioned earlier, Pin 2 connects to the Arduino's RST (reset) pin. This is used to switch between the GPS and GSM modes. If you wonder why we have to do this, it is because of the limited RAM available in the ATMEGA328 . Without this, we have faced memory corruption when we used both GPS and GSM routines in the same sketch, caused by the huge string elements used in NMEA parsing and GSM HTTP post request payload. To prevent these kinds of issues, we have implemented two modes, in which the MCU will only need to handle the global and local variables that are specific to that mode, which prevents any memory corruption.

While testing the circuit, I noticed that some clone Arduino boards have issues with the software serial. In some instances, even simple serial pass-through examples didn’t work. We never had any issue with a genuine Arduino Uno board. I assume this is because the Atmega328 used in these boards is also non-genuine. So keep this in mind, and if you face such issues, try to use a genuine Arduino board. Here is the final setup of our hardware.

Arduino GPS Tracker Code Explanation

With the hardware connections complete, the next step involves implementing code for your GPS tracker. The GeoLinker Lite library simplifies the coding process by handling GPS communication, GSM connectivity, and cloud integration through straightforward function calls.

As mentioned earlier, we'll be using our GeoLinker Cloud platform for data storage and the specially designed GeoLinker Lite library optimised for Arduino UNO's limited 2KB RAM. We previously released the GeoLinker library for development boards with higher RAM capacity, such as the ESP32, ESP8266, Arduino UNO R4, Raspberry Pi Pico W, and Pico 2W. These boards can handle the full GeoLinker library without issues. Our ESP32 GPS tracker project shows how this library works and how to use it with ease.

But when it comes to the classic boards like Arduino UNO R3 and Nano, they have a limited RAM of only 2Kb , which prevents them from using the standard GeoLinker library. These classic boards remain popular for many projects, but their memory constraints require a different approach. To address this limitation, we have released GeoLinker Lite , a simplified version designed specifically for boards with limited memory.

GeoLinker Lite includes the core functions needed for GPS tracking whilst working within the memory limits of boards like Arduino UNO R3 and Nano. This library allows users of classic Arduino boards to connect to our cloud platform for location tracking and remote monitoring.

Begin by installing the GeoLinker Lite library through the Arduino IDE library manager. Open the Arduino IDE, navigate to Tools > Manage Libraries , then search for \" GeoLinker Lite \" in the Library Manager. Click Install to add the library to your Arduino environment.

This library is specifically optimised for Arduino UNO R3 and Nano boards with limited RAM capacity.

The code starts by including the GeoLinker Lite header file with #include `GeoLinkerLite.h` . Next, create a GeoLinkerLite instance using GeoLinkerLite geoLinker(Serial, Serial). This constructor takes two parameters: the first Serial, which refers to GPS communication, and the second Serial handles debug output. Both use the same Serial port since the Arduino Uno has only one hardware serial. Using multiple software serials can cause issues, and the GPS module only sends data to the Arduino, whilst debug information goes to the serial monitor.

The setup function initialises serial communication at a 9600 baud rate. A 1000ms delay allows the system to stabilise before configuration begins. The geoLinker.setResetPin(2) function configures digital Pin 2 as the reset control pin, enabling automatic system restart when needed. This is necessary to switch between modes since there is no software-based reboot control for Arduino. The geoLinker.setGSMPins() function assigns RX and b for communication with the SIM800L module.

After that, you can find the network and cloud configuration parameters. The geoLinker.setModemAPN() function is used to set your mobile carrier's Access Point Name, which is essential for GPRS connectivity. Replace this with your specific carrier's APN settings. The geoLinker.setDeviceID() function assigns a unique identifier to your tracker for identification on the cloud platform. By configuring the device ID, you can not only easily identify your tracker, but also use multiple such trackers in a single Circuit Digest Cloud account.

The geoLinker.setAPIKey() function is used to configure the API key that is necessary to connect your device to the GeoLinker Cloud platform. You can obtain your unique API key from your CircuitDigest Cloud account. Just go to the official CircuitDigest Cloud website at https://circuitdigest.cloud and in the top right corner, click Sign in.

If you are new to CircuitDigest Cloud, you need to register a new account by following the steps below.

The next step is to generate the API Key.

⇒ Step 4: You will be directed to a page where you can generate your API Key.

⇒ Step 5: By pressing the copy icon near the API Key, your key gets instantly copied to the clipboard.

Currently, there is a usage limit of 100 requests per API key for both the SMS and ANPR APIs and 10,000 data points for GPS tracking . Once you reach this limit, you can generate another key, which provides an additional 100 uses, which i s more than enough for a hobby project or a pilot engineering project.

This usage limit is in place to prevent server overload.

With this, we are ready to move to hardware.

* Note : A 10-second rate limit applies to all API calls, allowing one request every 10 seconds.

More details on how to use GeoLinker can be found in our previous tutorial, Free IoT-based GPS Tracking Map for ESP32, NodeMCU, and Arduino .

The geoLinker.setMaxRetries() function determines how many times the system attempts to send data via GPRS before giving up. This helps handle temporary network issues without infinite retry loops. The geoLinker.setDebugLevel() function controls the amount of diagnostic information sent to the serial monitor. With 0, no debugging data will be printed. With 1 minimal debugging information, and 2 detailed debugging information will be printed on the serial monitor. The geoLinker.setTimeOffset(5, 30) function configures timezone settings, with the example showing India's UTC+5:30 offset. This is used for time offset correction since the time stamp from the GPS data will be UTC.

The geoLinker.begin() function initialises all components, establishes GPS communication, connects to the GSM network, and prepares the system for operation. After a 1000ms delay, the geoLinker.run() function starts the main tracking loop. This function handles GPS data collection, processes location information, and transmits data to the GeoLinker Cloud platform. Increasing the delay before geoLinker.run() extends the interval between location updates. By default, the delay between the location updates is 20 seconds.

The loop function remains empty with only a delay statement because of the geoLinker.run() function manages the entire tracking process internally. The system operates continuously within the run function, collecting GPS data, managing GSM communication, and handling automatic resets when necessary.

Download Code from GitHub Repository

Here is the link to our GitHub repository, where you'll find the source code, schematics, and all other necessary files to build your own GPS Tracker using Arduino Uno, SIM800L, and Neo-6 M GPS module.

Testing Arduino GPS Tracker in the Real World

After uploading the code, take your Arduino GPS tracker outdoors for testing. GPS modules require a clear sky view and typically need 2-5 minutes for initial satellite lock. Open Serial Monitor at 9600 baud to watch the boot sequence. You should see GPS signal acquisition, network registration, and successful data uploads to GeoLinker Cloud, as shown in the image below. You can see the serial monitor of Arduino on the left and the Geolinker map on the right. The hardware is connected to a laptop and moved around on the streets during this testing.

Next, we decided to test by moving to different locations and see how the values get updated on the geolinker map. The default tracking interval in our code is 20 seconds, and location accuracy should be within 3-5 meters. We powered the hardware with a power bank placed in on the car dashboard and started driving to test if the DIY GPS tracker is working the way it is supposed to. As you can see in the image below, as we drive around, the location gets updated on the app. You can even see that the waypoints are plotted very close together at places where there is traffic.

In conclusion, this simple Arduino Location tracker works much better than we expected it to be and is very practical to be used for vehicle tracking, pet tracking, or asset tracking applications. We build everything on a breadboard to keep it beginner-friendly friendly but you can take it ahead and build a PCB with a neat enclosure. Also, having the location data sent to GeoLinker opens to many more possibilities. You can not only visualise your data with Geolinker, but you can also share it, filter it, download it as a table, calculate speed, distance, and much more. You can fiddle around with the options there to explore more. You can track multiple devices with just a single API key, but the maximum number of waypoints is limited to 10,000, which is more than enough for personal use or for testing small prototypes. After 10,000 waypoints, your oldest data will be overwritten. You can also delete these waypoints if you want to make space for new devices.

Technologies used

ESP32ESP8266ArduinoRaspberry PiATmegaPICBLEGSM4GCAN

Hardware components

  • ESP32
  • ESP8266
  • Arduino
  • Raspberry Pi
  • MPU
  • LED
  • Sensor
  • Module
  • Board
  • GPS
  • GSM
  • SIM800
  • PCB
  • NEO-6M

Software & tools

  • Arduino IDE

Project demo video

What you get

  • Working project / hardware kit, tested before delivery
  • Complete source code with explanation
  • Project demo and guidance for your viva
  • Project report, PPT and IEEE paper support (on request)
Delivery & Payment
Delivery takes a minimum of two weeks from the date your inquiry is confirmed. Payment is in two parts: • 50% advance to start the project • Remaining 50% before delivery Note: • Documentation and PPT are not included by default • If you need documentation/PPT, it can be arranged for extra time and cost We'll confirm the exact timeline and cost with you after reviewing your requirements.