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