116 lines
2.8 KiB
C++
116 lines
2.8 KiB
C++
#include <Wire.h>
|
|
#include <Adafruit_VL53L0X.h>
|
|
#include <TinyGPS++.h>
|
|
#include <WiFi.h>
|
|
#include <HTTPClient.h>
|
|
|
|
// ---- 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; i<n; i++){
|
|
sumX += i;
|
|
sumY += data->getIndex(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();
|
|
}
|
|
} |