Tracking Device Berbasis GPS Dan LoRa Untuk Helmet Yang Dimodernisasi
by DarwinPDGz in Circuits > Arduino
714 Views, 8 Favorites, 0 Comments
Tracking Device Berbasis GPS Dan LoRa Untuk Helmet Yang Dimodernisasi
GPS Tracker, terdiri dari modul transmitter, receiver, dan aplikasi. Dimana transmisi data dilakukan melalui LoRa dan Firebase.
Supplies
Berikut suplai dan alasan pakainya:
- ESP 32 DOIT DEVKIT [untuk modul WiFi]
- ARDUINO NANO [Power efisien]
- LoRa SX1276 (915 MHz) [guna mengirim pesan secara wireless, jarak lebih jauh]
- GPS Ublox Neo-6M [built in antenna dan built in memory saver]
- Baterai 18650 [rechargeable]
Tujuan
Tujuan alat ini adalah sebagai upaya agar membantu para supervisor untuk memonitor kualitas dan performa dari para pekerja yang akan menggunakan alat ini, terutamanya dalam sisi aktivitas pekerja.
Desain Sistem
Sistem secara keseluruhan terdiri dari 2 subsistem yaitu transmitter dan receiver. Transmitter ini dihubungkan dengan LoRa yang mana akan mengirimkan data yang diperoleh dari sinyal GPS lalu akan dikirimkan ke receiver. Lalu dari receiver ini, lora yang menjadi penerimanya akan melakukan parse packet dan membaca latitude dan longitude dari transmitter. Data yang masuk ke receiver ini akan dikirimkan menggunakan firebase dan akan ditampilkan di aplikasi flutter
Desain PCB
Desain PCB untuk sistem.
Block Diagram & Flowchart
Block Diagram Sistem beserta Flowchart Sistem
Aplikasi
Aplikasi Flutter untuk mengakses data sebagai Graphical User Interface (GUI)
Struktur Data Firebase
cara data terstruktur pada RTDB firebase
Kode
[Transmitter]
#include <Arduino.h>
#include <SPI.h>
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <LoRa.h>
SoftwareSerial gpsSerial(3, 2); // RX, TX for GPS
TinyGPSPlus gps;
#define BAND 915E6 // Frequency for your LoRa module (adjust according to your region)
void setup() {
Serial.begin(9600);
gpsSerial.begin(9600);
while (!LoRa.begin(BAND)) {
Serial.println("LoRa initialization failed. Retrying...");
delay(1000);
}
Serial.println("LoRa initialization complete");
}
void sendGPSToLoRa() {
unsigned long startTime = millis();
// Wait for valid GPS data for up to 5 seconds
while (millis() - startTime < 5000) {
while (gpsSerial.available() > 0) {
if (gps.encode(gpsSerial.read())) {
if (gps.location.isValid()) {
// GPS data is valid, split the data into latitude and longitude
String latitude = String(gps.location.lat(), 6);
String longitude = String(gps.location.lng(), 6);
// Create a message to send over LoRa, i want to send latitude first, then in the different line is longitude
String message = latitude;
String pesan = longitude;
Serial.print("Sending message: ");
Serial.println(message);
Serial.println(pesan);
LoRa.beginPacket();
LoRa.print(message);
LoRa.print(pesan);
LoRa.endPacket();
Serial.println("Message sent successfully.");
return; // Exit the loop when valid data is sent
}
}
}
}
// If no valid GPS data is received within 5 seconds, print an error message
Serial.println("Error: GPS module not detected or not functioning");
delay(1000); // Add a delay before retrying
}
void loop() {
sendGPSToLoRa();
delay(5000); // Send the message every 15 seconds
}
Dari code ini digunakan library yaitu softwareserial, tinygps dan lora. Library software serial ini digunakan untuk interaksi dengan lora, yang mana memerlukan MOSI dan MISO agar dapat berkomunikasi dengan LoRa SX1276. Lalu library TinyGPS++ yang bertujuan agak dapat berkomunikasi dengan modul GPS. Dari code ini, kami menggunakan serial dan gps begin di baud rate 9600. GPS dihubungkan dengan RX dan TX dari arduino nano ini dan untuk LoRa dihubungkan dengan default pin dari nano ini. Nano akan melakukan pendeteksian LoRa, yang mana jika tidak terdeteksi akan menulis di serial monitornya yaitu "Lora initialization failed. Retrying..." dan akan didelay 1 detik, kemudian jika berhasil terhubung, maka di serial monitor akan tertulis LoRa intialization complete. kemudian, dari modul GPS akan melakukan pemanggilan data latitude dan longitude, dan akan ditampilkan di serial monitor jika berhasil, namun jika sinyal GPS tidak ditemukan atau modul gps yang bermasalah, maka akan ditampilkan "Error: GPS module not detected or not functioning". Jika berhasil didapatkan data, maka data GPS akan dikirim ke LoRa untuk dapat dikirimkan ke receiver. Jika message berhasil dikirim, maka tertulis "message sent successfully".
[Receiver]
#include <WiFi.h>
#include <FirebaseESP32.h>
#include <Wire.h>
#include <LoRa.h>
#define FIREBASE_HOST "https://sentracerproj-default-rtdb.asia-southeast1.firebasedatabase.app/"
#define FIREBASE_AUTH "zo9Jd1matTxrorFzQrrHp9J1YuH9P4uZ71lIXn9a"
FirebaseData firebaseData;
struct WifiCredentials {
const char* ssid;
const char* password;
};
WifiCredentials wifiCredentials[] = {
{"S22 Ultra", "Daniel12"},
{"B29 2.4GHz", "68205713"}
};
void connectToWiFi(int index) {
WiFi.begin(wifiCredentials[index].ssid, wifiCredentials[index].password);
Serial.print("Connecting to Wi-Fi");
unsigned long startTime = millis();
while (WiFi.status() != WL_CONNECTED && millis() - startTime < 5000) {
delay(500);
Serial.print(".");
}
Serial.println();
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Connected to Wi-Fi");
} else {
Serial.println("Switching to the next Wi-Fi...");
delay(2000);
int nextIndex = (index + 1) % (sizeof(wifiCredentials) / sizeof(wifiCredentials[0]));
connectToWiFi(nextIndex);
}
}
void setup() {
Serial.begin(115200);
connectToWiFi(0);
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
LoRa.setPins(5, 14, 2);
while (!LoRa.begin(915E6)) {
Serial.println(".");
delay(500);
}
if (LoRa.begin(915E6)) {
LoRa.setSyncWord(0xA5);
Serial.println("LoRa Initializing OK!");
} else {
Serial.println("LoRa Initializing failed!");
}
FirebaseJson emptyJson;
Firebase.updateNode(firebaseData, "/location", emptyJson);
String dataPath = "/location/" + String(millis());
Firebase.setBool(firebaseData, dataPath.c_str(), true);
if (firebaseData.dataPath() == dataPath) {
Serial.println("Data sent");
} else {
Serial.println("Failed");
Serial.println(firebaseData.errorReason());
}
}
void sendToFirebase(String latitude, String longitude) {
FirebaseJson json;
json.add("latitude", latitude);
json.add("longitude", longitude);
String dataPath = "/location" + String(millis());
Firebase.updateNode(firebaseData, dataPath.c_str(), json);
//make me able to tell if the data is sent or not
if (firebaseData.dataPath() == dataPath) {
Serial.println("Data sent");
} else {
Serial.println("Failed");
Serial.println(firebaseData.errorReason());
}
}
void processGPSData(String gpsData) {
// Process GPS data and send it to Firebase
int comma1 = gpsData.indexOf(',');
int comma2 = gpsData.indexOf(',', comma1 + 1);
String latitude = gpsData.substring(0, comma1);
String longitude = gpsData.substring(comma1 + 1, comma2);
Serial.println("Latitude: " + latitude);
Serial.println("Longitude: " + longitude);
// Send data to Firebase
sendToFirebase(latitude, longitude);
}
void loop() {
int packetSize = LoRa.parsePacket();
if (packetSize) {
Serial.print("Received packet: '");
while (LoRa.available()) {
String LoRaData = LoRa.readString();
// Process the GPS data
processGPSData(LoRaData);
}
Serial.println("'");
Serial.println("LoRa packet received");
}
}
Untuk receiver ini kami menggunakan library FirebaseESP32 dan LoRa. perlu untuk melakukan define host dan auth di awal agar dapat mengirimkan data ke firebase. Karena kami menggunakan modul ESP32 yang ada built in Wi-Fi, kami dapat menggunakan Wi-Fi, sehingga kami tidak memerlukan modul Wi-Fi tambahan. Kami menambahkan 2 Wi-Fi credential, yang mana jika credential Wi-Fi tidak ditemukan, maka dapat berpindah ke Wi-Fi yang lain. Lalu kami menggunakan baud rate 115200 dan mengdefine pin LoRa ke 5, 14, 2 yang mana kemudian akan mencari LoRa dan akan menampilkan "LoRa intializing ok" jika modul Lora ditemukan, dan jika tidak ditemukan maka akan menampilkan "LoRa intializing failed". Kemudian, dibagian firebase kami menambahkan path /loaction yang mana akan membuat path location di firebase, yang mana flutternya akan dapat menampilkan hasil yang diterima dari transmitter. Kemudian, untuk mendapatkan data perlu untuk melakukan string data dan parse packet. Jadi akan menampilkan hasil latitude dan longitude yang didapat dari transmitter, dan akan menampilkan LoRa packet received jika data telah diterima dari transmitter, data ini diforward ke firebase untuk ditampilkan di aplikasi.
Kode (Aplikasi)
Berikut kode untuk aplikasi flutter
Casing
1 lobang buat LoRa, dan 1 lobang buat usb, keduanya digabung menggunakan tight fit.
Demo Video
link youtube: https://youtu.be/S722K5eRjS0?si=8BT6OqzFDgtXhEiw
link mkv gdrive: https://drive.google.com/file/d/1KtUm6mOKxoIcXUW98UwwJTzwhFolG1Kw/view?usp=sharing
Evaluasi
Dari sistem yang kami buat ini, kami menyimpulkan bahwa alat ini dapat bekerja sebegaimana yang kami inginkan, namun juga terdapat permasalahan yang berkemungkinan untuk menghambat penggunaan sistem ini. Salah satunya yaitu permasalahan dengan antena yang mana untuk melakukan pengambilan data.
Anggota Kelompok
Darwin - 2502026532
Daniel Geraldo - 2501966742
Sagara Wahyu Dwipa - 2502035013
Referensi
https://how2electronics.com/lora-based-low-power-gps-tracker-with-arduino-esp8266/#Bill_of_Materials
https://www.electroschematics.com/neo-6m-gps-module/
https://how2electronics.com/esp32-lora-sx1278-76-transmitter-receiver/
https://docs.fleaflet.dev/