#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// -------- Wi-Fi Settings --------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// -------- Pin Settings --------
#define LED_WIFI 19
#define SW_RESET 32
#define OLED_SDA 21
#define OLED_SCL 22
// -------- OLED Settings --------
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(
SCREEN_WIDTH, SCREEN_HEIGHT,
&Wire, OLED_RESET
);
// -------- Timing --------
const unsigned long BLINK_INTERVAL = 250;
const unsigned long RETRY_INTERVAL = 10000;
const unsigned long OLED_INTERVAL = 500;
const unsigned long DEBOUNCE_INTERVAL = 50;
unsigned long previousBlink = 0;
unsigned long previousRetry = 0;
unsigned long previousOLED = 0;
unsigned long debounceStart = 0;
bool ledState = false;
bool wasConnected = false;
bool lastReading = HIGH;
bool stableButton = HIGH;
bool oledReady = false;
// เริ่มเชื่อมต่อ Wi-Fi
void connectWiFi() {
Serial.println("Connecting to WiFi...");
WiFi.disconnect();
WiFi.begin(ssid, password);
previousRetry = millis();
wasConnected = false;
}
// แสดงข้อมูลบน OLED
void updateOLED() {
if (!oledReady) return;
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println("ESP32 WIFI MONITOR");
display.drawLine(0, 12, 127, 12, SSD1306_WHITE);
if (WiFi.status() == WL_CONNECTED) {
display.setCursor(0, 18);
display.println("Status: CONNECTED");
display.setCursor(0, 30);
display.print("SSID: ");
display.println(WiFi.SSID());
display.setCursor(0, 42);
display.print("IP: ");
display.println(WiFi.localIP());
display.setCursor(0, 54);
display.print("RSSI: ");
display.print(WiFi.RSSI());
display.println(" dBm");
}
else {
display.setCursor(0, 22);
display.println("Status: CONNECTING");
display.setCursor(0, 38);
display.println("Please wait...");
display.setCursor(0, 54);
display.println("LED: BLINKING");
}
display.display();
}
// ตรวจจับสวิตช์พร้อม Debounce
void checkButton() {
bool reading = digitalRead(SW_RESET);
if (reading != lastReading) {
debounceStart = millis();
}
if (millis() - debounceStart >= DEBOUNCE_INTERVAL) {
if (reading != stableButton) {
stableButton = reading;
if (stableButton == LOW) {
Serial.println("WiFi Reset Button Pressed");
connectWiFi();
updateOLED();
}
}
}
lastReading = reading;
}
// ควบคุม LED แสดงสถานะ
void updateLED() {
unsigned long now = millis();
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(LED_WIFI, HIGH);
if (!wasConnected) {
wasConnected = true;
Serial.println("WiFi Connected!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
Serial.print("RSSI: ");
Serial.println(WiFi.RSSI());
}
}
else {
if (wasConnected) {
wasConnected = false;
Serial.println("WiFi Disconnected!");
}
if (now - previousBlink >= BLINK_INTERVAL) {
previousBlink = now;
ledState = !ledState;
digitalWrite(LED_WIFI, ledState);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_WIFI, OUTPUT);
pinMode(SW_RESET, INPUT_PULLUP);
digitalWrite(LED_WIFI, LOW);
Wire.begin(OLED_SDA, OLED_SCL);
oledReady = display.begin(
SSD1306_SWITCHCAPVCC, OLED_ADDR
);
if (!oledReady) {
Serial.println("OLED initialization failed!");
} else {
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(10, 20);
display.println("ESP32 WIFI SYSTEM");
display.setCursor(20, 35);
display.println("Starting...");
display.display();
}
WiFi.mode(WIFI_STA);
WiFi.setAutoReconnect(true);
connectWiFi();
}
void loop() {
unsigned long now = millis();
checkButton();
updateLED();
// เชื่อมต่อใหม่เมื่อ Wi-Fi ขาด
if (WiFi.status() != WL_CONNECTED) {
if (now - previousRetry >= RETRY_INTERVAL) {
Serial.println("Retrying WiFi...");
connectWiFi();
}
}
// อัปเดตหน้าจอทุก 500 ms
if (now - previousOLED >= OLED_INTERVAL) {
previousOLED = now;
updateOLED();
}
}