ถ้าคุณต่อ WiFi กับ ESP32 ไม่ติด อย่าเพิ่งโทษบอร์ดก่อนครับ เพราะหลายครั้งปัญหาไม่ได้อยู่ที่ชิป แต่อยู่ที่จุดเล็ก ๆ อย่างชื่อ WiFi ผิด, ใช้ 5GHz, DHCP ของ router งอแง หรือโค้ดเชื่อมต่อเขียนผิดลำดับ
บทความนี้ผมจะพาคุณไล่ทีละจุดแบบคนทำงานจริง ตั้งแต่เช็กอาการ, อ่านค่า status, ดู IP, ดูสัญญาณ, ไปจนถึงตัวอย่างโค้ด connect, debug, reconnect และ static IP เพื่อให้คุณเอาไปใช้กับงาน ESP32, IoT, Smart Farm หรือโปรเจกต์นักเรียนได้ทันที
- ถ้าคุณเพิ่งเริ่มต้นใช้งานบอร์ดนี้ และยังไม่ค่อยเห็นภาพรวมว่า ESP32 ทำอะไรได้บ้าง แนะนำให้อ่านบทความ ESP32 คืออะไร ก่อน แล้วค่อยกลับมาไล่แก้ปัญหาเรื่อง WiFi จะเข้าใจง่ายขึ้นครับ
เหมาะกับใคร?
Maker มือใหม่, นักเรียน, คนเริ่มใช้ Arduino IDE กับ ESP32 และคนที่กำลังเจอปัญหา “ต่อ WiFi ไม่ติดแต่ไม่รู้จะเริ่มเช็กจากตรงไหน”
สารบัญ
- ทำไม ESP32 ถึงเชื่อมต่อ WiFi ไม่ได้
- อาการแบบไหน บอกอะไรเราได้บ้าง
- วิธีตรวจสอบแบบเร็ว ก่อนลงมือแก้
- ความหมายของ WiFi.status() ที่ควรรู้
- ตัวอย่างโค้ดเชื่อมต่อ WiFi พื้นฐาน
- ตัวอย่างโค้ดสแกนหา WiFi รอบตัว
- ตัวอย่างโค้ด timeout และ debug
- ตัวอย่างโค้ด reconnect เมื่อ WiFi หลุด
- ตัวอย่างโค้ด Static IP
- ถ้าทำโปรเจกต์จริง ควรแก้แบบไหนดี
- สรุปวิธีไล่ปัญหา ESP32 ต่อ WiFi ไม่ติด
- FAQ คำถามที่คนเจอบ่อย
ทำไม ESP32 ถึงเชื่อมต่อ WiFi ไม่ได้
1) ใส่ชื่อ WiFi หรือรหัสผ่านผิด
อันนี้พื้นฐานสุด แต่เจอบ่อยสุดเหมือนกันครับ โดยเฉพาะเวลา copy ชื่อ WiFi ผิด, มีช่องว่างเกิน, ตัวพิมพ์ใหญ่เล็กไม่ตรง หรือจำรหัสจากมือถือผิด
2) ใช้เครือข่าย 5GHz แทน 2.4GHz
ESP32 รุ่นทั่วไปที่มือใหม่ใช้กัน เช่น DevKit V1, WROOM-32, C3, S3 หลายงานที่เจอในสาย Maker ยังทำงานกับ WiFi 2.4GHz เป็นหลัก ถ้าคุณเผลอไปใช้ SSID ของ 5GHz บอร์ดจะมองไม่เห็นหรือเชื่อมต่อไม่ได้
3) สัญญาณอ่อนหรืออยู่ไกล router
บางครั้งต่อไม่ได้ไม่ใช่เพราะรหัสผิด แต่เป็นเพราะบอร์ดอยู่ไกลเกินไป, มีผนังคั่น, หรือมี noise จากอุปกรณ์อื่น ทำให้ connect ยากหรือหลุดบ่อย
4) router ไม่แจก IP หรือ DHCP มีปัญหา
กรณีนี้จะงงมาก เพราะเหมือน ESP32 ต่อได้แล้ว แต่ไม่ได้ IP กลับมา หรือได้ช้ามาก บางบ้าน router เก่าเริ่มมีอาการแบบนี้ชัด
5) hotspot มือถือเปิดโหมดที่ ESP32 มองไม่เห็น
มือถือบางรุ่นปล่อย hotspot แบบที่ชื่อเหมือนเดิมแต่ตั้งค่าความถี่หรือ security ไม่เหมือน router บ้าน ทำให้ ESP32 เจอบ้างไม่เจอบ้าง
6) โค้ดเชื่อมต่อ WiFi เขียนผิดลำดับ
เช่น ลืมเรียก WiFi.begin(), ไม่ตั้งโหมด station, หรือเขียน while ค้างโดยไม่พิมพ์ debug ออกมาเลย สุดท้ายก็มองไม่ออกว่าติดตรงไหน
7) board package หรือ library เก่าเกินไป
ถ้า Arduino IDE หรือ ESP32 board package เก่าเกินไป บางครั้งจะมีบั๊กเรื่องการเชื่อมต่อหรือพฤติกรรมไม่เหมือนตัวอย่างใหม่
8) ไฟเลี้ยงไม่พอ ทำให้บอร์ดรีสตาร์ตตอนต่อ WiFi
จุดนี้สาย Maker เจอจริงครับ โดยเฉพาะตอนจ่ายไฟให้ ESP32 พร้อม relay, sensor, OLED, ปั๊ม, หรือโมดูลอื่นร่วมกัน ถ้าไฟตกตอน WiFi เริ่มทำงาน บอร์ดอาจรีเซตเองจนเหมือน “ต่อไม่ติด”
ถ้าคุณยังแยกไม่ออกว่าเป็นปัญหาโค้ดหรือ router ให้ลองสลับไปต่อ hotspot มือถือก่อน ถ้าต่อได้ แปลว่ามีโอกาสสูงว่าปัญหาอยู่ฝั่ง router หรือการตั้งค่าเครือข่ายเดิม
อาการแบบไหน บอกอะไรเราได้บ้าง
ค้างที่ Connecting…
มักเกิดจากรหัสผิด, ใช้ SSID ผิด, สัญญาณอ่อน หรือบอร์ดมองไม่เห็น WiFi ที่ต้องการ
ขึ้น WL_NO_SSID_AVAIL
แปลตรง ๆ คือหาเครือข่ายนั้นไม่เจอ อาจเป็นเพราะชื่อ SSID ผิด, WiFi ปิดอยู่, หรือคุณกำลังเลือก 5GHz
ขึ้น WL_CONNECT_FAILED
มักเกี่ยวกับรหัสผ่านผิด หรือ router ปฏิเสธการเชื่อมต่อ
ต่อได้แล้วแต่ไม่ได้ IP
ให้สงสัยเรื่อง DHCP, router ค้าง, IP ชน หรือเครือข่ายมีปัญหา
ต่อได้แต่หลุดบ่อย
มักเกี่ยวกับสัญญาณอ่อน, router ไม่นิ่ง, ไฟเลี้ยงไม่นิ่ง หรือไม่มีระบบ reconnect ในโค้ด
วิธีตรวจสอบแบบเร็ว ก่อนลงมือแก้
- เช็กชื่อ WiFi และรหัสผ่านอีกครั้ง
- ยืนยันว่าเครือข่ายที่ใช้เป็น 2.4GHz
- เปิด Serial Monitor ที่ 115200
- พิมพ์ค่า
WiFi.status()ออกมาดู - ถ้าต่อได้ ให้พิมพ์
WiFi.localIP() - ถ้าอยากดูสัญญาณ ให้พิมพ์
WiFi.RSSI() - ลองสแกน WiFi รอบตัวว่าบอร์ดมองเห็น SSID หรือไม่
- ลอง hotspot มือถือเพื่อแยกสาเหตุ
ความหมายของ WiFi.status() ที่ควรรู้
| ค่า | ความหมาย | ตีความแบบใช้งานจริง |
|---|---|---|
| WL_CONNECTED | เชื่อมต่อสำเร็จ | ไปต่อเรื่อง IP, RSSI, ส่งข้อมูลได้เลย |
| WL_NO_SSID_AVAIL | หา SSID ไม่เจอ | ชื่อ WiFi ผิด, WiFi ปิด, ใช้ 5GHz หรืออยู่นอกระยะ |
| WL_CONNECT_FAILED | เชื่อมต่อไม่สำเร็จ | รหัสผ่านผิด หรือ router ปฏิเสธ |
| WL_DISCONNECTED | ยังไม่ได้เชื่อมต่อ / หลุดการเชื่อมต่อ | ต้องดูต่อว่าเพราะสัญญาณ, router หรือ logic reconnect |
มือใหม่หลายคนพลาดตรงที่เห็นแค่ว่า “ต่อไม่ติด” แต่ไม่ได้พิมพ์ status ออกมาดูเลย ทำให้เดาไปเรื่อย สุดท้ายเสียเวลาฟรี
ตัวอย่างโค้ดเชื่อมต่อ WiFi พื้นฐาน
- ในบทความนี้เราจะใช้ฟังก์ชันพื้นฐานอย่าง
WiFi.begin(),WiFi.status(),WiFi.localIP()และWiFi.RSSI()ถ้าคุณอยากเข้าใจแต่ละตัวลึกขึ้น แนะนำให้อ่านต่อที่ ESP32 WiFi Library Functions ครับ
โค้ดเริ่มต้นแบบง่ายสุด
#include <WiFi.h>
const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
Serial.print("RSSI: ");
Serial.println(WiFi.RSSI());
}
void loop() {
}
อธิบายโค้ดทีละส่วน
WiFi.mode(WIFI_STA);ให้ ESP32 ทำงานเป็นตัวไปเชื่อมกับ routerWiFi.begin(ssid, password);เริ่มเชื่อมต่อ- เช็ก
WiFi.status()จนกว่าจะได้WL_CONNECTED - เมื่อสำเร็จ ให้พิมพ์ IP และ RSSI ออกมาดู
จุดที่มือใหม่ชอบพลาด
- ลืมเปลี่ยนชื่อ WiFi กับรหัสผ่านจริง
- พิมพ์ชื่อ WiFi ผิดแม้แค่ตัวเดียว
- เปิด Serial Monitor ผิด baud rate
- ค้างใน while แล้วไม่รู้ว่า status อะไร
ตัวอย่างโค้ดสแกนหา WiFi รอบตัว
ใช้เช็กว่า ESP32 มองเห็น SSID ไหม
#include <WiFi.h>
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("Scan start...");
int n = WiFi.scanNetworks();
if (n == 0) {
Serial.println("No WiFi found");
} else {
Serial.println("WiFi found:");
for (int i = 0; i < n; i++) {
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" RSSI=");
Serial.println(WiFi.RSSI(i));
}
}
}
void loop() {
}โค้ดนี้เหมาะมากเวลาคุณสงสัยว่า ESP32 มองไม่เห็น SSID จริงหรือเปล่า โดยเฉพาะกรณี hotspot มือถือหรือ WiFi บ้านตั้งชื่อคล้ายกันหลายวงตัวอย่างโค้ด timeout และ debug
ไม่ปล่อยให้ while ค้างไม่รู้จบ
#include <WiFi.h>
const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
unsigned long startAttemptTime = 0;
const unsigned long wifiTimeout = 15000;
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
startAttemptTime = millis();
Serial.println("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < wifiTimeout) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("WiFi status = ");
Serial.println(WiFi.status());
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Connected!");
Serial.println(WiFi.localIP());
} else {
Serial.println("Connect timeout");
}
}
void loop() {
}ข้อดีของวิธีนี้คือ ถ้าต่อไม่ได้ คุณจะไม่ค้างอยู่ใน while ตลอด และจะเห็นสถานะออกมาชัดขึ้นตัวอย่างโค้ด reconnect เมื่อ WiFi หลุด
reconnect แบบง่าย
#include <WiFi.h>
const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected");
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi lost, reconnecting...");
WiFi.disconnect();
WiFi.reconnect();
delay(3000);
}
} reconnect แบบไม่บล็อกโปรแกรม
#include <WiFi.h>
const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
unsigned long previousMillis = 0;
const unsigned long interval = 10000;
void connectWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("Start WiFi connect");
}
void setup() {
Serial.begin(115200);
connectWiFi();
}
void loop() {
unsigned long currentMillis = millis();
if (WiFi.status() != WL_CONNECTED) {
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Serial.println("Reconnecting...");
WiFi.disconnect();
WiFi.reconnect();
}
} else {
// ใส่งานอื่นของคุณได้ เช่น อ่าน sensor, ควบคุม relay, ส่งข้อมูล
}
}ถ้าคุณทำ Smart Farm, dashboard, หรือระบบควบคุม relay หลายตัว ผมแนะนำแนวนี้มากกว่า เพราะไม่บล็อก loop ทั้งโปรแกรมตัวอย่างโค้ด Static IP
ใช้เมื่อ DHCP ของ router มีปัญหา
#include <WiFi.h>
const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
IPAddress local_IP(192, 168, 1, 200);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8);
IPAddress secondaryDNS(8, 8, 4, 4);
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
Serial.println("STA Failed to configure");
}
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void loop() {
}
ข้อควรระวังก่อนตั้ง IP เอง
- อย่าตั้ง IP ซ้ำกับอุปกรณ์อื่นในบ้าน
- ต้องอยู่ในวงเดียวกับ router
- ถ้า router ทำงานปกติอยู่แล้ว ใช้ DHCP มักง่ายกว่า
ถ้าทำโปรเจกต์จริง ควรแก้แบบไหนดี
งานทดลองบนโต๊ะ
ใช้โค้ดเชื่อมต่อพื้นฐาน + พิมพ์ IP + พิมพ์ RSSI ก็พอ เพื่อให้รู้ก่อนว่า connect ได้จริง
งาน Smart Farm / IoT
ควรมี reconnect, timeout, debug message และไม่ควรบล็อก loop นานเกินไป เพราะโปรแกรมยังต้องอ่าน sensor และคุมอุปกรณ์ต่อ
เมื่อไรควรใช้ WiFiManager
ถ้าอุปกรณ์ของคุณต้องย้ายบ้าน, ย้ายฟาร์ม, เปลี่ยน router บ่อย หรือให้ลูกค้าใช้งานเอง WiFiManager จะช่วยลดการแก้โค้ดซ้ำได้มาก
เมื่อไรควรบันทึกค่า WiFi ลง Preferences
เมื่อคุณต้องการให้ผู้ใช้กรอก WiFi แล้วอุปกรณ์จำค่าไว้หลังรีสตาร์ต โดยไม่ต้องแฟลชโปรแกรมใหม่ทุกครั้ง
ถ้าคุณต้องการให้อุปกรณ์จำชื่อ WiFi และรหัสผ่านไว้หลังรีสตาร์ต โดยไม่ต้องแฟลชโปรแกรมใหม่ทุกครั้ง คุณควรศึกษาการเก็บค่าแบบถาวรด้วย ESP32 Preferences Storage ครับ
- ESP32 คืออะไร
- ศูนย์รวมบทความสอน ESP32
- ESP32 WiFi Library Functions
- ESP32 WiFi Manager
- ESP32 Preferences Storage
ถ้าคุณอยากเรียนต่อแบบเป็นลำดับ ตั้งแต่พื้นฐาน ESP32, WiFi, sensor, relay ไปจนถึงโปรเจกต์ใช้งานจริง ลองดูรวมบทความทั้งหมดในหน้า Tutorials ได้เลยครับ
สรุปวิธีไล่ปัญหา ESP32 ต่อ WiFi ไม่ติด
ถ้าคุณอยากแก้ให้เร็ว ให้ไล่แบบนี้ครับ
- เช็กชื่อ WiFi และรหัสผ่าน
- ยืนยันว่าใช้ 2.4GHz
- สแกนหา WiFi รอบตัว
- ดูค่า
WiFi.status() - ถ้าต่อได้แล้ว ให้ดู
WiFi.localIP() - ถ้าหลุดบ่อย ให้ดู
WiFi.RSSI()และเพิ่ม reconnect - ถ้ายังไม่หาย ลอง hotspot มือถือเพื่อแยกปัญหา
- สุดท้ายค่อยสงสัยเรื่อง router, DHCP, static IP และ board package
อย่ากระโดดไปแก้หลายจุดพร้อมกันครับ ไม่งั้นคุณจะไม่รู้เลยว่าจริง ๆ แล้วมันหายเพราะอะไร
FAQ คำถามที่คนเจอบ่อย
ESP32 รองรับ WiFi 5GHz ไหม?
นงาน Maker ทั่วไปและบอร์ด ESP32 ที่ใช้กันแพร่หลาย ส่วนใหญ่ให้คิดไว้ก่อนว่าใช้กับ 2.4GHz เป็นหลัก ถ้าใช้ SSID ของ 5GHz มักจะเชื่อมต่อไม่ได้
ทำไม ESP32 ต่อ WiFi ไม่ติดทั้งที่รหัสผ่านถูก?
อาจเป็นเพราะเลือก SSID ผิด, ใช้ 5GHz, hotspot ตั้งค่าไม่ตรง, router มีปัญหา DHCP หรือสัญญาณอ่อนเกินไป
ทำไมต่อ hotspot มือถือไม่ได้?
ให้เช็กก่อนว่า hotspot ปล่อยแบบที่ ESP32 มองเห็นได้หรือไม่ และลองเปลี่ยนชื่อ hotspot ให้เป็นภาษาอังกฤษธรรมดาก่อนเพื่อทดสอบ
ค่า WL_NO_SSID_AVAIL คืออะไร?
คือ ESP32 หาเครือข่ายที่ระบุไว้ไม่เจอ ให้สงสัยเรื่องชื่อ WiFi, ระยะสัญญาณ, หรือความถี่ 5GHz ก่อน
ค่า WL_CONNECT_FAILED คืออะไร?
ส่วนใหญ่เกี่ยวกับรหัสผ่านผิด หรือ router ปฏิเสธการเชื่อมต่อ
ต่อได้แต่ไม่ได้ IP ต้องดูอะไร?
WiFi.localIP() ออกมาดูทุกครั้งหลังเชื่อมต่อ
ถ้า WiFi หลุดบ่อยควรทำยังไง?
เพิ่ม reconnect, เช็ก RSSI, ย้ายตำแหน่งบอร์ด, และเช็กไฟเลี้ยงว่าไม่นิ่งหรือไม่
ต้องใช้ Static IP ทุกครั้งไหม?
ไม่จำเป็นครับ ถ้า router บ้านทำงานปกติ DHCP มักสะดวกกว่า แต่ถ้ามีปัญหาแจก IP ไม่เสถียรค่อยลอง static IP
ทำไมโปรแกรมค้างตอนต่อ WiFi?
มักเกิดจากใช้ while (WiFi.status() != WL_CONNECTED) แบบไม่มี timeout ทำให้โปรแกรมค้างรออยู่ตรงนั้น
โปรเจกต์จริงควรใช้แนวทางไหนดีที่สุด?
สำหรับงานจริง ผมแนะนำให้มี timeout, reconnect แบบ non-blocking, debug ผ่าน Serial และต่อยอดไปใช้ WiFiManager หรือ Preferences ถ้าต้องให้คนอื่นใช้งานต่อ
กำลังเริ่มต้นกับ ESP32 อยู่ใช่ไหม?
ลองอ่านบทความต่อในหมวด WiFi และพื้นฐาน ESP32 ของ Deva DIY ต่อได้เลย คุณจะเห็นภาพรวมตั้งแต่ต่อ WiFi, จัดการค่า config, ไปจนถึงทำโปรเจกต์จริงแบบ Smart Farm และ IoT



