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
Post a Comment