#include <Arduino.h>
#include <TinyGPS++.h>
#include <SPI.h>
#include <MFRC522.h>
#include <WiFi.h>
#include <AdafruitIO_WiFi.h>
// ==== GPS ====
#define GPS_BAUDRATE 9600
TinyGPSPlus gps;
#define GPS_RX 16
#define GPS_TX 17
// ==== RFID ====
#define SS_PIN 21
#define RST_PIN 22
MFRC522 rfid(SS_PIN, RST_PIN);
byte registeredCard[4] = {0xDE, 0xAD, 0xBE, 0xEF}; // ganti UID kartu Anda
// ==== Perangkat keras ====
#define BUZZER_PIN 14
#define GREEN_LED 26
#define RED_LED 25
#define RELAY_PIN 27
// ==== Adafruit IO ====
#define IO_USERNAME "Grayzeus"
#define IO_KEY "aio_Yqzs55eEvHwhQAoFwAmi5i3CHY6t"
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASS = "";
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
// Buat feed
AdafruitIO_Feed *latitude = io.feed("latitude");
AdafruitIO_Feed *longitude = io.feed("longitude");
AdafruitIO_Feed *speedFeed = io.feed("speed");
AdafruitIO_Feed *status = io.feed("status");
// Mode tracking: 0 = mati, 1 = realtime
int trackingMode = 0;
void setup() {
Serial.begin(115200);
Serial2.begin(GPS_BAUDRATE, SERIAL_8N1, GPS_RX, GPS_TX);
// RFID
SPI.begin();
rfid.PCD_Init();
// Pin I/O
pinMode(BUZZER_PIN, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(RELAY_PIN, LOW);
// Koneksi ke Adafruit IO
Serial.print("Connecting to Adafruit IO");
io.connect();
while(io.status() < AIO_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\nAdafruit IO connected!");
Serial.println("Sistem siap. Tempelkan kartu RFID...");
}
void loop() {
io.run(); // wajib untuk menjaga koneksi Adafruit IO
checkRFID();
if (trackingMode == 1) {
if (Serial2.available() > 0) {
if (gps.encode(Serial2.read())) {
if (gps.location.isValid()) {
double lat = gps.location.lat();
double lng = gps.location.lng();
double spd = gps.speed.kmph();
// Kirim data ke Adafruit IO
latitude->save(lat);
longitude->save(lng);
speedFeed->save(spd);
Serial.print("Lat: "); Serial.println(lat, 6);
Serial.print("Lng: "); Serial.println(lng, 6);
Serial.print("Speed: "); Serial.println(spd);
}
}
}
}
}
void checkRFID() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
if (rfid.uid.size == 4) {
bool valid = true;
for (byte i = 0; i < 4; i++) {
if (rfid.uid.uidByte[i] != registeredCard[i]) {
valid = false;
break;
}
}
if (valid) {
if (trackingMode == 0) {
accessGranted();
trackingMode = 1;
status->save(1);
} else {
Serial.println("Tracking dimatikan");
trackingMode = 0;
digitalWrite(RELAY_PIN, LOW);
digitalWrite(GREEN_LED, LOW);
status->save(0);
}
} else {
accessDenied();
}
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
void accessGranted() {
Serial.println("RFID Valid. Tracking GPS aktif!");
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RELAY_PIN, HIGH);
delay(500);
digitalWrite(BUZZER_PIN, LOW);
}
void accessDenied() {
Serial.println("RFID tidak valid!");
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(RED_LED, HIGH);
delay(1000);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RED_LED, LOW);
}