Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino UNO Based GPS and RFID Tracking System with Wi-Fi Connectivity

View and Edit Project In Cirkit DesignerImage of Arduino UNO Based GPS and RFID Tracking System with Wi-Fi Connectivity

Circuit Documentation

Summary

This circuit integrates an Arduino UNO with a GPS NEO 6M module, an RFID-RC522 reader, and a Piezo Speaker to create a system capable of reading RFID tags, obtaining GPS coordinates, and providing audio feedback. The system is designed to interface with Firebase for data storage and retrieval, and it connects to a Wi-Fi network for internet access. The primary application of this circuit could be for a smart transport system or location-based tracking with RFID authentication.

Component List

Arduino UNO

GPS NEO 6M

RFID-RC522

Piezo Speaker

Wiring Details

Arduino UNO

GPS NEO 6M

RFID-RC522

Piezo Speaker

Documented Code

#include <ESP8266WiFi.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <MFRC522.h>
#include <FirebaseArduino.h>

// Firebase Config
#define FIREBASE_HOST "https://smart-transport-system-125.firebaseio.com"
#define FIREBASE_AUTH "HGrWxEBePjzHpm4Ys0x1kZxfBJmBUfajfmIJ2qWs"

// Wifi Config
#define WIFI_SSID "Samsung"
#define WIFI_PASSWORD "balti115"

// RFID Pin Config
#define SDA_PIN 10
#define RST_PIN 9

// GPS Config
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
String rfidCard;

// Piezo Buzzer Pin
int buzzerPin = 7;

unsigned long int gpsInterval = 3000;
unsigned long int rfidSuccessInterval = 100;
unsigned long int rfidFailInterval = 2000;

unsigned long int gpsPreviousTime = 0;
unsigned long int rfidSuccessPreviousTime = 0;
unsigned long int rfidFailPreviousTime = 0;

unsigned long int currentTime = 0;

int n = 0;

// The TinyGPS++ object
TinyGPSPlus gps;

MFRC522 rfid(SDA_PIN, RST_PIN);

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

// Define FirebaseESP8266 data object
FirebaseData firebaseData;
FirebaseJson json;

void initilize()
{
  Serial.begin(9600);
  SPI.begin(); // Initialize SPI bus
  ss.begin(GPSBaud);
  
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");

  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(300);
  }
  Serial.println();
  Serial.print("Connected with IP: ");
  Serial.println(WiFi.localIP());
  Serial.println();

  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
  Firebase.reconnectWiFi(true);

  firebaseData.setBSSLBufferSize(1024, 1024);
  firebaseData.setResponseSize(1024);
  Firebase.setReadTimeout(firebaseData, 1000 * 60);
  Firebase.setwriteSizeLimit(firebaseData, "tiny");
  Firebase.setFloatDigits(6);
  Firebase.setDoubleDigits(6);
  
  rfid.PCD_Init(); // Initialize the RFID reader
}

void setup()
{
  initilize();
  Serial.println("Starting the RFID Reader...");

  pinMode(buzzerPin, OUTPUT);

  Serial.println(F("DeviceExample.ino"));
  Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  Serial.print(F("Testing TinyGPS++ library v. "));
  Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();
}

void loop()
{
  currentTime = millis();
  getGPSLocation();
  readCard();
}

void readCard()
{
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial())
    return;

  rfidCard = "";
  for (byte i = 0; i < rfid.uid.size; i++) {
    rfidCard += String(rfid.uid.uidByte[i] < 0x10 ? "0" : "");
    rfidCard += String(rfid.uid.uidByte[i], HEX);
    rfidCard += " ";
  }
  rfidCard.toUpperCase().trim();
  Serial.println(rfidCard);

  if (rfidCard == "249 65 15 127") // Example card ID
  {
    buzzPatternSuccess();
  }
  else
  {
    buzzPatternFail();
  }

  rfid.PICC_HaltA();
}

void buzzPatternSuccess()
{
  for (int i = 0; i < 3; i++) {
    digitalWrite(buzzerPin, HIGH);
    delay(rfidSuccessInterval);
    digitalWrite(buzzerPin, LOW);
    delay(rfidSuccessInterval);
  }
}

void buzzPatternFail()
{
  digitalWrite(buzzerPin, HIGH);
  delay(rfidFailInterval);
  digitalWrite(buzzerPin, LOW);
}

void getGPSLocation()
{
  while (ss.available() > 0)
    if (gps.encode(ss.read()))
    {
      if (currentTime - gpsPreviousTime >= gpsInterval)
      {
        displayInfo();
        gpsPreviousTime = currentTime;
      }
    }

  if (currentTime > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while (true);
  }
}

void displayInfo()
{
  Serial.print(F("Location: "));
  
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
  }
  else
  {
    Serial.print(gps.satellites.value());
  }

  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.println();
}

void sendGPSDataToFirebase()
{
  String path = "/GPS";

  if (gps.location.isValid())
  {
    json.add("lat",