TKK_E32210691/Kode Program ESP32/uhuy5.ino

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