TKK_E32210691/Kode Program ESP32/kirimled3.ino

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;
}
}