#include #include // 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; } }