สอนใช้ ESP32 WiFi Library ด้วยโปรแกรม Arduino IDE

ESP32 WiFi Library Functions ด้วย WiFi.h (โหมด, สแกน WiFi, ต่อเน็ต, Static IP, Reconnect)

บทความนี้รวม “คำสั่ง Wi‑Fi ที่ใช้บ่อย” บน ESP32 สำหรับมือใหม่/เมคเกอร์: ตั้งค่าโหมด, สแกนหาเครือข่าย, เชื่อมต่อ Router, ตั้ง Static IP และทำ Reconnect เมื่อเน็ตหลุด — พร้อมโค้ดตัวอย่างที่เอาไปใช้ได้เลย

ESP32 WiFi Library คือ “ชุดคำสั่ง (Library) สำหรับควบคุม Wi-Fi บน ESP32” ที่เราเรียกใช้ผ่านไฟล์ WiFi.h ใน Arduino IDE

สรุปแบบเข้าใจง่าย:

  • ใช้สั่งให้ ESP32 ต่อ Wi-Fi บ้าน/ร้าน (โหมด STA) หรือ ปล่อย Wi-Fi เองให้มือถือมาเกาะ (โหมด AP) หรือทำ ทั้งคู่ (AP+STA)

  • ทำงานพื้นฐานได้ครบ เช่น สแกนหาเครือข่าย, เชื่อมต่อ SSID/Password, เช็คสถานะการต่อ, อ่านค่า IP / RSSI

  • ตั้งค่าได้ลึกขึ้น เช่น Static IP (ให้ IP ไม่เปลี่ยน) และทำ Reconnect เมื่อ Wi-Fi หลุด

ถ้าคุณทำโปรเจกต์ที่ต้องสื่อสารผ่านเน็ต/แลน (เว็บเซิร์ฟเวอร์, แอปคุม, ส่งข้อมูลเซนเซอร์) WiFi.h คือ “ประตูหลัก” ที่ทำให้ ESP32 เข้าเครือข่ายได้

ถ้าอยากปูพื้นฐานก่อน: ดูบทความ “ESP32 คืออะไร” และ “ESP32 Pinout Devkit V1” ในเว็บ DevaDIY ได้เลย (ลิงก์ท้ายบทความ)

🎥 วิดีโอสอน: ESP32 WiFi Library Functions 

 

เริ่มต้น: เพิ่มไลบรารี Wi‑Fi

ก่อนใช้งานคำสั่งทั้งหมด ให้ include ไลบรารี WiFi.h ในโปรเจกต์ของคุณ:

#include "WiFi.h"

หมายเหตุ: เมื่อติดตั้งบอร์ด ESP32 ใน Arduino IDE แล้ว ไลบรารีนี้จะติดมาพร้อมใช้งานอยู่แล้ว

Wi‑Fi Mode

ESP32 ทำได้ 3 โหมดหลัก: เป็น “เครื่องลูกข่าย” (STA), เป็น “ปล่อย Wi‑Fi เอง” (AP) หรือทำทั้งคู่พร้อมกัน (AP+STA)

เลือกโหมดให้ถูกก่อน จะทำงานง่ายขึ้น:

  • WIFI_STA : ESP32 ไปเชื่อม Router (เหมาะกับ IoT / WebServer ในบ้าน)
  • WIFI_AP : ESP32 ปล่อย Wi-Fi ให้มือถือมาเชื่อม (เหมาะกับตั้งค่าครั้งแรก)
  • WIFI_AP_STA : เปิดทั้ง AP และ STA พร้อมกัน

คำสั่งหลัก

// Station (ต่อ Wi‑Fi Router)
WiFi.mode(WIFI_STA);

// Access Point (ปล่อย Wi‑Fi ให้มือถือมาเกาะ)
WiFi.mode(WIFI_AP);

// พร้อมกันทั้ง AP + Station
WiFi.mode(WIFI_AP_STA);

ทิป: งาน IoT ส่วนใหญ่ที่ต้อง “ต่อ Router” จะเริ่มที่ WIFI_STA

อยากเห็นภาพการทำงาน STA / AP / STA+AP แบบชัด ๆ แนะนำอ่านบทความ “ESP32 WiFi STA / AP / STA+AP” ในเว็บ DevaDIY

ค้นหาเครือข่าย Wi‑Fi (WiFi Scan)

การสแกนหา Wi‑Fi รอบตัวมีประโยชน์มาก เช่น ตรวจว่า SSID อยู่ในระยะ, ดูความแรงสัญญาณ (RSSI), ดูช่องสัญญาณ (CH) หรือประเภทการเข้ารหัส (Encryption)

โค้ดตัวอย่าง: WiFiScan (เหมือนใน Arduino IDE > Examples > WiFi > WiFiScan)

/* ตัวอย่าง WiFiScan www.devadiy.com/esp32-wifi-library-functions/ */
#include "WiFi.h"

void setup() {
  Serial.begin(115200);

  // Set WiFi to station mode and disconnect from an AP if it was previously connected.
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("Setup done");
}

void loop() {
  Serial.println("Scan start");

  // WiFi.scanNetworks will return the number of networks found.
  int n = WiFi.scanNetworks();

  Serial.println("Scan done");

  if (n == 0) {
    Serial.println("no networks found");
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    Serial.println("Nr | SSID | RSSI | CH | Encryption");

    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      Serial.printf("%2d", i + 1);
      Serial.print(" | ");
      Serial.printf("%-32.32s", WiFi.SSID(i).c_str());
      Serial.print(" | ");
      Serial.printf("%4d", WiFi.RSSI(i));
      Serial.print(" | ");
      Serial.printf("%2d", WiFi.channel(i));
      Serial.print(" | ");

      switch (WiFi.encryptionType(i)) {
        case WIFI_AUTH_OPEN:            Serial.print("open"); break;
        case WIFI_AUTH_WEP:             Serial.print("WEP"); break;
        case WIFI_AUTH_WPA_PSK:         Serial.print("WPA"); break;
        case WIFI_AUTH_WPA2_PSK:        Serial.print("WPA2"); break;
        case WIFI_AUTH_WPA_WPA2_PSK:    Serial.print("WPA+WPA2"); break;
        case WIFI_AUTH_WPA2_ENTERPRISE: Serial.print("WPA2-EAP"); break;
        case WIFI_AUTH_WPA3_PSK:        Serial.print("WPA3"); break;
        case WIFI_AUTH_WPA2_WPA3_PSK:   Serial.print("WPA2+WPA3"); break;
        case WIFI_AUTH_WAPI_PSK:        Serial.print("WAPI"); break;
        default:                        Serial.print("unknown");
      }
      Serial.println();
      delay(10);
    }
  }

  Serial.println("");

  // Delete the scan result to free memory for code below.
  WiFi.scanDelete();

  // Wait a bit before scanning again
  delay(5000);
}
ESP32 wifi scan devaDIY

โค้ดนี้ “ตั้งโหมด STA + disconnect ก่อน” เพื่อให้สแกนได้เสถียร และเรียก WiFi.scanDelete() ช่วยคืนหน่วยความจำหลังสแกน

นี่คือผลลัพธ์ของการอัพโหลด sketch ของ ESP32 WiFi Scanner

อ่านค่า RSSI: -50 ดีมาก / -60 ดี / -70 พอได้ / -80 เริ่มหลุดง่าย

ดูตัวอย่างวิธี Scan หา WiFi รอบตัวด้วย ESP32
สามารถอ่านต่อได้ที่  ESP32 Scan  WiFi อธิบายแบบเข้าใจง่าย

เชื่อมต่อเครือข่าย Wi‑Fi

หลัก ๆ คือ: ตั้งโหมดเป็น Station → เรียก WiFi.begin(ssid, password) → รอจน WiFi.status()==WL_CONNECTED หรือหมดเวลา

โค้ดตัวอย่าง: Connect to a Wi‑Fi Network (มี Timeout)

/* Deva DIY ESP32 เชื่อมต่อสัญญาณเครือข่าย Wifi www.devadiy.com/esp32-wifi-library-functions/ */
#include "WiFi.h"

// Replace with your network credentials (STATION)
const char* ssid = "your ssid";
const char* password = "your password";

void setup() {
  Serial.begin(115200);
  WiFi_init();
}

void loop() {
}

void WiFi_init() {
  unsigned long pastTime = 0;
  unsigned long nowTime  = 0;
  unsigned long timeOut  = 10000;

  // ตั้งค่า esp32 WiFi Mode : Station
  WiFi.mode(WIFI_STA);

  // เชื่อมต่อเครื่อข่าย WiFi ด้วย ssid, password
  WiFi.begin(ssid, password);

  // ตรวจสอบการเชื่อมต่อ WiFi ถ้าใช้เวลาเชื่อมต่อเกิน timeOut ให้หยุดการเชื่อมต่อ
  pastTime = millis();
  while ((WiFi.status() != WL_CONNECTED) && (nowTime <= timeOut)) {
    Serial.print("Connecting to ");
    Serial.println(ssid);
    delay(500);
    nowTime = millis() - pastTime;
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.print("Local ESP32 IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("RSSI: ");
    Serial.println(WiFi.RSSI());
  } else {
    Serial.print("Unable connect to Wi-Fi ");
    Serial.println(ssid);
    WiFi.disconnect();
  }
}

ข้อควรระวัง: ถ้าคุณวน while รอ WiFi แบบไม่ timeout แล้ว SSID/Pass ผิด → บอร์ดจะเหมือนค้าง/ทำงานไม่ต่อ

รับค่า Wi‑Fi Connection Status

ค่า WiFi.status() ที่พบบ่อย (ช่วยเวลา debug):

ValueConstantความหมาย
0WL_IDLE_STATUSสถานะชั่วคราวเมื่อเริ่ม WiFi.begin()
1WL_NO_SSID_AVAILหา SSID ไม่เจอ
2WL_SCAN_COMPLETEDสแกนเครือข่ายเสร็จแล้ว
3WL_CONNECTEDเชื่อมต่อสำเร็จ
4WL_CONNECT_FAILEDเชื่อมต่อล้มเหลว
5WL_CONNECTION_LOSTการเชื่อมต่อหลุดระหว่างทาง
6WL_DISCONNECTEDถูกตัดการเชื่อมต่อ

Get WiFi Connection Strength

ดูความแรงสัญญาณหลังเชื่อมต่อสำเร็จ:

Serial.println(WiFi.RSSI());

Get ESP32 IP Address

ดู IP ที่ Router แจกให้ (DHCP):

Serial.println(WiFi.localIP());

เปิดหน้าจอ Serial Monitor แสดงผลลัพธ์ เลข IP และความแรงสัญญาณ 

ตั้งค่า Static ESP32 IP Address

ปกติ Router จะ “แจก IP แบบสุ่มตามรอบ” (DHCP) ทำให้รีสตาร์ทแล้ว IP อาจเปลี่ยนได้ ถ้าโปรเจกต์ของคุณต้องเรียกหา ESP32 ด้วย IP เดิม (เช่น Web Server/REST API) แนะนำตั้ง Static IP

หลักการ: ตั้ง IP ให้อยู่ในวงเดียวกับ Router เช่น Router = 192.168.1.1 → ESP32 ตั้งเป็น 192.168.1.50

กำหนดค่าที่ต้องใช้

// Set your Static IP address
IPAddress local_IP(192, 168, 1, XXX); // ที่อยู่ IP แบบคงที่ที่คุณต้องการ// Set your Gateway IP address
IPAddress gateway(192, 168, 1, 1);

IPAddress subnet(255, 255, 0, 0);

IPAddress primaryDNS(8, 8, 8, 8); // optional
IPAddress secondaryDNS(8, 8, 4, 4); // optional

เรียกใช้ WiFi.config() ใน setup()

void setup() {
  // กำหนดค่า Static IP Address
  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
    Serial.println("Configuration Failed!");
  }
}

ระวัง: อย่าตั้ง IP ชนกับอุปกรณ์อื่นในบ้าน (เช่นไปชน IP มือถือ/กล้องวงจรปิด) ไม่งั้นจะงงหนัก

WiFi Reconnect

ถ้า ESP32 หลุดจาก Wi‑Fi คุณสามารถเรียก WiFi.reconnect() เพื่อพยายามกลับไปเชื่อมต่อเครือข่ายเดิมได้

แนวคิด

WiFi.reconnect();

ด้านล่างคือฟังก์ชันตัวอย่างที่เอาไปใส่ใน loop() เพื่อเช็คทุก ๆ 10 วินาที ถ้าหลุดแล้วค่อย reconnect (กัน reconnect รัว ๆ)

โค้ดตัวอย่าง: WiFi_reconnect()

void WiFi_reconnect() {
  static unsigned long previousTime = 0;
  const unsigned long interval = 10000;

  // ถ้า WiFi หลุดการเชื่อมต่อให้ทำการเชื่อมต่อใหม่อีกครั้ง
  if ((WiFi.status() != WL_CONNECTED) && ((millis() - previousTime) >= interval)) {
    Serial.println("Reconnecting to WiFi");
    WiFi.disconnect();
    WiFi.reconnect();
    previousTime = millis();
  }
}

โค้ดตัวอย่างแบบเต็ม (Init + Reconnect)

#include "WiFi.h"

// Replace with your network credentials (STATION)
const char* ssid = "YOUR SSID";
const char* password = "YOUR PASSWORD";

void setup() {
  Serial.begin(115200);
  WiFi_init();
}

void loop() {
  WiFi_reconnect(); // เรียกใช้ฟังก์ชั่น WiFi Reconnect
}

void WiFi_init() {
  unsigned long pastTime = 0;
  unsigned long nowTime  = 0;
  unsigned long timeOut  = 10000;

  // ตั้งค่า esp32 WiFi Mode : Station
  WiFi.mode(WIFI_STA);

  // เชื่อมต่อเครื่อข่าย WiFi ด้วย ssid, password
  WiFi.begin(ssid, password);

  // ตรวจสอบการเชื่อมต่อ WiFi ถ้าใช้เวลาเชื่อมต่อเกิน timeOut ให้หยุดการเชื่อมต่อ
  pastTime = millis();
  while ((WiFi.status() != WL_CONNECTED) && (nowTime <= timeOut)) {
    Serial.print("Connecting to ");
    Serial.println(ssid);
    delay(500);
    nowTime = millis() - pastTime;
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.print("Local ESP32 IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("RSSI: ");
    Serial.println(WiFi.RSSI());
  } else {
    Serial.print("Unable connect to Wi-Fi ");
    Serial.println(ssid);
    WiFi.disconnect();
  }
}

void WiFi_reconnect() {
  static unsigned long previousTime = 0;
  const unsigned long interval = 10000;

  // ถ้า WiFi หลุดการเชื่อมต่อให้ทำการเชื่อมต่อใหม่อีกครั้ง
  if ((WiFi.status() != WL_CONNECTED) && ((millis() - previousTime) >= interval)) {
    Serial.println("Reconnecting to WiFi");
    WiFi.disconnect();
    WiFi.reconnect();
    previousTime = millis();
  }
}

ข้อควรระวัง: อย่า reconnect ถี่มาก (เช่นทุก 10ms) เพราะจะทำให้ระบบหน่วง/ร้อน/ไม่เสถียร

ตารางสรุปฟังก์ชันที่ใช้บ่อย (จำแค่นี้ก็พอเริ่มได้)

Functionหมวดใช้ทำอะไรตัวอย่าง
WiFi.mode()Modeกำหนดโหมด STA / AP / AP+STAWiFi.mode(WIFI_STA);
WiFi.scanNetworks()Scanสแกน SSID รอบตัวint n=WiFi.scanNetworks();
WiFi.begin()Connectเริ่มเชื่อม RouterWiFi.begin(ssid, pass);
WiFi.status()Statusเช็ค WL_CONNECTEDWiFi.status()==WL_CONNECTED
WiFi.config()Static IPตั้ง Static IP (ต้องเรียกก่อน begin)WiFi.config(ip, gw, sn);
WiFi.localIP()Networkดู IP ปัจจุบันWiFi.localIP()
WiFi.RSSI()Signalดูความแรงสัญญาณ (dBm)WiFi.RSSI()
WiFi.reconnect()Reconnectสั่ง reconnect เมื่อหลุดWiFi.reconnect();

อ่านต่อ (บทความที่เกี่ยวข้อง)

ถ้าคุณกำลังเริ่มทำระบบอัตโนมัติในฟาร์ม/บ้าน: โครงสร้าง Wi‑Fi ที่นิ่ง + Reconnect ที่ดี คือ “ฐาน” ของทั้งระบบ

FAQ: คำถามที่พบบ่อยเกี่ยวกับ ESP32 WiFi

ทำไมต้องเรียก WiFi.mode(WIFI_STA) ก่อน?

เพื่อบอก ESP32 ว่าเราจะทำงานแบบ “ไปเชื่อม Router” ชัดเจน ลดความสับสน และทำให้โค้ด predictable มากขึ้น

โดยทั่วไป -50 ดีมาก, -60 ดี, -70 พอได้, -80 เริ่มหลุดง่าย (ขึ้นกับสภาพแวดล้อม)

ต้องเรียก ก่อน WiFi.begin() เสมอ ไม่งั้นค่า Static IP จะไม่ถูกนำไปใช้

แนะนำทุก 2–5 วินาทีพอ อย่าถี่จนเกินไป เพราะจะทำให้ระบบหน่วงและไม่เสถียร

Shopping Cart
Scroll to Top