📑 เนื้อหาในบทความ
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
- เปิด Arduino IDE
- ไปที่ Tools → Board → Boards Manager
- ค้นหา "Arduino Uno R4"
- ติดตั้ง "Arduino Uno R4 WiFi" package
📚 ขั้นตอนที่ 3: ติดตั้ง WebSocket Library
- ไปที่ Tools → Manage Libraries
- ค้นหา "WebSocket"
- ติดตั้ง "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)- ส่งไปยังทุก ClientwebSocket.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, หรือ อื่นๆ