TKK_E32230540/kode program alat/kode1di_pisah.ino.ino

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