#include <WiFi.h>
#include <WebServer.h>
#include <Preferences.h>
// #include <SoftwareSerial.h> // Aktifkan jika sudah menghubungkan SIM800L
// --- Pengaturan Dasar ---
#define MAX_CODES 10 // Jumlah maksimal kode notifikasi
// Variabel Global
Preferences preferences;
WebServer server(80);
// Pengaturan WiFi Client (Default)
String client_ssid = "Dara@home";
String client_pass = "rejeki88";
// Pengaturan Access Point (Fallback)
const char* ap_ssid = "PUTU@TECKNO-SIM800L";
const char* ap_pass = "rejeki88";
// Array untuk menyimpan kode notifikasi yang diizinkan
String allowedCodes[MAX_CODES];
// Variabel untuk menyimpan status
String lastNotification = "Belum ada";
String ipAddress = "N/A";
/*
// --- PENGATURAN UNTUK SIM800L (CONTOH) ---
// Hubungkan pin TX SIM800L ke D2 (GPIO 2) dan RX ke D3 (GPIO 3)
// SoftwareSerial sim800l(2, 3); // RX, TX
// String targetPhoneNumber = "+6281234567890"; // Ganti dengan nomor target SMS
// Fungsi untuk mengirim SMS
void sendSMS(String message) {
Serial.println("Mengirim SMS: " + message);
// sim800l.println("AT+CMGF=1"); // Set mode teks
// delay(1000);
// sim800l.println("AT+CMGS=\"" + targetPhoneNumber + "\"");
// delay(1000);
// sim800l.print(message); // Isi pesan
// delay(100);
// sim800l.write(26); // Karakter CTRL+Z untuk mengirim
// delay(1000);
// Serial.println("SMS terkirim.");
}
*/
// --- Fungsi-fungsi Web Server ---
// Tampilkan halaman web utama
void handleRoot() {
String html = "<!DOCTYPE html><html><head><meta charset='UTF-8' name='viewport' content='width=device-width, initial-scale=1.0'>"
"<title>ESP32 Receiver Config</title>"
"<style>"
"body{font-family:Arial,sans-serif;background:#f2f2f2;margin:0;padding:15px;}"
".container{max-width:800px;margin:auto;background:white;padding:20px;border-radius:10px;box-shadow:0 2px 10px rgba(0,0,0,0.1);}"
"h1,h2{color:#333;}"
"form label{display:block;margin-top:10px;font-weight:bold;}"
"form input[type='text'],form input[type='password']{width:calc(100% - 20px);padding:8px;margin-top:5px;border:1px solid #ccc;border-radius:5px;}"
"form input[type='submit']{background-color:#007bff;color:white;border:none;padding:12px 20px;border-radius:5px;cursor:pointer;font-size:16px;margin-top:20px;}"
".status{background:#e9f5ff;border-left:5px solid #007bff;padding:10px;margin-top:20px;}"
".grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(250px, 1fr));grid-gap:10px;}"
"</style></head><body>"
"<div class='container'>"
"<h1>Konfigurasi Penerima Notifikasi</h1>"
"<div class='status'>"
"<h2>Status Saat Ini</h2>"
"<strong>Status WiFi:</strong> " + (WiFi.status() == WL_CONNECTED ? "Terhubung ke " + client_ssid : "Mode Access Point Aktif") + "<br>"
"<strong>Alamat IP:</strong> " + ipAddress + "<br>"
"<strong>Notifikasi Terakhir:</strong> " + lastNotification +
"</div>"
"<form action='/save' method='post'>"
"<h2>Pengaturan WiFi Client</h2>"
"<label for='ssid'>Nama WiFi (SSID):</label>"
"<input type='text' name='ssid' value='" + client_ssid + "'>"
"<label for='password'>Password WiFi:</label>"
"<input type='password' name='password' value='" + client_pass + "'>"
"<h2>Kode Notifikasi yang Diizinkan (10 Kode)</h2>"
"<div class='grid'>";
for (int i = 0; i < MAX_CODES; i++) {
html += "<div><label for='code" + String(i) + "'>Kode #" + String(i + 1) + "</label>"
"<input type='text' name='code" + String(i) + "' value='" + allowedCodes[i] + "'></div>";
}
html += "</div>"
"<input type='submit' value='Simpan Pengaturan & Restart'>"
"</form></div></body></html>";
server.send(200, "text/html", html);
}
// Simpan konfigurasi dari form
void handleSave() {
preferences.begin("config", false);
// Simpan kredensial WiFi
client_ssid = server.arg("ssid");
client_pass = server.arg("password");
preferences.putString("ssid", client_ssid);
preferences.putString("password", client_pass);
// Simpan 10 kode notifikasi
for (int i = 0; i < MAX_CODES; i++) {
allowedCodes[i] = server.arg("code" + String(i));
preferences.putString(("code" + String(i)).c_str(), allowedCodes[i]);
}
preferences.end();
String html = "<!DOCTYPE html><html><head><title>Saved</title><style>"
"body{font-family:Arial,sans-serif;text-align:center;padding-top:50px;}"
"h1{color:#4CAF50;}"
"</style></head><body>"
"<h1>Pengaturan Disimpan!</h1>"
"<p>Perangkat akan restart dalam 2 detik...</p>"
"</body></html>";
server.send(200, "text/html", html);
delay(2000);
ESP.restart();
}
// Tangani notifikasi yang masuk
void handleNotif() {
if (server.hasArg("src")) {
String receivedCode = server.arg("src");
Serial.println("Notifikasi diterima: " + receivedCode);
lastNotification = receivedCode; // Update status notifikasi terakhir
bool isValid = false;
for (int i = 0; i < MAX_CODES; i++) {
if (allowedCodes[i] != "" && receivedCode == allowedCodes[i]) {
isValid = true;
break;
}
}
if (isValid) {
Serial.println("Kode valid. Memicu aksi...");
server.send(200, "text/plain", "OK. Notification received.");
// --- TEMPATKAN AKSI ANDA DI SINI ---
// Contoh: Kirim SMS dengan SIM800L
// sendSMS(receivedCode);
// ------------------------------------
} else {
Serial.println("Kode tidak valid.");
server.send(401, "text/plain", "Unauthorized. Code not in allowed list.");
}
} else {
server.send(400, "text/plain", "Bad Request. 'src' parameter missing.");
}
}
// --- Fungsi Setup dan Loop ---
void loadSettings() {
preferences.begin("config", true); // Buka NVS dalam mode read-only
client_ssid = preferences.getString("ssid", "Dara@home");
client_pass = preferences.getString("password", "rejeki88");
for (int i = 0; i < MAX_CODES; i++) {
// Default kode notifikasi dari monitor tegangan Anda
String default_msg = "";
if (i == 0) default_msg = "UPS1 MATI";
if (i == 1) default_msg = "UPS2 MATI";
if (i == 2) default_msg = "PLN MATI";
if (i == 3) default_msg = "GENSET MATI";
allowedCodes[i] = preferences.getString(("code" + String(i)).c_str(), default_msg);
}
preferences.end();
}
void setupWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(client_ssid.c_str(), client_pass.c_str());
Serial.print("Menghubungkan ke " + client_ssid);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) { // Coba selama 10 detik
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nTerhubung!");
ipAddress = WiFi.localIP().toString();
Serial.println("Alamat IP: " + ipAddress);
} else {
Serial.println("\nKoneksi Gagal. Mengaktifkan Mode Access Point.");
WiFi.mode(WIFI_AP);
WiFi.softAP(ap_ssid, ap_pass);
ipAddress = WiFi.softAPIP().toString();
Serial.println("AP SSID: " + String(ap_ssid));
Serial.println("Alamat IP AP: " + ipAddress);
}
}
void setup() {
Serial.begin(115200);
Serial.println("\nMemulai ESP32 Penerima...");
// Inisialisasi SIM800L (aktifkan jika digunakan)
// sim800l.begin(9600);
loadSettings();
setupWiFi();
// Daftarkan handler untuk setiap halaman
server.on("/", HTTP_GET, handleRoot);
server.on("/save", HTTP_POST, handleSave);
server.on("/notif", HTTP_GET, handleNotif);
server.begin();
Serial.println("Web Server dimulai.");
}
void loop() {
server.handleClient(); // Wajib untuk melayani permintaan web
}
Search This Blog
Sunday, 22 June 2025
ESP 32 PENERIMA NOTIF DAN SMS KE NO TUJUAN
Subscribe to:
Post Comments (Atom)
Tandon Air Otomatis (ESP32 Master & Display) + Kode Lengkap
Panduan Lengkap Tandon Air Otomatis (ESP32 Master & Display) + Kode Lengkap Diperbarui: 09 August 2025 Artikel ini memandu Anda memban...
-
Cara cepat install windows xp, win 7 dan win 8 dengan hiren 15.2 Kali ini mekanikkomputerblog.blogspot.com akan membuat tutorial te...
-
Komponen yang Dibutuhkan : ESP32 Sensor NTC + resistor (untuk voltage divider) LCD 16x2 + I2C module Breadboard dan kabel jumper ...
No comments:
Post a Comment