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

 Berikut adalah versi lengkap dan dimodifikasi dari kode sebelumnya, sekarang dengan dukungan untuk OLED 128x64 (SSD1306) menggunakan library Adafruit_SSD1306. Layar akan menampilkan:

  • SSID WiFi

  • Status koneksi WiFi

  • Alamat IP lokal

  • Status ping: UP / DOWN


Perangkat Keras yang Didukung

  • OLED 128x64 I2C (SSD1306)

  • ESP32 (Dev Board)


📦 Library yang Dibutuhkan

Pastikan library berikut sudah terpasang via Arduino Library Manager:

  • Adafruit GFX Library

  • Adafruit SSD1306


🔧 Koneksi I2C Default (ESP32)

  • SDA: GPIO 21

  • SCL: GPIO 22









#include <WiFi.h>

#include <WebServer.h>

#include <ESP32Ping.h>

#include <Preferences.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>


#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64

#define OLED_RESET    -1

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


Preferences prefs;

WebServer server(80);


// Konfigurasi 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();

}


// Tampilkan info di OLED

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: ");

  display.setTextColor(pingStatus ? SSD1306_WHITE : SSD1306_INVERSE);

  display.println(pingStatus ? "UP" : "DOWN");


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

}


// Handle 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();

}


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

  }

}


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

}


void setup() {

  Serial.begin(115200);


  // Inisialisasi 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();


  loadConfig();

  setupWiFiClient();

  setupAccessPoint();

  updateDisplay();

}


void loop() {

  server.handleClient();


  // Ping setiap 10 detik

  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!");

      pingStatus = false;

    }

    updateDisplay();

  }

}


Comments