154 lines
4.8 KiB
C++
154 lines
4.8 KiB
C++
#include <TinyGPS++.h>
|
|
#include <HardwareSerial.h>
|
|
#include <WiFi.h>
|
|
#include <FirebaseESP32.h>
|
|
#include <NTPClient.h>
|
|
#include <WiFiUdp.h>
|
|
|
|
// 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);
|
|
}
|