Create ESP-McFaddin-Code

Used on the ESP to program Samsung DMB's

 - Board: ESP32S3 Dev Module
    - USB Mode: USB-OTG (TinyUSB)
    - USB CDC On Boot: Disabled
    - Upload Mode: UART0 / Hardware CDC
    - Flash Size: 16MB (128Mb)
    - PSRAM: OPI PSRAM
    - Partition Scheme: 16M Flash (3MB APP/9.9MB FATFS)
    - Port: /dev/ttyACM0
This commit is contained in:
uhlwoogi
2026-06-20 18:33:07 -05:00
committed by GitHub
parent 457b2dc8aa
commit f60060140e
+177
View File
@@ -0,0 +1,177 @@
// =============================================
// 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
}