เนื้อหาในบทความ
1 ปัญหาที่พบบ่อยที่สุด
ปัญหา 1: ESP32 พยายามเชื่อมต่อแต่ไม่สำเร็จ
Serial Monitor แสดง:
WiFi.status(): 6 (WL_DISCONNECTED)อาการ: ESP32 พยายามเชื่อมต่อ WiFi ตลอดเวลา แต่ไม่เคยได้ IP address
ปัญหา 2: เชื่อมต่อได้แต่หลุดบ่อย
อาการ: เชื่อมต่อสำเร็จและได้ IP แต่หลุดการเชื่อมต่อทุกๆ 2-5 นาที
ปัญหา 3: ESP32 เชื่อมต่อ WiFi ช้ามาก
อาการ: ใช้เวลา 30-60 วินาที หรือนานกว่านั้นในการเชื่อมต่อ
ปัญหา 4: ไม่เห็น WiFi Network
อาการ: ESP32 สแกนแล้วไม่เห็น SSID ที่ต้องการเชื่อมต่อ
2 วิธีแก้ปัญหาทีละขั้นตอน
1 ตรวจสอบความถี่ WiFi (2.4GHz vs 5GHz)
ปัญหา: ESP32 (และ ESP8266) ไม่รองรับ 5GHz WiFi! ต้องใช้ 2.4GHz เท่านั้น
✓ วิธีแก้:
- ไปที่ Router settings
- ตรวจสอบว่าเปิด 2.4GHz อยู่
- ถ้า SSID เดียวกัน (Dual-band), แยกชื่อออกมา
- เชื่อมต่อ ESP32 กับ 2.4GHz network
2 ตรวจสอบ SSID และ Password
const char* ssid = "MyWiFi";
const char* password = "password";
const char* ssid = "MyWiFi_2.4G";
const char* password = "MySecurePass123";
ข้อควรระวัง: ตรวจสอบว่าไม่มีช่องว่างนำหน้า/ตามหลัง SSID หรือ password และตรวจสอบตัวพิมพ์เล็ก/ใหญ่
3 เพิ่มระยะหมดเวลาการเชื่อมต่อ
บางครั้ง ESP32 ต้องการเวลานานกว่าปกติในการเชื่อมต่อ ควรเพิ่มระยะหมดเวลา (timeout) และ retry
#include <WiFi.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
void connectToWiFi() {
Serial.println("กำลังเชื่อมต่อ WiFi...");
WiFi.begin(ssid, password);
// ลองเชื่อมต่อสูงสุด 20 ครั้ง (10 วินาที)
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\n✓ เชื่อมต่อสำเร็จ!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\n✗ เชื่อมต่อไม่สำเร็จ");
}
}
void setup() {
Serial.begin(115200);
connectToWiFi();
}
void loop() {
// ตรวจสอบสถานะการเชื่อมต่อ
if (WiFi.status() != WL_CONNECTED) {
Serial.println("หลุดการเชื่อมต่อ กำลังเชื่อมต่อใหม่...");
connectToWiFi();
}
delay(10000); // ตรวจสอบทุกๆ 10 วินาที
}4 ปรับการตั้งค่า WiFi Power
ถ้าระยะห่างไกลหรือมีสัญญาณรบกวนมาก ลองเพิ่มกำลังส่งสัญญาณ WiFi
// ตั้งค่ากำลังส่งสัญญาณ WiFi สูงสุด
WiFi.setTxPower(WIFI_POWER_19_5dBm); // สูงสุด
// หรือใช้ค่าระหว่างกลาง
WiFi.setTxPower(WIFI_POWER_15dBm); // ปานกลาง
// ประหยัดพลังงาน (ถ้าใกล้ router)
WiFi.setTxPower(WIFI_POWER_2dBm); // ต่ำสุด⚠️ คำเตือน: การตั้งกำลังสูงสุดจะทำให้ใช้พลังงานมากขึ้น ใช้เฉพาะเมื่อจำเป็นเท่านั้น
3 โค้ดวินิจฉัยปัญหา WiFi
#include <WiFi.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
void scanNetworks() {
Serial.println("\n--- สแกน WiFi Networks ---");
int n = WiFi.scanNetworks();
Serial.println("ค้นพบ " + String(n) + " networks");
for (int i = 0; i < n; i++) {
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")");
Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
delay(10);
}
}
void printWiFiStatus() {
Serial.println("\n--- สถานะ WiFi ---");
switch (WiFi.status()) {
case WL_IDLE_STATUS:
Serial.println("สถานะ: อยู่ระหว่างเชื่อมต่อ");
break;
case WL_NO_SSID_AVAIL:
Serial.println("สถานะ: ไม่พบ SSID");
break;
case WL_SCAN_COMPLETED:
Serial.println("สถานะ: สแกนเสร็จสิ้น");
break;
case WL_CONNECTED:
Serial.println("สถานะ: เชื่อมต่อสำเร็จ");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
Serial.print("Subnet: ");
Serial.println(WiFi.subnetMask());
Serial.print("RSSI: ");
Serial.println(WiFi.RSSI());
Serial.print("Channel: ");
Serial.println(WiFi.channel());
break;
case WL_CONNECT_FAILED:
Serial.println("สถานะ: เชื่อมต่อล้มเหลว");
break;
case WL_CONNECTION_LOST:
Serial.println("สถานะ: หลุดการเชื่อมต่อ");
break;
case WL_DISCONNECTED:
Serial.println("สถานะ: ตัดการเชื่อมต่อ");
break;
}
}
void setup() {
Serial.begin(115200);
delay(1000);
// สแกนหา network ก่อน
scanNetworks();
// เชื่อมต่อ WiFi
Serial.println("\nกำลังเชื่อมต่อ...");
WiFi.begin(ssid, password);
// รอเชื่อมต่อสูงสุด 20 วินาที
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 40) {
delay(500);
Serial.print(".");
// แสดงสถานะทุกๆ 5 วินาที
if (attempts % 10 == 0) {
Serial.println();
printWiFiStatus();
}
attempts++;
}
Serial.println();
printWiFiStatus();
}
void loop() {
// ตรวจสอบสถานะทุกๆ 10 วินาที
static unsigned long lastCheck = 0;
if (millis() - lastCheck > 10000) {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("\n⚠️ หลุดการเชื่อมต่อ!");
printWiFiStatus();
}
lastCheck = millis();
}
}💡 การใช้งาน
- • อัปโหลดโค้ดนี้ลง ESP32
- • เปิด Serial Monitor (115200 baud)
- • ดูผลลัพธ์เพื่อหาสาเหตุของปัญหา
- • ใช้ข้อมูลที่ได้แก้ไขปัญหาตามขั้นตอนด้านบน
4 เทคนิคขั้นสูง
Static IP
กำหนด IP แบบคงที่เพื่อหลีกเลี่ยงปัญหา DHCP
WiFi.config(IPAddress(192,168,1,100), IPAddress(192,168,1,1), IPAddress(255,255,255,0));
WiFi Events
ใช้ WiFi events เพื่อจัดการเหตุการณ์ต่างๆ
WiFi.onEvent([](WiFiEvent_t event,
WiFiEventInfo_t info){
Serial.println("WiFi Event!");
});Hostname
ตั้งชื่อ ESP32 ให้ง่ายต่อการระบุ
WiFi.setHostname("ESP32-Node01");MDNS
ใช้ MDNS เพื่อเข้าถึงด้วยชื่อแทน IP
if (MDNS.begin("esp32")) {
Serial.println("MDNS started");
}5 การป้องกันปัญหา WiFi
ใช้ 2.4GHz เสมอ
ESP32 ไม่รองรับ 5GHz WiFi ต้องใช้ 2.4GHz เท่านั้น
เพิ่ม Auto-Reconnect
เขียนโค้ดให้ reconnect อัตโนมัติเมื่อหลุด
ใกล้ Router
วาง ESP32 ให้ใกล้ router หรือเพิ่ม access point
อัปเดต Firmware
ใช้ ESP32 และ Arduino IDE รุ่นล่าสุด
6 สรุป
ปัญหา WiFi บน ESP32 เป็นปัญหาที่พบบ่อยที่สุด แต่สามารถแก้ไขได้ไม่ยากถ้ารู้สาเหตุ
✓ สิ่งที่คุณเรียนรู้
- • ปัญหา WiFi ที่พบบ่อยและสาเหตุ
- • วิธีแก้ปัญหาทีละขั้นตอน
- • โค้ดวินิจฉัยและ debug WiFi
- • เทคนิคขั้นสูงในการจัดการ WiFi
- • การป้องกันปัญหา WiFi ในอนาคต
หากลองทุกวิธีแล้วยังไม่หาย อาจเป็นที่ hardware ลองเปลี่ยน ESP32 บอร์ดใหม่หรือติดต่อผู้ขาย