// ============================================= // Samsung QB Series - Wisar Digital Setup // ESP32-S3 DevKit N16R8 - USB HID Keyboard // ============================================= // Navigates OSD menus to configure URL Launcher // pointing to Wisar Digital signage platform. // Plug ESP32 USB-C (OTG) port into QB display USB port. // Display should be powered on at home/menu screen. // ============================================= // // ============================================= // AVAILABLE HID KEYS REFERENCE // ============================================= // // --- Modifier Keys --- // KEY_LEFT_CTRL KEY_RIGHT_CTRL // KEY_LEFT_SHIFT KEY_RIGHT_SHIFT // KEY_LEFT_ALT KEY_RIGHT_ALT // KEY_LEFT_GUI KEY_RIGHT_GUI (Windows/Super/Cmd) // // --- Navigation Keys --- // KEY_UP_ARROW KEY_DOWN_ARROW // KEY_LEFT_ARROW KEY_RIGHT_ARROW // KEY_HOME KEY_END // KEY_PAGE_UP KEY_PAGE_DOWN // // --- Editing Keys --- // KEY_BACKSPACE KEY_TAB // KEY_RETURN (Enter) // KEY_ESC // KEY_INSERT KEY_DELETE // KEY_CAPS_LOCK KEY_NUM_LOCK // KEY_SCROLL_LOCK KEY_PRINT_SCREEN // KEY_PAUSE // // --- Function Keys --- // KEY_F1 KEY_F2 KEY_F3 KEY_F4 // KEY_F5 KEY_F6 KEY_F7 KEY_F8 // KEY_F9 KEY_F10 KEY_F11 KEY_F12 // KEY_F13 KEY_F14 KEY_F15 KEY_F16 // KEY_F17 KEY_F18 KEY_F19 KEY_F20 // KEY_F21 KEY_F22 KEY_F23 KEY_F24 // // --- Printable Characters --- // Pass directly to write() or print(): // Letters: 'a'-'z', 'A'-'Z' // Numbers: '0'-'9' // Symbols: '!','@','#','$','%','^','&','*','(',')' // '-','=','[',']','\\',';','\'',',','.','/','`' // '_','+','{','}','|',':','"','<','>','?','~' // ' ' (space) // // --- Modifier Combos --- // Use press() for combos, e.g.: // Keyboard.press(KEY_LEFT_CTRL); // Keyboard.press('c'); // Ctrl+C // Keyboard.releaseAll(); // // --- Menu / Media Keys (USBHIDConsumerControl) --- // Requires #include "USBHIDConsumerControl.h" // Not used in this sketch but available: // CONSUMER_CONTROL_VOLUME_INCREMENT // CONSUMER_CONTROL_VOLUME_DECREMENT // CONSUMER_CONTROL_MUTE // CONSUMER_CONTROL_PLAY_PAUSE // CONSUMER_CONTROL_STOP // CONSUMER_CONTROL_SCAN_NEXT // CONSUMER_CONTROL_SCAN_PREVIOUS // CONSUMER_CONTROL_BRIGHTNESS_INCREMENT // CONSUMER_CONTROL_BRIGHTNESS_DECREMENT // CONSUMER_CONTROL_POWER // CONSUMER_CONTROL_HOME // CONSUMER_CONTROL_BACK // CONSUMER_CONTROL_FORWARD // CONSUMER_CONTROL_REFRESH // // ============================================= #ifndef ARDUINO_USB_MODE #error This ESP32 SoC has no Native USB interface #elif ARDUINO_USB_MODE == 1 #error USB Mode must be set to "USB-OTG (TinyUSB)" in Tools menu #endif #include "USB.h" #include "USBHIDKeyboard.h" USBHIDKeyboard Keyboard; // Delay between each character when typing strings (ms) // Samsung TV is slow — 150ms per char prevents garbled input const int CHAR_DELAY = 250; // Delay between menu navigation steps (ms) const int NAV_DELAY = 2000; void slowType(const char* text) { while (*text) { Keyboard.write(*text); delay(CHAR_DELAY); text++; } } void pressKey(uint8_t key) { Keyboard.press(key); delay(50); Keyboard.releaseAll(); } void setup() { Keyboard.begin(); USB.begin(); // Wait for USB HID enumeration delay(3000); // Navigate past initial screens pressKey(KEY_RETURN); delay(NAV_DELAY); pressKey(KEY_RETURN); delay(NAV_DELAY); pressKey(KEY_RETURN); delay(NAV_DELAY); // Menu navigation - select URL Launcher pressKey(KEY_DOWN_ARROW); delay(NAV_DELAY); pressKey(KEY_DOWN_ARROW); delay(NAV_DELAY); pressKey(KEY_RETURN); delay(3000); // Type Wisar Digital URL (slow, one char at a time) slowType("http://app.wisardigital.com/app"); delay(NAV_DELAY); pressKey(KEY_RETURN); delay(NAV_DELAY); // Continue navigation pressKey(KEY_RIGHT_ARROW); delay(NAV_DELAY); // Navigate sub-menu pressKey(KEY_DOWN_ARROW); delay(NAV_DELAY); pressKey(KEY_DOWN_ARROW); delay(NAV_DELAY); pressKey(KEY_DOWN_ARROW); delay(NAV_DELAY); pressKey(KEY_RIGHT_ARROW); delay(NAV_DELAY); pressKey(KEY_RETURN); delay(NAV_DELAY); // Navigate to PIN entry pressKey(KEY_DOWN_ARROW); delay(NAV_DELAY); pressKey(KEY_DOWN_ARROW); delay(NAV_DELAY); pressKey(KEY_RETURN); delay(NAV_DELAY); // Enter PIN (000000000000) slowType("000000000000"); delay(NAV_DELAY); pressKey(KEY_RETURN); delay(NAV_DELAY); // Done Keyboard.end(); } void loop() { // One-shot payload — nothing to do }