#include <Arduino.h>
#include <WiFi.h> // Thư viện WiFi cho ESP32
#include <WebServer.h> // Thư viện Web Server
#include <Preferences.h> // Lưu dữ liệu vào flash (không mất khi reset)
// ---------------- ĐỐI TƯỢNG ----------------
Preferences prefs; // Lưu SSID / PASS vào flash
WebServer server(80); // Web server chạy port 80 (HTTP)
// ---------------- BIẾN TOÀN CỤC ----------------
String ssid = "";
String pass = "";
// -------------------------------------------------
// HÀM HIỂN THỊ TRANG WEB NHẬP SSID & PASSWORD
// -------------------------------------------------
void handleRoot() {
// HTML đơn giản nhập SSID / Password
String page =
"<h1>Thiết lập WiFi cho ESP32</h1>"
"<form action=\"/save\">"
"SSID:<input name=\"ssid\"><br><br>"
"Password:<input name=\"pass\" type=\"password\"><br><br>"
"<button type=\"submit\">Lưu cấu hình</button>"
"</form>";
server.send(200, "text/html", page);
}
// -------------------------------------------------
// HÀM LƯU SSID / PASSWORD NGƯỜI DÙNG NHẬP
// -------------------------------------------------
void handleSave() {
// Lấy thông tin từ URL
ssid = server.arg("ssid");
pass = server.arg("pass");
// Lưu vào Preferences
prefs.putString("ssid", ssid);
prefs.putString("pass", pass);
server.send(200, "text/html",
"<h2>Lưu thành công!</h2><p>Vui lòng reset ESP32.</p>");
Serial.println("Đã lưu SSID: " + ssid);
Serial.println("Đã lưu PASS: " + pass);
delay(1500);
}
// -------------------------------------------------
// HÀM SETUP
// -------------------------------------------------
void setup() {
Serial.begin(115200);
prefs.begin("wifi_config", false); // Mở namespace wifi_config
// Đọc SSID / PASS từ flash
ssid = prefs.getString("ssid", "");
pass = prefs.getString("pass", "");
// -------------------------------------------------
// 1) CHƯA CÓ SSID TRONG FLASH → BẬT ACCESS POINT
// -------------------------------------------------
if (ssid == "") {
Serial.println("Chưa có cấu hình WiFi → bật chế độ AP.");
// Bật access point
WiFi.softAP("ESP32-Setup", "12345678"); // AP name + password
Serial.println("AP được tạo: ESP32-Setup");
Serial.print("IP AP: ");
Serial.println(WiFi.softAPIP());
// Tạo web server
server.on("/", handleRoot); // Trang nhập SSID
server.on("/save", handleSave); // Lưu cấu hình
server.begin();
Serial.println("Web server đã khởi động...");
}
// -------------------------------------------------
// 2) ĐÃ CÓ SSID → KẾT NỐI VÀO WIFI THẬT
// -------------------------------------------------
else {
Serial.println("Đã có SSID lưu → kết nối WiFi...");
Serial.println("SSID: " + ssid);
Serial.println("PASS: " + pass);
WiFi.begin(ssid.c_str(), pass.c_str());
// Chờ kết nối
int retry = 0;
while (WiFi.status() != WL_CONNECTED && retry < 20) {
Serial.print(".");
delay(500);
retry++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nKết nối WiFi thành công!");
Serial.print("IP STA: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\nKết nối thất bại!");
Serial.println("Hãy reset ESP32 để vào AP cấu hình lại.");
}
}
}
// -------------------------------------------------
// HÀM LOOP
// -------------------------------------------------
void loop() {
// Nếu đang ở chế độ Access Point → chạy web server
if (ssid == "") {
server.handleClient();
}
}