#include #include #include #include #include #include // Informasi Wi-Fi const char* ssid = "atfalprm"; const char* password = "sakarepmuwes"; // Informasi Firebase #define FIREBASE_HOST "tomboldarurat-d4533-default-rtdb.firebaseio.com" #define FIREBASE_AUTH "your_firebase_auth_token" HardwareSerial SerialAT(2); TinyGPSPlus gps; const int ledPin = 12; const int buzzerPin = 13; FirebaseData firebaseData; FirebaseConfig firebaseConfig; FirebaseAuth firebaseAuth; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org", 25200, 60000); // UTC+7 const long utcOffsetInSeconds = 25200; // UTC+7 jam (7 * 3600 detik) const unsigned long alarmDuration = 30000; // 30 detik unsigned long alarmStartTime = 0; bool alarmActive = false; void setup() { Serial.begin(115200); SerialAT.begin(9600, SERIAL_8N1, 4, 5); pinMode(ledPin, OUTPUT); pinMode(buzzerPin, OUTPUT); WiFi.begin(ssid, password); Serial.print("Menghubungkan ke Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("Terhubung ke Wi-Fi"); firebaseConfig.host = FIREBASE_HOST; firebaseConfig.signer.tokens.legacy_token = FIREBASE_AUTH; Firebase.begin(&firebaseConfig, &firebaseAuth); // Mulai klien NTP timeClient.begin(); timeClient.setTimeOffset(utcOffsetInSeconds); // Setel offset waktu // Cek koneksi Firebase if (Firebase.ready()) { Serial.println("Terhubung ke Firebase"); } else { Serial.println("Gagal terhubung ke Firebase"); } } void loop() { if (SerialAT.available()) { String receivedData = SerialAT.readStringUntil('\n'); Serial.println("Diterima dari LoRa: " + receivedData); int firstCommaIndex = receivedData.indexOf(','); int secondCommaIndex = receivedData.indexOf(',', firstCommaIndex + 1); int thirdCommaIndex = receivedData.indexOf(',', secondCommaIndex + 1); int fourthCommaIndex = receivedData.indexOf(',', thirdCommaIndex + 1); int fifthCommaIndex = receivedData.indexOf(',', fourthCommaIndex + 1); if (firstCommaIndex != -1 && secondCommaIndex != -1 && thirdCommaIndex != -1 && fourthCommaIndex != -1 && fifthCommaIndex != -1) { String lat = receivedData.substring(0, firstCommaIndex); String lng = receivedData.substring(firstCommaIndex + 1, secondCommaIndex); String pushState = receivedData.substring(secondCommaIndex + 1, thirdCommaIndex); String snr = receivedData.substring(thirdCommaIndex + 1, fourthCommaIndex); String rssi = receivedData.substring(fourthCommaIndex + 1, fifthCommaIndex); String delayValue = receivedData.substring(fifthCommaIndex + 1); Serial.print("Latitude: "); Serial.print(lat); Serial.print(", Longitude: "); Serial.println(lng); Serial.print("Push State: "); Serial.println(pushState); Serial.print("SNR: "); Serial.println(snr); Serial.print("RSSI: "); Serial.println(rssi); Serial.print("Delay: "); Serial.println(delayValue); // Mulai alarm alarmStartTime = millis(); alarmActive = true; // Sinkronisasi waktu dengan server NTP timeClient.update(); // Mendapatkan waktu saat ini dari klien NTP time_t epochTime = timeClient.getEpochTime(); struct tm * timeinfo; timeinfo = localtime(&epochTime); char timeStr[20]; sprintf(timeStr, "%02d-%02d-%04d %02d:%02d:%02d", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year + 1900, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); // Membuat objek JSON untuk mengirim data FirebaseJson json; json.set("/latitude", lat); json.set("/longitude", lng); json.set("/time", timeStr); json.set("/pushState", pushState); json.set("/snr", snr); json.set("/rssi", rssi); json.set("/delay", delayValue); // Mengirim data ke Firebase di path /location dengan kunci unik if (Firebase.push(firebaseData, "/location", json)) { Serial.println("Data dikirim ke Firebase"); } else { Serial.print("Gagal mengirim data ke Firebase: "); Serial.println(firebaseData.errorReason()); } } else { Serial.println("Format data tidak benar"); } // Membersihkan buffer masuk while (SerialAT.available()) { SerialAT.read(); } } // Mengatur waktu alarm if (alarmActive) { if (millis() - alarmStartTime < alarmDuration) { digitalWrite(ledPin, HIGH); digitalWrite(buzzerPin, HIGH); } else { digitalWrite(ledPin, LOW); digitalWrite(buzzerPin, LOW); alarmActive = false; } } delay(500); }