บทความ: สร้างระบบสื่อสารแบบเรียลไทม์กับ Arduino Uno R4 WiFi ด้วย WebSocket

เรียนรู้วิธีใช้ WebSocket บน Arduino Uno R4 WiFi เพื่อสร้างระบบสื่อสารแบบสองทิศทาง (Bidirectional) แบบเรียลไทม์ เหมาะสำหรับโปรเจกต์ IoT Dashboard, Remote Control และ Monitoring System ที่ต้องการตอบสนองทันที

📅 22 มีนาคม 2026⏱️ 15 นาที🎯 ระดับกลาง

1. WebSocket คืออะไร?

WebSocket เป็นโปรโตคอลการสื่อสารแบบ Full-Duplex ที่อนุญาตให้ส่งข้อมูลแบบสองทิศทาง (Bidirectional) ระหว่าง Client และ Server ได้พร้อมกันในการเชื่อมต่อเดียว

不同于 HTTP ที่ต้องทำการ Request-Response ทุกครั้ง WebSocket จะเปิดการเชื่อมต่อไว้ตลอดเวลา ทำให้สามารถส่งข้อมูลจาก Server ไปยัง Client ได้ทันทีโดยไม่ต้องรอ Client ขอ request

🎯 ข้อดีของ WebSocket

  • Real-Time Communication: ส่งข้อมูลแบบทันทีทันใด (Low Latency)
  • Two-Way Communication: สื่อสารได้ทั้งสองทิศทางพร้อมกัน
  • Efficient: ไม่ต้องส่ง Header ใหม่ทุกครั้ง (Overhead น้อยกว่า HTTP)
  • Persistent Connection: เชื่อมต่อครั้งเดียวใช้งานได้ตลอด
  • Low Bandwidth: ประหยัด Bandwidth ดีกว่า Polling

🚀 ใช้ WebSocket เมื่อไหร่?

  • IoT Dashboard ที่ต้องการอัปเดตข้อมูลแบบ Real-Time
  • Remote Control System ที่ต้องการตอบสนองทันที
  • Chat Application หรือ Collaborative Tools
  • Live Monitoring Systems
  • Gaming Applications แบบ Real-Time

2. คุณสมบัติของ Arduino Uno R4 WiFi

Arduino Uno R4 WiFi คือบอร์ด Arduino รุ่นล่าสุดที่มาพร้อมกับ WiFi และ Bluetooth ในตัว โดยใช้ชิป Renesas RA4M1 เป็นตัวประมวลผลหลัก และ ESP32-S3 สำหรับการเชื่อมต่อไร้สาย

💡 จุดเด่นของ Arduino Uno R4 WiFi

  • • ใช้งานง่ายเหมือน Arduino UNO ทุกประการ
  • • มี WiFi และ Bluetooth LE ในตัว
  • • รองรับ WebSocket Library อย่างเป็นทางการ
  • • มี 12-bit DAC และ RTC ในตัว
  • • รองรับ Arduino IoT Cloud

🔌 WebSocket Library สำหรับ Arduino Uno R4 WiFi

Arduino Uno R4 WiFi มี WebSocket Library ที่พัฒนาโดย Arduino เอง ทำให้การใช้งาน WebSocket ง่ายและเสถียรกว่าการใช้ Library ของบุคคลที่สาม

⚠️ ข้อควรระวัง

  • • WebSocket Library ทำงานร่วมกับ ESP32-S3 บนบอร์ด
  • • ต้องต่อ Internet เพื่อใช้งานได้
  • • อาจมีข้อจำกัดเรื่องจำนวนการเชื่อมต่อพร้อมกัน

3. ข้อกำหนดเบื้องต้น

🛠️ อุปกรณ์ที่ต้องใช้

  • Arduino Uno R4 WiFi - บอร์ดหลัก
  • USB Cable - สายเชื่อมต่อคอมพิวเตอร์
  • คอมพิวเตอร์ - ติดตั้ง Arduino IDE แล้ว
  • อินเทอร์เน็ต - สำหรับทดสอบการเชื่อมต่อ

💻 ซอฟต์แวร์ที่ต้องการ

  • Arduino IDE 2.x - เวอร์ชันล่าสุดแนะนำ
  • WebSocket Library - ติดตั้งผ่าน Library Manager
  • Web Browser - Chrome, Firefox, หรือ Edge

📚 ความรู้พื้นฐานที่ควรมี

  • พื้นฐานการเขียนโปรแกรม Arduino
  • ความเข้าใจเรื่อง HTML/JavaScript เบื้องต้น
  • พื้นฐานเครือข่าย (IP Address, WiFi)

4. การติดตั้งและเตรียมความพร้อม

🔧 ขั้นตอนที่ 1: ติดตั้ง Arduino IDE

ดาวน์โหลดและติดตั้ง Arduino IDE เวอร์ชันล่าสุดจาก arduino.cc

📦 ขั้นตอนที่ 2: ติดตั้ง Board Package

  1. เปิด Arduino IDE
  2. ไปที่ Tools → Board → Boards Manager
  3. ค้นหา "Arduino Uno R4"
  4. ติดตั้ง "Arduino Uno R4 WiFi" package

📚 ขั้นตอนที่ 3: ติดตั้ง WebSocket Library

  1. ไปที่ Tools → Manage Libraries
  2. ค้นหา "WebSocket"
  3. ติดตั้ง "WebSockets" โดย Markus Sattler

✅ เคล็ดลับ

หลังจากติดตั้งเสร็จแล้ว ให้รีสตาร์ท Arduino IDE เพื่อให้แน่ใจว่า Library โหลดขึ้นมาอย่างถูกต้อง

5. ตัวอย่างพื้นฐาน WebSocket

ในตัวอย่างนี้ เราจะสร้าง WebSocket Server ง่ายๆ บน Arduino Uno R4 WiFi ที่จะส่งข้อความต้อนรับเมื่อ Client เชื่อมต่อ และรับข้อความจาก Client พร้อมส่งกลับ

/*
 * Arduino Uno R4 WiFi - Basic WebSocket Example
 * ตัวอย่างพื้นฐานการใช้งาน WebSocket Server
 */

#include <WiFi.h>
#include <WebSocketsServer.h>

// ตั้งค่า WiFi
const char* ssid = "YOUR_WIFI_SSID";        // แทนที่ด้วยชื่อ WiFi ของคุณ
const char* password = "YOUR_WIFI_PASSWORD"; // แทนที่ด้วยรหัส WiFi ของคุณ

// สร้าง WebSocket Server ที่พอร์ต 81
WebSocketsServer webSocket = WebSocketsServer(81);

// ฟังก์ชันจัดการเหตุการณ์ WebSocket
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
  switch(type) {
    case WStype_DISCONNECTED:             // เมื่อ Client ตัดการเชื่อมต่อ
      Serial.printf("[%u] Disconnected!\n", num);
      break;

    case WStype_CONNECTED:                // เมื่อ Client เชื่อมต่อสำเร็จ
      {
        IPAddress ip = webSocket.remoteIP(num);
        Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);

        // ส่งข้อความต้อนรับไปยัง Client
        webSocket.sendTXT(num, "Hello from Arduino Uno R4 WiFi! 🤖");
      }
      break;

    case WStype_TEXT:                     // เมื่อได้รับข้อความจาก Client
      Serial.printf("[%u] Received text: %s\n", num, payload);

      // ส่งข้อความกลับไปยัง Client (Echo)
      webSocket.sendTXT(num, "Echo: " + String((char*)payload));
      break;

    case WStype_BIN:                      // เมื่อได้รับข้อมูล Binary
      Serial.printf("[%u] Received binary length: %u\n", num, length);
      break;
  }
}

void setup() {
  // เริ่มต้น Serial Monitor
  Serial.begin(115200);
  Serial.println("\n\n🚀 Arduino Uno R4 WiFi - WebSocket Server");

  // เชื่อมต่อ WiFi
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi");

  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\n✅ WiFi connected!");
  Serial.print("📡 IP Address: ");
  Serial.println(WiFi.localIP());

  // เริ่มต้น WebSocket Server
  webSocket.begin();
  webSocket.onEvent(webSocketEvent);      // ลงทะเบียนฟังก์ชันจัดการ Event

  Serial.println("🌐 WebSocket Server started on port 81");
  Serial.println("Ready to connect! 🎯");
}

void loop() {
  // ต้องเรียก webSocket.loop() อยู่ใน loop() เสมอ
  webSocket.loop();
}

🖥️ ทดสอบด้วย Web Browser

หลังจากอัปโหลดโค้ดแล้ว ให้เปิด Console ของ Browser (F12) และวาง JavaScript นี้:

// แทนที่ด้วย IP Address ของ Arduino ของคุณ
const arduinoIP = "192.168.1.100";  // เปลี่ยนตาม IP ที่แสดงใน Serial Monitor

// เชื่อมต่อ WebSocket
const ws = new WebSocket(`ws://${arduinoIP}:81/`);

// เมื่อเชื่อมต่อสำเร็จ
ws.onopen = function() {
  console.log('✅ Connected to Arduino Uno R4 WiFi!');

  // ส่งข้อความไปยัง Arduino
  ws.send('Hello from Browser! 🌐');
};

// เมื่อได้รับข้อความจาก Arduino
ws.onmessage = function(event) {
  console.log('📩 Received:', event.data);
};

// เมื่อตัดการเชื่อมต่อ
ws.onclose = function() {
  console.log('❌ Disconnected from Arduino');
};

// เมื่อเกิดข้อผิดพลาด
ws.onerror = function(error) {
  console.log('❌ WebSocket Error:', error);
};

6. สร้าง Real-Time IoT Dashboard

ตอนนี้เราจะสร้าง IoT Dashboard ที่อัปเดตข้อมูลแบบ Real-Time โดย Arduino จะส่งค่าจากเซ็นเซอร์ และ Web Dashboard จะแสดงผลพร้อมรับคำสั่งควบคุม

📡 Arduino Code (ส่งข้อมูลเซ็นเซอร์)

/*
 * Arduino Uno R4 WiFi - Real-Time IoT Dashboard
 * ส่งข้อมูลเซ็นเซอร์แบบ Real-Time ผ่าน WebSocket
 */

#include <WiFi.h>
#include <WebSocketsServer.h>

const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";

WebSocketsServer webSocket = WebSocketsServer(81);

// จำลองข้อมูลเซ็นเซอร์
float temperature = 25.0;
float humidity = 60.0;
int light = 500;
bool ledState = false;

unsigned long lastTime = 0;
const long interval = 1000;  // ส่งข้อมูลทุกๆ 1 วินาที

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
  switch(type) {
    case WStype_CONNECTED:
      Serial.printf("[%u] Dashboard connected\n", num);
      // ส่งข้อมูลเซ็นเซอร์ครั้งแรก
      sendSensorData(num);
      break;

    case WStype_TEXT:
      // รับคำสั่งจาก Dashboard
      String command = String((char*)payload);
      Serial.printf("Received command: %s\n", command.c_str());

      if(command == "LED_ON") {
        ledState = true;
        digitalWrite(LED_BUILTIN, HIGH);
        webSocket.sendTXT(num, "LED turned ON 💡");
      }
      else if(command == "LED_OFF") {
        ledState = false;
        digitalWrite(LED_BUILTIN, LOW);
        webSocket.sendTXT(num, "LED turned OFF 🌑");
      }
      else if(command == "GET_DATA") {
        sendSensorData(num);
      }
      break;
  }
}

// ฟังก์ชันส่งข้อมูลเซ็นเซอร์
void sendSensorData(uint8_t num) {
  // สร้าง JSON String
  String json = "{";
  json += "\"temperature\":" + String(temperature, 1) + ",";
  json += "\"humidity\":" + String(humidity, 1) + ",";
  json += "\"light\":" + String(light) + ",";
  json += "\"ledState\":" + String(ledState ? "true" : "false");
  json += "}";

  webSocket.sendTXT(num, json);
}

// ฟังก์ชันอัปเดตค่าเซ็นเซอร์ (จำลอง)
void updateSensors() {
  // จำลองการเปลี่ยนแปลงของเซ็นเซอร์
  temperature += random(-5, 6) / 10.0;  // เพิ่ม/ลด 0.5 องศา
  humidity += random(-10, 11) / 10.0;   // เพิ่ม/ลด 1%
  light += random(-50, 51);              // เพิ่ม/ลด 50

  // จำกัดค่าไม่ให้เกินขอบเขต
  temperature = constrain(temperature, 10, 40);
  humidity = constrain(humidity, 20, 90);
  light = constrain(light, 0, 1023);
}

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);

  // เชื่อมต่อ WiFi
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\n✅ WiFi connected");
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());

  // เริ่มต้น WebSocket Server
  webSocket.begin();
  webSocket.onEvent(webSocketEvent);

  Serial.println("🌐 WebSocket Server ready");
}

void loop() {
  webSocket.loop();

  // ส่งข้อมูลเซ็นเซอร์ทุกๆ 1 วินาที
  unsigned long currentTime = millis();
  if(currentTime - lastTime >= interval) {
    lastTime = currentTime;
    updateSensors();

    // ส่งข้อมูลไปยังทุก Client ที่เชื่อมต่อ
    webSocket.broadcastTXT("{\"temperature\":" + String(temperature, 1) +
                              ",\"humidity\":" + String(humidity, 1) +
                              ",\"light\":" + String(light) +
                              ",\"ledState\":" + String(ledState ? "true" : "false") + "}");
  }
}

🌐 HTML Dashboard Code

<!DOCTYPE html>
<html>
<head>
  <title>Arduino Uno R4 WiFi - Real-Time Dashboard</title>
  <style>
    body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
    .sensor-card { background: #f0f0f0; padding: 20px; margin: 10px 0; border-radius: 8px; }
    .value { font-size: 2em; font-weight: bold; color: #2196F3; }
    .button { background: #4CAF50; color: white; padding: 15px 30px; border: none;
              border-radius: 8px; cursor: pointer; font-size: 1.1em; }
    .button.off { background: #f44336; }
  </style>
</head>
<body>
  <h1>🤖 Arduino Uno R4 WiFi Dashboard</h1>

  <div class="sensor-card">
    <h3>🌡️ อุณหภูมิ</h3>
    <div class="value" id="temp">--</div>
  </div>

  <div class="sensor-card">
    <h3>💧 ความชื้น</h3>
    <div class="value" id="humid">--</div>
  </div>

  <div class="sensor-card">
    <h3>💡 แสง</h3>
    <div class="value" id="light">--</div>
  </div>

  <div class="sensor-card">
    <h3>🔆 ควบคุม LED</h3>
    <button class="button" id="ledBtn" onclick="toggleLED()">เปิด LED</button>
  </div>

  <script>
    // แทนที่ด้วย IP ของ Arduino คุณ
    const arduinoIP = "192.168.1.100";
    const ws = new WebSocket(`ws://${arduinoIP}:81/`);
    let ledOn = false;

    ws.onmessage = function(event) {
      const data = JSON.parse(event.data);
      document.getElementById('temp').innerText = data.temperature + '°C';
      document.getElementById('humid').innerText = data.humidity + '%';
      document.getElementById('light').innerText = data.light;
      ledOn = data.ledState;
      updateLedButton();
    };

    function toggleLED() {
      const cmd = ledOn ? 'LED_OFF' : 'LED_ON';
      ws.send(cmd);
    }

    function updateLedButton() {
      const btn = document.getElementById('ledBtn');
      if(ledOn) {
        btn.innerText = 'ปิด LED';
        btn.classList.add('off');
      } else {
        btn.innerText = 'เปิด LED';
        btn.classList.remove('off');
      }
    }
  </script>
</body>
</html>

7. เทคนิคขั้นสูง

🔄 การจัดการ Multiple Clients

WebSocket รองรับการเชื่อมต่อหลาย Client พร้อมกัน ใช้ฟังก์ชัน:

  • webSocket.sendTXT(num, message) - ส่งไปยัง Client ที่ระบุ
  • webSocket.broadcastTXT(message) - ส่งไปยังทุก Client
  • webSocket.connectedClients() - ตรวจสอบจำนวน Client ที่เชื่อมต่อ

🔐 การรักษาความปลอดภัย

สำหรับการใช้งานใน Production ควรพิจารณา:

  • ใช้ WSS (WebSocket Secure) แทน WS ปกติ
  • เพิ่ม Authentication เมื่อ Client เชื่อมต่อ
  • ตรวจสอบและกรองข้อมูลที่รับมา
  • จำกัดอัตราการส่งข้อมูล (Rate Limiting)

⚡ การปรับปรุงประสิทธิภาพ

  • ส่งข้อมูลเป็น Binary แทน Text สำหรับข้อมูลขนาดใหญ่
  • ใช้ JSON สำหรับโครงสร้างข้อมูลที่ซับซ้อน
  • ใช้ Compression สำหรับข้อมูลขนาดใหญ่
  • ตั้งค่า Heartbeat เพื่อตรวจสอบการเชื่อมต่อ

8. การแก้ปัญหา

❌ ปัญหา: เชื่อมต่อ WiFi ไม่ได้

สาเหตุ: ชื่อหรือรหัสผ่าน WiFi ผิด, สัญญาณอ่อน

วิธีแก้: ตรวจสอบ SSID และ Password, ย้ายบอร์ดใกล้ Access Point, ลองรีเซ็ตบอร์ด

❌ ปัญหา: WebSocket เชื่อมต่อไม่ได้

สาเหตุ: พอร์ตถูกบล็อก, Firewall ป้องกัน, IP เปลี่ยน

วิธีแก้: ตรวจสอบ IP Address, ปิด Firewall ชั่วคราว, ลองพอร์ตอื่น (82, 83)

❌ ปัญหา: ข้อมูลส่งไม่ถึง

สาเหตุ: Buffer ล้น, ส่งเร็วเกินไป

วิธีแก้: ลดความถี่ในการส่ง, ใช้ delay ระหว่างการส่ง, ตรวจสอบขนาดข้อมูล

❌ ปัญหา: Client ตัดการเชื่อมต่อบ่อย

สาเหตุ: WiFi ไม่เสถียร, สัญญาณอ่อน

วิธีแก้: ย้ายบอร์ดใกล้ Access Point, ใช้ External Antenna, เพิ่ม Auto-Reconnect

📞 ต้องการความช่วยเหลือเพิ่มเติม?

ตรวจสอบ Arduino Forum หรือ บทความอื่นๆ ของเราสำหรับข้อมูลเพิ่มเติม

9. สรุป

ในบทความนี้ เราได้เรียนรู้วิธีการใช้งาน WebSocket บน Arduino Uno R4 WiFi ตั้งแต่พื้นฐานไปจนถึงการสร้าง Real-Time IoT Dashboard ที่สมบูรณ์

🎯 สิ่งที่คุณได้เรียนรู้

  • ความเข้าใจเรื่อง WebSocket Protocol และข้อดี
  • การติดตั้งและเตรียมความพร้อม Arduino Uno R4 WiFi
  • การสร้าง WebSocket Server พื้นฐาน
  • การสร้าง Real-Time IoT Dashboard
  • เทคนิคขั้นสูงและการแก้ปัญหา

🚀 ถัดไป...

หลังจากนี้คุณสามารถ:

  • เชื่อมต่อกับ CynoIoT Platform เพื่อเก็บข้อมูลใน Cloud
  • ใช้ MQTT ควบคู่กับ WebSocket สำหรับโปรเจกต์ที่ซับซ้อน
  • สร้างระบบ Home Automation ที่ควบคุมผ่าน Web Dashboard
  • ทดลองใช้ ESP-NOW สำหรับการสื่อสารระหว่างบอร์ด

💡 ความคิดสร้างสรรค์

ลองประยุกต์ใช้ WebSocket กับโปรเจกต์ของคุณเอง เช่น: Remote Control Car, Smart Plant Monitoring, Weather Station, หรือ อื่นๆ

🤖 CynoIoT Platform - แพลตฟอร์ม IoT ที่สมบูรณ์สำหรับโปรเจกต์ของคุณ

© 2026 CynoIoT. Built with ❤️ for Thai Makers