115 lines
3.3 KiB
C++
115 lines
3.3 KiB
C++
#include <TinyGPS++.h>
|
|
#include <HardwareSerial.h>
|
|
|
|
// Definisikan Serial untuk LoRa dan GPS
|
|
HardwareSerial SerialAT(2); // Menggunakan UART2 untuk LoRa
|
|
HardwareSerial GPSSerial(1); // Menggunakan UART1 untuk GPS
|
|
|
|
TinyGPSPlus gps;
|
|
|
|
const int buttonPin = 18; // Pin untuk pushbutton
|
|
bool buttonState = false; // Variabel untuk menyimpan status pushbutton
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
|
|
// Inisialisasi Serial untuk LoRa
|
|
SerialAT.begin(9600, SERIAL_8N1, 4, 5);
|
|
|
|
// Inisialisasi Serial untuk GPS
|
|
GPSSerial.begin(9600, SERIAL_8N1, 16, 17);
|
|
|
|
// Inisialisasi pin pushbutton sebagai input
|
|
pinMode(buttonPin, INPUT_PULLUP);
|
|
|
|
Serial.println("GPS dan LoRa Mulai");
|
|
}
|
|
|
|
void loop() {
|
|
// Membaca data dari modul GPS
|
|
while (GPSSerial.available()) {
|
|
gps.encode(GPSSerial.read());
|
|
}
|
|
|
|
// Membaca status pushbutton
|
|
buttonState = digitalRead(buttonPin);
|
|
|
|
// Jika pushbutton ditekan dan lokasi GPS valid, tampilkan dan kirim melalui LoRa
|
|
if (buttonState == LOW) { // LOW berarti tombol ditekan jika menggunakan INPUT_PULLUP
|
|
if (gps.location.isValid()) {
|
|
// Menampilkan lokasi GPS
|
|
Serial.print(F("Location: "));
|
|
Serial.print(gps.location.lat(), 6);
|
|
Serial.print(F(","));
|
|
Serial.println(gps.location.lng(), 6);
|
|
|
|
// Mengirim lokasi GPS melalui LoRa dengan tanda pushbutton ditekan
|
|
int snr = getSNR();
|
|
int rssi = getRSSI();
|
|
unsigned long delayValue = calculateDelay();
|
|
|
|
SerialAT.print(gps.location.lat(), 6);
|
|
SerialAT.print(",");
|
|
SerialAT.print(gps.location.lng(), 6);
|
|
SerialAT.print(",");
|
|
SerialAT.print("PUSH,");
|
|
SerialAT.print(snr);
|
|
SerialAT.print(",");
|
|
SerialAT.print(rssi);
|
|
SerialAT.print(",");
|
|
SerialAT.println(delayValue);
|
|
|
|
// Menampilkan nilai SNR, RSSI, dan Delay
|
|
Serial.print(F("SNR: "));
|
|
Serial.println(snr);
|
|
Serial.print(F("RSSI: "));
|
|
Serial.println(rssi);
|
|
Serial.print(F("Delay: "));
|
|
Serial.println(delayValue);
|
|
|
|
} else {
|
|
Serial.println(F("INVALID"));
|
|
}
|
|
}
|
|
|
|
delay(500);
|
|
}
|
|
|
|
int getSNR() {
|
|
// Nilai SNR dihitung berdasarkan kekuatan sinyal GPS
|
|
// Asumsi: Semakin kuat sinyal GPS, semakin baik SNR-nya
|
|
// Ini hanya contoh sederhana, Anda mungkin memerlukan algoritma yang lebih kompleks
|
|
if (gps.hdop.isValid()) {
|
|
return (int)(100.0 / gps.hdop.hdop()); // Contoh konversi HDOP ke SNR
|
|
} else {
|
|
return -1; // Nilai SNR tidak valid
|
|
}
|
|
}
|
|
|
|
int getRSSI() {
|
|
// Nilai RSSI diambil dari kualitas sinyal GPS
|
|
// Asumsi: Semakin rendah HDOP, semakin baik RSSI-nya
|
|
// Ini hanya contoh sederhana, Anda mungkin memerlukan algoritma yang lebih kompleks
|
|
if (gps.hdop.isValid()) {
|
|
return (int)(-50.0 * gps.hdop.hdop()); // Contoh konversi HDOP ke RSSI
|
|
} else {
|
|
return -100; // Nilai RSSI tidak valid
|
|
}
|
|
}
|
|
|
|
unsigned long calculateDelay() {
|
|
// Hitung delay berdasarkan waktu antara saat pushbutton ditekan dan saat GPS memberikan data yang valid
|
|
static unsigned long lastPressTime = 0;
|
|
unsigned long currentTime = millis();
|
|
|
|
if (buttonState == LOW) {
|
|
if (lastPressTime == 0) {
|
|
lastPressTime = currentTime;
|
|
}
|
|
return currentTime - lastPressTime;
|
|
} else {
|
|
lastPressTime = 0;
|
|
return 0;
|
|
}
|
|
}
|