ESP32 เชื่อมต่อ WiFi ไม่ได้ | วิธีแก้ปัญหา + ตัวอย่างโค้ด

ถ้าคุณต่อ 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 ไม่ได้

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 เริ่มทำงาน บอร์ดอาจรีเซตเองจนเหมือน “ต่อไม่ติด”

แผนผังตรวจสอบปัญหา ESP32 ต่อ WiFi ไม่ติดแบบทีละขั้น
Tip จากหน้างาน:

ถ้าคุณยังแยกไม่ออกว่าเป็นปัญหาโค้ดหรือ router ให้ลองสลับไปต่อ hotspot มือถือก่อน ถ้าต่อได้ แปลว่ามีโอกาสสูงว่าปัญหาอยู่ฝั่ง router หรือการตั้งค่าเครือข่ายเดิม

อาการแบบไหน บอกอะไรเราได้บ้าง

ค้างที่ Connecting…

มักเกิดจากรหัสผิด, ใช้ SSID ผิด, สัญญาณอ่อน หรือบอร์ดมองไม่เห็น WiFi ที่ต้องการ

ขึ้น WL_NO_SSID_AVAIL

แปลตรง ๆ คือหาเครือข่ายนั้นไม่เจอ อาจเป็นเพราะชื่อ SSID ผิด, WiFi ปิดอยู่, หรือคุณกำลังเลือก 5GHz

ขึ้น WL_CONNECT_FAILED

มักเกี่ยวกับรหัสผ่านผิด หรือ router ปฏิเสธการเชื่อมต่อ

ต่อได้แล้วแต่ไม่ได้ IP

ให้สงสัยเรื่อง DHCP, router ค้าง, IP ชน หรือเครือข่ายมีปัญหา

ต่อได้แต่หลุดบ่อย

มักเกี่ยวกับสัญญาณอ่อน, router ไม่นิ่ง, ไฟเลี้ยงไม่นิ่ง หรือไม่มีระบบ reconnect ในโค้ด

วิธีตรวจสอบแบบเร็ว ก่อนลงมือแก้

  1. เช็กชื่อ WiFi และรหัสผ่านอีกครั้ง
  2. ยืนยันว่าเครือข่ายที่ใช้เป็น 2.4GHz
  3. เปิด Serial Monitor ที่ 115200
  4. พิมพ์ค่า WiFi.status() ออกมาดู
  5. ถ้าต่อได้ ให้พิมพ์ WiFi.localIP()
  6. ถ้าอยากดูสัญญาณ ให้พิมพ์ WiFi.RSSI()
  7. ลองสแกน WiFi รอบตัวว่าบอร์ดมองเห็น SSID หรือไม่
  8. ลอง 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 status ของ ESP32 เช่น WL_CONNECTED และ WL_NO_SSID_AVAIL

ตัวอย่างโค้ดเชื่อมต่อ 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 ทำงานเป็นตัวไปเชื่อมกับ router
  • WiFi.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 WiFi อัตโนมัติบน ESP32 เมื่อสัญญาณหลุด

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 และรหัสผ่านในโค้ดทุกครั้ง หรือกำลังทำอุปกรณ์ให้ลูกค้าหรือคนในบ้านใช้งานต่อ แนวทางที่สะดวกกว่าคือใช้ ESP32 WiFi Manager เพื่อให้ผู้ใช้ตั้งค่าเครือข่ายผ่านหน้า config ได้เอง

เมื่อไรควรบันทึกค่า WiFi ลง Preferences

เมื่อคุณต้องการให้ผู้ใช้กรอก WiFi แล้วอุปกรณ์จำค่าไว้หลังรีสตาร์ต โดยไม่ต้องแฟลชโปรแกรมใหม่ทุกครั้ง

ถ้าคุณต้องการให้อุปกรณ์จำชื่อ WiFi และรหัสผ่านไว้หลังรีสตาร์ต โดยไม่ต้องแฟลชโปรแกรมใหม่ทุกครั้ง คุณควรศึกษาการเก็บค่าแบบถาวรด้วย ESP32 Preferences Storage ครับ

แนะนำให้อ่านต่อ:

ถ้าคุณอยากเรียนต่อแบบเป็นลำดับ ตั้งแต่พื้นฐาน ESP32, WiFi, sensor, relay ไปจนถึงโปรเจกต์ใช้งานจริง ลองดูรวมบทความทั้งหมดในหน้า Tutorials ได้เลยครับ

สรุปวิธีไล่ปัญหา ESP32 ต่อ WiFi ไม่ติด

ถ้าคุณอยากแก้ให้เร็ว ให้ไล่แบบนี้ครับ

  1. เช็กชื่อ WiFi และรหัสผ่าน
  2. ยืนยันว่าใช้ 2.4GHz
  3. สแกนหา WiFi รอบตัว
  4. ดูค่า WiFi.status()
  5. ถ้าต่อได้แล้ว ให้ดู WiFi.localIP()
  6. ถ้าหลุดบ่อย ให้ดู WiFi.RSSI() และเพิ่ม reconnect
  7. ถ้ายังไม่หาย ลอง hotspot มือถือเพื่อแยกปัญหา
  8. สุดท้ายค่อยสงสัยเรื่อง router, DHCP, static IP และ board package

อย่ากระโดดไปแก้หลายจุดพร้อมกันครับ ไม่งั้นคุณจะไม่รู้เลยว่าจริง ๆ แล้วมันหายเพราะอะไร

FAQ คำถามที่คนเจอบ่อย

ESP32 รองรับ WiFi 5GHz ไหม?

นงาน Maker ทั่วไปและบอร์ด ESP32 ที่ใช้กันแพร่หลาย ส่วนใหญ่ให้คิดไว้ก่อนว่าใช้กับ 2.4GHz เป็นหลัก ถ้าใช้ SSID ของ 5GHz มักจะเชื่อมต่อไม่ได้

อาจเป็นเพราะเลือก SSID ผิด, ใช้ 5GHz, hotspot ตั้งค่าไม่ตรง, router มีปัญหา DHCP หรือสัญญาณอ่อนเกินไป

ให้เช็กก่อนว่า hotspot ปล่อยแบบที่ ESP32 มองเห็นได้หรือไม่ และลองเปลี่ยนชื่อ hotspot ให้เป็นภาษาอังกฤษธรรมดาก่อนเพื่อทดสอบ

คือ ESP32 หาเครือข่ายที่ระบุไว้ไม่เจอ ให้สงสัยเรื่องชื่อ WiFi, ระยะสัญญาณ, หรือความถี่ 5GHz ก่อน

ส่วนใหญ่เกี่ยวกับรหัสผ่านผิด หรือ router ปฏิเสธการเชื่อมต่อ

ให้ดู router, DHCP, IP ชน และลองพิมพ์ WiFi.localIP() ออกมาดูทุกครั้งหลังเชื่อมต่อ

เพิ่ม reconnect, เช็ก RSSI, ย้ายตำแหน่งบอร์ด, และเช็กไฟเลี้ยงว่าไม่นิ่งหรือไม่

ไม่จำเป็นครับ ถ้า router บ้านทำงานปกติ DHCP มักสะดวกกว่า แต่ถ้ามีปัญหาแจก IP ไม่เสถียรค่อยลอง static IP

มักเกิดจากใช้ while (WiFi.status() != WL_CONNECTED) แบบไม่มี timeout ทำให้โปรแกรมค้างรออยู่ตรงนั้น

สำหรับงานจริง ผมแนะนำให้มี timeout, reconnect แบบ non-blocking, debug ผ่าน Serial และต่อยอดไปใช้ WiFiManager หรือ Preferences ถ้าต้องให้คนอื่นใช้งานต่อ

กำลังเริ่มต้นกับ ESP32 อยู่ใช่ไหม?

ลองอ่านบทความต่อในหมวด WiFi และพื้นฐาน ESP32 ของ Deva DIY ต่อได้เลย คุณจะเห็นภาพรวมตั้งแต่ต่อ WiFi, จัดการค่า config, ไปจนถึงทำโปรเจกต์จริงแบบ Smart Farm และ IoT

Shopping Cart
Scroll to Top