ESP32 DENGAN FUNGSI CLIEN DAN AKSES POINT DAN FUNGSI PING SETING LEWAT WEB DAN BISA DI SAVE PING STATUS DI WEB LCD OLED + SIM800L +SMS + PANGGILAN

 #include <WiFi.h>

#include <WebServer.h>

#include <ESP32Ping.h>

#include <Preferences.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#include <HardwareSerial.h>


// OLED

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64

#define OLED_RESET    -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


// SIM800L

HardwareSerial sim800(1); // Gunakan UART1

#define SIM800_TX 17 // Sesuaikan dengan pin ESP32 Anda

#define SIM800_RX 16


Preferences prefs;

WebServer server(80);


// WiFi dan IP

String ssid_sta, pass_sta, ssid_ap, pass_ap;

IPAddress targetIP;

bool pingStatus = false; // false = DOWN, true = UP


// Load dari flash

void loadConfig() {

  prefs.begin("config", true);

  ssid_sta = prefs.getString("ssid_sta", "Pareting");

  pass_sta = prefs.getString("pass_sta", "istimewa2");

  ssid_ap = prefs.getString("ssid_ap", "esp32");

  pass_ap = prefs.getString("pass_ap", "rejeki88");

  String ipString = prefs.getString("target_ip", "192.168.88.1");

  targetIP.fromString(ipString);

  prefs.end();

}


// Simpan ke flash

void saveConfig() {

  prefs.begin("config", false);

  prefs.putString("ssid_sta", ssid_sta);

  prefs.putString("pass_sta", pass_sta);

  prefs.putString("ssid_ap", ssid_ap);

  prefs.putString("pass_ap", pass_ap);

  prefs.putString("target_ip", targetIP.toString());

  prefs.end();

}


// OLED Display

void updateDisplay() {

  display.clearDisplay();

  display.setTextSize(1);

  display.setTextColor(SSD1306_WHITE);


  display.setCursor(0, 0);

  display.print("SSID: ");

  display.println(ssid_sta);


  display.print("Status: ");

  if (WiFi.status() == WL_CONNECTED) {

    display.println("Connected");

  } else {

    display.println("Not Connected");

  }


  display.print("IP: ");

  display.println(WiFi.localIP());


  display.print("Ping: ");

  if (!pingStatus) {

    display.fillRect(0, display.getCursorY(), SCREEN_WIDTH, 8, SSD1306_WHITE);

    display.setTextColor(SSD1306_BLACK);

    display.println("DOWN");

    display.setTextColor(SSD1306_WHITE);

  } else {

    display.println("UP");

  }


  display.display();

}


// Web root

void handleRoot() {

  String html = "<!DOCTYPE html><html><head>";

  html += "<meta http-equiv='refresh' content='5'>";

  html += "<title>Konfigurasi ESP32</title></head><body>";

  html += "<h1>Konfigurasi WiFi & Ping</h1>";


  String status = pingStatus ? "UP" : "DOWN";

  String color = pingStatus ? "green" : "red";

  html += "<p>Status Ping: <b style='color:" + color + "'>" + status + "</b></p>";


  html += "<form action='/set' method='POST'>";

  html += "SSID Client: <input name='ssid_sta' value='" + ssid_sta + "'><br>";

  html += "Password Client: <input type='password' name='pass_sta' value='" + pass_sta + "'><br><br>";

  html += "SSID AP: <input name='ssid_ap' value='" + ssid_ap + "'><br>";

  html += "Password AP: <input type='password' name='pass_ap' value='" + pass_ap + "'><br><br>";

  html += "IP Target: <input name='target_ip' value='" + targetIP.toString() + "'><br><br>";

  html += "<input type='submit' value='Simpan & Restart'>";

  html += "</form>";


  html += "</body></html>";

  server.send(200, "text/html", html);

}


// Form submit

void handleSet() {

  if (server.hasArg("ssid_sta")) ssid_sta = server.arg("ssid_sta");

  if (server.hasArg("pass_sta")) pass_sta = server.arg("pass_sta");

  if (server.hasArg("ssid_ap")) ssid_ap = server.arg("ssid_ap");

  if (server.hasArg("pass_ap")) pass_ap = server.arg("pass_ap");

  if (server.hasArg("target_ip")) targetIP.fromString(server.arg("target_ip"));


  saveConfig();

  server.send(200, "text/html", "<h2>Setting disimpan, restart...</h2><script>setTimeout(()=>location.href='/',3000);</script>");

  delay(3000);

  ESP.restart();

}


// Setup WiFi Client

void setupWiFiClient() {

  WiFi.begin(ssid_sta.c_str(), pass_sta.c_str());

  Serial.print("Menyambung ke WiFi: ");

  Serial.println(ssid_sta);


  int retry = 0;

  while (WiFi.status() != WL_CONNECTED && retry < 20) {

    delay(500);

    Serial.print(".");

    retry++;

  }


  if (WiFi.status() == WL_CONNECTED) {

    Serial.println("\nTersambung ke WiFi Client");

    Serial.println(WiFi.localIP());

  } else {

    Serial.println("\nGagal konek WiFi");

  }

}


// Setup Access Point dan Web Server

void setupAccessPoint() {

  WiFi.softAP(ssid_ap.c_str(), pass_ap.c_str());

  Serial.print("AP aktif. IP: ");

  Serial.println(WiFi.softAPIP());


  server.on("/", handleRoot);

  server.on("/set", HTTP_POST, handleSet);

  server.begin();

  Serial.println("Web Server aktif");

}


// Fungsi Kirim SMS

void kirimSMS(const String& pesan) {

  sim800.println("AT+CMGF=1");

  delay(1000);

  sim800.println("AT+CMGS=\"08112508805\"");

  delay(1000);

  sim800.print(pesan);

  delay(1000);

  sim800.write(26); // CTRL+Z

  delay(5000);

}


// Fungsi Panggilan

void lakukanPanggilan() {

  sim800.println("ATD08112508805;");

  delay(20000); // 20 detik

  sim800.println("ATH"); // Hang up

  delay(1000);

}


void setup() {

  Serial.begin(115200);


  // OLED

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {

    Serial.println(F("OLED tidak ditemukan"));

    while (true);

  }

  display.clearDisplay();

  display.setTextSize(1);

  display.setTextColor(SSD1306_WHITE);

  display.setCursor(0, 0);

  display.println("Inisialisasi...");

  display.display();


  // SIM800L

  sim800.begin(9600, SERIAL_8N1, SIM800_RX, SIM800_TX);

  delay(3000);

  sim800.println("AT"); // Test command

  delay(1000);


  loadConfig();

  setupWiFiClient();

  setupAccessPoint();

  updateDisplay();

}


void loop() {

  server.handleClient();


  static unsigned long lastPing = 0;

  if (millis() - lastPing > 10000) {

    lastPing = millis();

    Serial.print("Ping ke ");

    Serial.print(targetIP);

    Serial.print("... ");


    if (Ping.ping(targetIP)) {

      Serial.println("OK!");

      pingStatus = true;

    } else {

      Serial.println("GAGAL!");

      if (pingStatus == true) {

        kirimSMS("Koneksi putus");

        lakukanPanggilan();

      }

      pingStatus = false;

    }

    updateDisplay();

  }

}


Comments