Arduino UNO Based GPS and RFID Tracking System with Wi-Fi Connectivity
View and Edit Project In Cirkit Designer
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
- Description: A microcontroller board based on the ATmega328P.
- Purpose: Acts as the central processing unit of the circuit, controlling the GPS module, RFID reader, and Piezo Speaker. It also handles Wi-Fi connectivity and communication with Firebase.
GPS NEO 6M
- Description: A GPS module that provides location data.
- Purpose: Supplies the circuit with real-time location coordinates.
RFID-RC522
- Description: An RFID reader/writer module.
- Purpose: Reads RFID tags and provides authentication for the system.
Piezo Speaker
- Description: An electronic device that can produce sound when an electrical signal is applied.
- Purpose: Generates audio feedback based on RFID reading results.
Wiring Details
Arduino UNO
- 3.3V connected to RFID-RC522 (3.3V) and GPS NEO 6M (VCC)
- 5V (Not connected to any component in this circuit)
- GND connected to GPS NEO 6M (GND), Piezo Speaker (pin1), and RFID-RC522 (GND)
- D2 (Not used in this circuit)
- D3 connected to GPS NEO 6M (TX)
- D4 connected to GPS NEO 6M (RX)
- D7 connected to Piezo Speaker (pin2)
- D10 connected to RFID-RC522 (SDA)
- D11 connected to RFID-RC522 (MOSI)
- D12 connected to RFID-RC522 (MISO)
- D13 connected to RFID-RC522 (SCK)
GPS NEO 6M
- VCC connected to Arduino UNO (3.3V)
- RX connected to Arduino UNO (D4)
- TX connected to Arduino UNO (D3)
- GND connected to Arduino UNO (GND)
RFID-RC522
- 3.3V connected to Arduino UNO (3.3V)
- RST (Not connected to any component in this circuit)
- GND connected to Arduino UNO (GND)
- MISO connected to Arduino UNO (D12)
- MOSI connected to Arduino UNO (D11)
- SCK connected to Arduino UNO (D13)
- SDA connected to Arduino UNO (D10)
Piezo Speaker
- pin1 connected to Arduino UNO (GND)
- pin2 connected to Arduino UNO (D7)
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",