#include #include #include #include #include // ---- PROTOTYPE FUNGSI (Agar Compiler Mengenal Fungsi di Tab Lain) ---- void initVL53L0X(); void bacaSensorJarak(); void updateGPS(); void setupWiFi(); void kirimKeServerWiFi(); // ---- KONFIGURASI WIFI ---- const char* ssid = "orangsopan"; const char* password = "12345678"; // ---- KONFIGURASI PIN ---- #define RXD1 14 #define TXD1 12 // ---- OBJEK & SERIAL ---- HardwareSerial gpsSerial(1); Adafruit_VL53L0X lox = Adafruit_VL53L0X(); TinyGPSPlus gps; // ---- STRUKTUR LOGIKA PREDIKSI ---- class LinkedList { public: LinkedList(int max_size){ max_length = max_size; data = new float[max_size]; } size_t size(){ return length; } void update(float new_data){ data[last_p] = new_data; last_p = (last_p + 1) % max_length; if(length < max_length) { length++; } else { first_p = (first_p + 1) % max_length; } } float getIndex(int index){ return data[(index + first_p) % max_length]; } private: float* data; size_t length = 0; size_t max_length; int first_p = 0; int last_p = 0; }; class LinearRegression { public: LinearRegression(int max_size){ data = new LinkedList(max_size); } void update(float new_data){ data->update(new_data); } float predict(int n_next = 1){ int n = data->size(); if(n < 2) return (n == 1) ? data->getIndex(0) : 0; float sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0; for(int i=0; igetIndex(i); sumXY += i * data->getIndex(i); sumX2 += i * i; } float denominator = (n * sumX2 - sumX * sumX); if (denominator == 0) return data->getIndex(n - 1); float m = (n * sumXY - sumX * sumY) / denominator; float c = (sumY - m * sumX) / n; return (m * n_next) + c; } private: LinkedList* data; }; LinearRegression LR(5); // Inisialisasi Objek Prediksi // ---- KONFIGURASI SERVER & ALAT ---- const String IP_VPS = "202.155.19.245"; const int TINGGI_TOTAL_ALAT = 95; // ---- VARIABEL GLOBAL ---- float lat = 0, lon = 0; int ketinggian_air = 0; float hasil_prediksi = 0; unsigned long lastTime = 0; const long timerDelay = 60000; // Tiap 1 Menit void setup() { Serial.begin(115200); gpsSerial.begin(9600, SERIAL_8N1, RXD1, TXD1); Wire.begin(21, 22); initVL53L0X(); setupWiFi(); // Koneksi ke WiFi orangsopan Serial.println("Sistem Siap (Mode Murni WiFi)..."); } void loop() { updateGPS(); if ((millis() - lastTime) > timerDelay) { bacaSensorJarak(); LR.update((float)ketinggian_air); hasil_prediksi = LR.predict(9); if (hasil_prediksi < 0) hasil_prediksi = 0; // Pengiriman data murni lewat internet WiFi kirimKeServerWiFi(); lastTime = millis(); } }