ปุ่มลัดแบบ Stream Deck ทำเองด้วย ESP32 ต่อ Bluetooth ไม่ต้องเสียบสาย
ทำแผงปุ่มลัดแบบ Stream Deck ด้วย ESP32 เป็นคีย์บอร์ด Bluetooth ส่งปุ่ม F13–F17 ไปสลับฉากใน OBS ปิดเสียง สั่งงานด้วยปุ่มเดียว ใช้ชิ้นส่วนไม่ถึง ฿400
ESP32 ทำตัวเป็นคีย์บอร์ด Bluetooth ได้ ต่อปุ่มกด 6 ปุ่มแล้วให้แต่ละปุ่มส่งปุ่มลัด เช่น F13–F17 ที่ไม่มีบนคีย์บอร์ดจริง
จากนั้นตั้งใน OBS หรือโปรแกรมอื่นว่าปุ่มลัดไหนทำอะไร ได้แผงปุ่มแบบ Stream Deck ที่ไม่ต้องเสียบสาย ราคาชิ้นส่วนราว ฿190–400
ซื้อหรือทำเอง
ซื้อสำเร็จ: แผงปุ่มลัดสำหรับสลับฉาก เปิดเพลง และสั่งงานด้วยปุ่มเดียว Elgato Stream Deck ราคาประมาณ ฿2,800–5,500 ส่วน macro keypad ไม่มียี่ห้อราคาประมาณ ฿200–600
ทำเอง: ใช้ของ 3 อย่าง รวมราว ฿190–400 (รายการพร้อมลิงก์อยู่ในหัวข้อชิ้นส่วนด้านล่าง)
- บอร์ด ESP32 DevKit: ทำตัวเป็นคีย์บอร์ด Bluetooth
- ปุ่มกด tactile 12 mm 6 ปุ่ม: ปุ่มลัด
- สายจัมเปอร์ และอะแดปเตอร์ USB 5 V หรือ power bank กล่องใช้กล่องพลาสติกเจาะรู หรือพิมพ์ 3D
ราคาเป็นค่าประมาณ ทำเองเหมาะเมื่ออยากได้แบบไร้สาย หรืออยากกำหนดเองว่าแต่ละปุ่มทำอะไร เช่น หนึ่งปุ่มส่งหลายคำสั่งต่อกัน
ชิ้นส่วน
| ชิ้นส่วน | จำนวน | ราคาประมาณ | ร้าน |
|---|---|---|---|
| ESP32 DevKit V1 (30 ขา) | 1 | ฿130–฿250 | Shopee |
| ปุ่มกด tactile 12 mm + ฝาครอบ | 6 | ฿5–฿15 | Shopee |
| สายจัมเปอร์ ผู้-ผู้ / ผู้-เมีย ชุด 40 เส้น | 1 | ฿30–฿60 | Shopee |
| รวมโดยประมาณ | ฿190–฿400 | ||
ราคาประมาณการ ณ 2026-10-31 ยังไม่ได้ตรวจกับร้าน · บางลิงก์เป็นลิงก์ affiliate (อ่านเพิ่ม)
ถ้าอยากได้สัมผัสแบบคีย์บอร์ด ใช้สวิตช์คีย์บอร์ดแบบ mechanical (เช่น สวิตช์สีน้ำตาลหรือสีแดง) กับปุ่มคีย์แคปแทนปุ่ม tactile ได้ ต่อสายแบบเดียวกัน ราคาจะสูงขึ้นตามสวิตช์ที่เลือก กล่องใช้กล่องพลาสติกเจาะรู หรือพิมพ์ 3D
ต่อสาย
ปุ่มแต่ละปุ่มต่อระหว่างขา GPIO กับ GND ใช้ pull-up ในตัว ไม่ต้องมีตัวต้านทาน:
| ปุ่ม | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| GPIO | 13 | 14 | 27 | 26 | 25 | 33 |
| ส่ง | F13 | F14 | F15 | F16 | F17 | ปิดเสียง |
ขาเหล่านี้ไม่ใช่ขา strapping จึงไม่ทำให้บอร์ดบูตผิดถ้ามีคนกดค้างตอนเสียบไฟ (ขาที่ควรเลี่ยงอธิบายไว้ใน ต่อปุ่มกดกับ ESP32) ถ้าต้องการมากกว่า 6 ปุ่ม เพิ่มได้ที่ GPIO 4, 16, 17, 18, 19, 21, 22, 23 และ 32 หรือต่อเป็นแบบ matrix เพื่อใช้ขาน้อยลง
ไลบรารี
ใช้ไลบรารี ESP32 BLE Keyboard ของ T-vK ดาวน์โหลดไฟล์ ZIP จากหน้า Releases บน GitHub ของโปรเจกต์ (เวอร์ชันล่าสุดคือ 0.3.2-beta) แล้วติดตั้งใน Arduino IDE ที่เมนู Sketch → Include Library → Add .ZIP Library
บอร์ด ESP32 เวอร์ชัน 3.x ต้องแก้ไลบรารีสองบรรทัด ไม่อย่างนั้นจะคอมไพล์ไม่ผ่านพร้อม error
cannot convert 'std::string' to 'String' เปิดไฟล์ BleKeyboard.cpp ในโฟลเดอร์
Documents\Arduino\libraries\ESP32_BLE_Keyboard ด้วยโปรแกรมแก้ข้อความ แล้วแก้ในฟังก์ชัน begin():
BLEDevice::init(deviceName);
// แก้เป็น
BLEDevice::init(String(deviceName.c_str()));
hid->manufacturer()->setValue(deviceManufacturer);
// แก้เป็น
hid->manufacturer()->setValue(String(deviceManufacturer.c_str()));
อีกทางคือเปลี่ยนบอร์ด esp32 ใน Boards Manager เป็นเวอร์ชัน 2.0.17 ซึ่งเป็นรุ่นที่ไลบรารีนี้เขียนไว้ให้ใช้ โค้ดในบทความนี้ทดสอบคอมไพล์กับบอร์ด esp32 3.3.12 และไลบรารีที่แก้สองบรรทัดนี้แล้ว
โค้ด (Arduino IDE)
#include <BleKeyboard.h>
BleKeyboard keyboard("ESP32 Deck", "DIY", 100); // ชื่อที่เห็นตอนจับคู่ Bluetooth
const int PINS[] = { 13, 14, 27, 26, 25, 33 };
const int N = sizeof(PINS) / sizeof(PINS[0]);
const unsigned long DEBOUNCE_MS = 30;
bool stable[N], lastRead[N];
unsigned long changedAt[N];
void sendKey(int button) {
if (button == 5) { // ปุ่มสุดท้าย: ปุ่มปิดเสียงของระบบ
keyboard.write(KEY_MEDIA_MUTE);
return;
}
keyboard.press(KEY_F13 + button); // ปุ่ม 1–5 ส่ง F13–F17
delay(20);
keyboard.releaseAll();
}
void setup() {
for (int i = 0; i < N; i++) {
pinMode(PINS[i], INPUT_PULLUP);
stable[i] = lastRead[i] = HIGH;
changedAt[i] = 0;
}
keyboard.begin();
}
void loop() {
for (int i = 0; i < N; i++) {
bool now = digitalRead(PINS[i]);
if (now != lastRead[i]) { lastRead[i] = now; changedAt[i] = millis(); }
if (millis() - changedAt[i] > DEBOUNCE_MS && now != stable[i]) {
stable[i] = now;
if (now == LOW && keyboard.isConnected()) sendKey(i);
}
}
}
debounce แบบนี้อธิบายละเอียดในบทความ ต่อปุ่มกดกับ ESP32 ถ้าไม่มี debounce กดหนึ่งครั้งอาจสลับฉากสองรอบ
ทำไมใช้ F13–F24
คีย์บอร์ดทั่วไปมีถึงแค่ F12 แต่ระบบปฏิบัติการรู้จักปุ่ม F13–F24 ด้วย ปุ่มลัดที่ส่งจากแผงปุ่มจึงไม่ชนกับปุ่มลัดของโปรแกรมอื่น ถ้าโปรแกรมไหนไม่รับ F13 ขึ้นไป ให้ส่งปุ่มรวมแทน เช่น Ctrl + Alt + Shift + 1:
keyboard.press(KEY_LEFT_CTRL);
keyboard.press(KEY_LEFT_ALT);
keyboard.press(KEY_LEFT_SHIFT);
keyboard.press('1');
delay(20);
keyboard.releaseAll();
ปุ่มเดียวทำหลายอย่างต่อกันก็ได้ เช่น keyboard.print("brb") พิมพ์ข้อความลงช่องแชต (พิมพ์ได้เฉพาะตัวอักษรอังกฤษ เพราะส่งเป็นรหัสปุ่มบนคีย์บอร์ด US)
ปุ่มมีเดียอื่นที่ใช้ได้ เช่น KEY_MEDIA_PLAY_PAUSE, KEY_MEDIA_NEXT_TRACK, KEY_MEDIA_VOLUME_UP
จับคู่และตั้งค่าใน OBS
- เสียบไฟ ESP32 แล้วเปิด Bluetooth ในคอมพิวเตอร์ เลือกเพิ่มอุปกรณ์ จะเห็นชื่อ ESP32 Deck กดจับคู่
- เปิด OBS → Settings → Hotkeys หาคำสั่งที่ต้องการ เช่น "Switch to scene" ของแต่ละฉาก
- คลิกช่องปุ่มลัด แล้วกดปุ่มบนแผงที่ทำเอง ช่องจะขึ้นเป็น F13 (หรือปุ่มที่ส่ง)
- ทำแบบเดียวกันกับปุ่มอื่น เช่น เริ่ม/หยุดสตรีม เริ่มอัด ปิดไมค์
ถ้าอัปโหลดโค้ดใหม่แล้วคอมพิวเตอร์ต่อไม่ติด ให้ลบอุปกรณ์ ESP32 Deck ออกจากรายการ Bluetooth แล้วจับคู่ใหม่
เสียบสาย USB แทน Bluetooth
ESP32 รุ่นธรรมดา (DevKit V1) ทำเป็นคีย์บอร์ด USB ไม่ได้ เพราะพอร์ต USB บนบอร์ดต่อผ่านชิปแปลง USB-serial ถ้าอยากได้แบบเสียบสาย
ให้ใช้ ESP32-S3 ซึ่งมี USB ในตัวชิป ใช้ไลบรารี USBHIDKeyboard ที่มากับบอร์ด ESP32 และตั้ง Tools → USB Mode เป็น USB-OTG (TinyUSB)
ข้อดีคือไม่ต้องจับคู่ ไม่มีดีเลย์ของ Bluetooth และใช้ไฟจากสาย USB พร้อมกัน
ปัญหาที่พบบ่อย
- จับคู่แล้วแต่กดปุ่มไม่มีอะไรเกิดขึ้น เปิด Notepad แล้วลองโค้ดที่ส่ง
keyboard.print("a")ถ้าตัว a ขึ้น แปลว่าการเชื่อมต่อใช้ได้ ปัญหาอยู่ที่โปรแกรมไม่รับปุ่มที่ส่ง - กดหนึ่งครั้งสลับฉากสองรอบ เพิ่ม
DEBOUNCE_MSเป็น 50 - บางครั้งช้าหรือหลุด Bluetooth ของคอมพิวเตอร์บางเครื่องพักอุปกรณ์เพื่อประหยัดไฟ ปิดการประหยัดพลังงานของ Bluetooth ใน Device Manager หรือเปลี่ยนไปใช้ ESP32-S3 แบบสาย USB
- อัปโหลดโค้ดไม่ได้ ดู ESP32 อัปโหลดโค้ดไม่ได้