ปุ่มลัดแบบ 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 V1 (30 ขา)1฿130–฿250Shopee
ปุ่มกด tactile 12 mm + ฝาครอบ6฿5–฿15Shopee
สายจัมเปอร์ ผู้-ผู้ / ผู้-เมีย ชุด 40 เส้น1฿30–฿60Shopee
รวมโดยประมาณ฿190–฿400

ราคาประมาณการ ณ 2026-10-31 ยังไม่ได้ตรวจกับร้าน · บางลิงก์เป็นลิงก์ affiliate (อ่านเพิ่ม)

ถ้าอยากได้สัมผัสแบบคีย์บอร์ด ใช้สวิตช์คีย์บอร์ดแบบ mechanical (เช่น สวิตช์สีน้ำตาลหรือสีแดง) กับปุ่มคีย์แคปแทนปุ่ม tactile ได้ ต่อสายแบบเดียวกัน ราคาจะสูงขึ้นตามสวิตช์ที่เลือก กล่องใช้กล่องพลาสติกเจาะรู หรือพิมพ์ 3D

ต่อสาย

ปุ่มแต่ละปุ่มต่อระหว่างขา GPIO กับ GND ใช้ pull-up ในตัว ไม่ต้องมีตัวต้านทาน:

ปุ่ม123456
GPIO131427262533
ส่งF13F14F15F16F17ปิดเสียง

ขาเหล่านี้ไม่ใช่ขา 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

  1. เสียบไฟ ESP32 แล้วเปิด Bluetooth ในคอมพิวเตอร์ เลือกเพิ่มอุปกรณ์ จะเห็นชื่อ ESP32 Deck กดจับคู่
  2. เปิด OBS → Settings → Hotkeys หาคำสั่งที่ต้องการ เช่น "Switch to scene" ของแต่ละฉาก
  3. คลิกช่องปุ่มลัด แล้วกดปุ่มบนแผงที่ทำเอง ช่องจะขึ้นเป็น F13 (หรือปุ่มที่ส่ง)
  4. ทำแบบเดียวกันกับปุ่มอื่น เช่น เริ่ม/หยุดสตรีม เริ่มอัด ปิดไมค์

ถ้าอัปโหลดโค้ดใหม่แล้วคอมพิวเตอร์ต่อไม่ติด ให้ลบอุปกรณ์ 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 พร้อมกัน

ปัญหาที่พบบ่อย