#include <WiFi.h>
// WiFi สำหรับ Wokwi Simulator
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// กำหนดขา ESP32 ตามภาพ
#define LED_WIFI 19
#define SW_RESET 32
// ตั้งเวลาการทำงาน
const unsigned long BLINK_TIME = 250;
const unsigned long RETRY_TIME = 5000;
const unsigned long DEBOUNCE_TIME = 50;
unsigned long previousBlink = 0;
unsigned long previousRetry = 0;
unsigned long debounceTime = 0;
bool ledState = false;
bool lastReading = HIGH;
bool stableButton = HIGH;
bool wasConnected = false;
// ฟังก์ชันเชื่อมต่อ WiFi
void connectWiFi() {
Serial.println();
Serial.println("Connecting to WiFi...");
digitalWrite(LED_WIFI, LOW);
ledState = false;
WiFi.disconnect();
WiFi.begin(ssid, password);
previousRetry = millis();
}
// ฟังก์ชันตรวจสอบสวิตช์
void checkSwitch() {
bool reading = digitalRead(SW_RESET);
if (reading != lastReading) {
debounceTime = millis();
}
if (millis() - debounceTime >= DEBOUNCE_TIME) {
if (reading != stableButton) {
stableButton = reading;
if (stableButton == LOW) {
Serial.println("RESET WiFi Button Pressed!");
wasConnected = false;
connectWiFi();
}
}
}
lastReading = reading;
}
// ฟังก์ชันแสดงสถานะ LED
void updateLED() {
if (WiFi.status() == WL_CONNECTED) {
// เชื่อมต่อสำเร็จ LED ติดค้าง
digitalWrite(LED_WIFI, HIGH);
if (!wasConnected) {
wasConnected = true;
Serial.println();
Serial.println("WiFi Connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("RSSI: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
}
}
else {
if (wasConnected) {
wasConnected = false;
Serial.println("WiFi Disconnected!");
}
// กำลังเชื่อมต่อ LED กระพริบ
if (millis() - previousBlink >= BLINK_TIME) {
previousBlink = millis();
ledState = !ledState;
digitalWrite(LED_WIFI, ledState);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_WIFI, OUTPUT);
pinMode(SW_RESET, INPUT_PULLUP);
digitalWrite(LED_WIFI, LOW);
Serial.println("ESP32 WiFi System Starting...");
WiFi.mode(WIFI_STA);
WiFi.setAutoReconnect(true);
connectWiFi();
}
void loop() {
// ตรวจสอบปุ่ม RESET
checkSwitch();
// ตรวจสอบ WiFi และ LED
updateLED();
// เชื่อมต่อใหม่เมื่อ WiFi หลุด
if (WiFi.status() != WL_CONNECTED) {
if (millis() - previousRetry >= RETRY_TIME) {
Serial.println("Retry WiFi...");
connectWiFi();
}
}
}