Yarana Iot Guru
Published © MIT

Vehicle Tracking System Using IoT | ESP32 4G LTE GPS & MQTT

ESP32-based 4G LTE GPS tracker using MQTT for real-time vehicle tracking on a live web dashboard.

BeginnerFull instructions provided8 hours22
Vehicle Tracking System Using IoT | ESP32 4G LTE GPS & MQTT

Things used in this project

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Code

πŸ“Œ ESP32 4G LTE GPS Tracker Firmware (Complete Code)

C/C++
#define TINY_GSM_MODEM_SIM7600
#define TINY_GSM_RX_BUFFER 1024

#include <TinyGsmClient.h>
#include <PubSubClient.h>
#include <TinyGPSPlus.h>
#include <Wire.h>
#include <U8g2lib.h>

// ================= PIN DEFINITIONS =================
#define MODEM_RX 16
#define MODEM_TX 17

#define GPS_RX 27
#define GPS_TX 14

#define OLED_SDA 33
#define OLED_SCL 32

// ================= NETWORK CONFIG =================
const char apn[]  = "airtelgprs.com";
const char user[] = "";
const char pass[] = "";

const char* broker = "broker.emqx.io";
const int   port   = 1883;
const char* gpsTopic = "device/SL001/gps";

// ================= OBJECTS =================
HardwareSerial SerialAT(2);
HardwareSerial gpsSerial(1);

TinyGsm modem(SerialAT);
TinyGsmClient gsmClient(modem);
PubSubClient mqtt(gsmClient);
TinyGPSPlus gps;

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);

unsigned long lastPublish = 0;

// ================= DIRECTION FUNCTION =================
String getDirection(float deg) {
  const char* directions[] = {"N","NE","E","SE","S","SW","W","NW"};
  int index = round(deg / 45.0) % 8;
  return directions[index];
}

// ================= GPRS CONNECT =================
bool connectGPRS() {
  Serial.println("Checking Network...");
  if (!modem.waitForNetwork()) {
    Serial.println("Network Failed");
    return false;
  }

  Serial.println("Connecting GPRS...");
  if (!modem.gprsConnect(apn, user, pass)) {
    Serial.println("GPRS Failed");
    return false;
  }

  Serial.println("GPRS Connected");
  return true;
}

// ================= MQTT CONNECT =================
bool connectMQTT() {
  String clientID = "ESP32_" + String(random(10000));
  if (mqtt.connect(clientID.c_str())) {
    Serial.println("MQTT Connected");
    return true;
  }
  Serial.println("MQTT Failed");
  return false;
}

// ================= OLED UPDATE =================
void updateOLED(float lat, float lng, float speed, float alt, float course, int sat) {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_6x12_tr);

  char buffer[32];

  u8g2.drawStr(0,10,"SL001 GPS TRACKER");

  sprintf(buffer,"Lat: %.5f", lat);
  u8g2.drawStr(0,22,buffer);

  sprintf(buffer,"Lng: %.5f", lng);
  u8g2.drawStr(0,32,buffer);

  sprintf(buffer,"Spd: %.1f kmh", speed);
  u8g2.drawStr(0,42,buffer);

  sprintf(buffer,"Alt: %.0f m", alt);
  u8g2.drawStr(0,52,buffer);

  String dir = getDirection(course);
  u8g2.drawStr(90,22,dir.c_str());

  sprintf(buffer,"Sat:%d", sat);
  u8g2.drawStr(90,32,buffer);

  u8g2.sendBuffer();
}

// ================= SETUP =================
void setup() {

  Serial.begin(115200);

  SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
  gpsSerial.begin(9600, SERIAL_8N1, GPS_RX, GPS_TX);

  Wire.begin(OLED_SDA, OLED_SCL);
  u8g2.begin();

  u8g2.clearBuffer();
  u8g2.drawStr(20,30,"Starting...");
  u8g2.sendBuffer();

  modem.restart();

  connectGPRS();

  mqtt.setServer(broker, port);
  connectMQTT();

  Serial.println("SYSTEM READY");
}

// ================= LOOP =================
void loop() {

  while (gpsSerial.available()) {
    gps.encode(gpsSerial.read());
  }

  if (!mqtt.connected()) {
    connectGPRS();
    connectMQTT();
  }

  mqtt.loop();

  if (gps.location.isValid()) {

    float lat = gps.location.lat();
    float lng = gps.location.lng();
    float speed = gps.speed.kmph();
    float altitude = gps.altitude.meters();
    float course = gps.course.deg();
    int sat = gps.satellites.value();

    updateOLED(lat, lng, speed, altitude, course, sat);

    if (millis() - lastPublish > 5000) {

      String payload = "{";
      payload += "\"lat\":" + String(lat,6) + ",";
      payload += "\"lng\":" + String(lng,6) + ",";
      payload += "\"speed\":" + String(speed,1) + ",";
      payload += "\"sat\":" + String(sat) + ",";
      payload += "\"altitude\":" + String(altitude,1) + ",";
      payload += "\"direction\":" + String(course,1);
      payload += "}";

      mqtt.publish(gpsTopic, payload.c_str());

      Serial.println("Published:");
      Serial.println(payload);

      lastPublish = millis();
    }
  }
}

Credits

Yarana Iot Guru
48 projects β€’ 24 followers
Yarana Iot GuruYarana IoT Guru: Arduino,ESP32, GSM, NodeMCU & more.Projects, Tutorials & App Development. Innovate with us!
Thanks to Yarana IoT Guru.

Comments