Why GSM Instead of Wi-Fi?

What You’ll Need

Optional: a Li-ion or LiPo battery for powering the GSM module.

Component Notes

Setting Up GeoLinker Cloud

GeoLinker is CircuitDigest’s free cloud platform for IoT visualization.

Steps to get your API key:

  1. Go to CircuitDigest Cloud.

  2. Click Login and create a free account if you don’t have one.

  3. Once logged in, go to My Account → Generate API Key.

  4. Copy the API key and use it in your Arduino code.

Each key can handle around 10,000 GPS data points before renewal.

Circuit Connections

The SIM800L should be powered at 3.7–4.2V. Use a separate Li-ion cell, a LiPo, or a buck converter from 5V.

Arduino Code Overview

We’ll use the GeoLinker Arduino Library to handle GPS parsing, GSM communication, and cloud upload.

Include the library:

#include <GeoLinker.h>

GPS Configuration:

HardwareSerial gpsSerial(1);
#define GPS_RX 16
#define GPS_TX 17
#define GPS_BAUD 9600

GSM Configuration:

HardwareSerial gsmSerial(2);
#define GSM_RX 18
#define GSM_TX 19
#define GSM_BAUD 9600

Network and Cloud Setup:

const char* apn = "yourAPN";
const char* apiKey = "yourAPIkey";
const char* deviceID = "ESP32_Sim800L";

LEDs:

const int DataSent_LED = 32;
const int GPSFix_LED = 23;

GeoLinker Initialization:

GeoLinker geo;

void setup() {  Serial.begin(115200);  gpsSerial.begin(GPS_BAUD, SERIAL_8N1, GPS_RX, GPS_TX);  gsmSerial.begin(GSM_BAUD, SERIAL_8N1, GSM_RX, GSM_TX);
  pinMode(DataSent_LED, OUTPUT);  pinMode(GPSFix_LED, OUTPUT);
  geo.begin(gpsSerial);  geo.setApiKey(apiKey);  geo.setDeviceID(deviceID);  geo.setNetworkMode(GEOLINKER_CELLULAR);  geo.setModemCredentials(apn, nullptr, nullptr);  geo.beginModem(gsmSerial, -1, -1, true);  geo.setUpdateInterval_seconds(30);
}

Main Loop:

void loop() {  uint8_t status = geo.loop();
  if ((status != STATUS_GPS_ERROR) && (status != STATUS_PARSE_ERROR))    digitalWrite(GPSFix_LED, HIGH);  else    digitalWrite(GPSFix_LED, LOW);
  if (status == STATUS_SENT) {    digitalWrite(DataSent_LED, HIGH);    delay(1000);    digitalWrite(DataSent_LED, LOW);  }
}

That’s all you need. The library manages all the background work automatically.

Testing and Debugging

When you power it up:

Once both modules are active, open the GeoLinker dashboard to see your live location updates in real time.

Pro tip: test outdoors for a faster GPS fix.

Common Issues

No GPS Lock?

SIM800L not connecting?

Data not uploading?

Power Optimization Tips

Final Notes

This ESP32 GPS Tracker with SIM800L is a solid weekend build that blends hardware tinkering with IoT connectivity. It’s easy to modify, and the GeoLinker platform takes care of all the backend work.