HDMI-DDC Input Switch

A one-press monitor input switch. Build guide, setup and firmware updates, all on this page. Source, print files and issues: GitHub.

The switch: a gray tilted case with four black keys labelled HDMI 1, HDMI 2, DP and USB C, an inlaid ultrawide monitor and two small R and B buttons

A small desk box that switches your monitor's input with one key press. It plugs into a spare HDMI port on the monitor and sends the same "change input" command the monitor's own menu does (DDC/CI), so it works with whatever is connected to the other inputs: a PC on DisplayPort, a laptop on USB-C, a console on HDMI.

  • No software on your computers, no network, nothing to pair. Plug it in and press a key.
  • Pressing the key for its own HDMI port shows an info screen with the current setup.
  • What each key does is set up from this page and stored on the switch.

Contents: Parts · Printing · Wiring · Assembly · Monitor setup · Using it · Adding a monitor · Troubleshooting

Parts

PartQtyNotes
Adafruit Feather RP2040 with DVI Output Port (product 5710)1The brains, and the HDMI connection to the monitor
MX-style key switches4Built with Kailh Tactile Brown, 10 pack (Adafruit 4954). Any MX-compatible switch fits.
HDMI cable1A short, flexible one; stiff cables drag a light box around
USB-C cable1Power, and setup from a computer
Heat-set insert M2.5 × 4 mm × 3.5 mm OD4Board standoffs
Screw M2.5 × 6 mm4Board to tray
Heat-set insert M3 × 4 mm × 5 mm OD4Lid: 2 front, 2 back
Screw M3 × 6 mm, button head42 up through the floor, 2 through the back wall
Adhesive rubber feet4Any size; keep them off the two front screw holes
Hook-up wire, superglueWire for the keys; glue for the switch plate

Printing

Everything is PLA at 0.2 mm layers with no supports. The 3MF files with more than one part are multi-colour: load them as one object with multiple parts and pick a filament per part.

FileOrientationColours used hereNotes
keycaps.3mfface down (as exported)Keycaps black, Legends yellow
case-buttons.3mftop down (as exported)Buttons black, Letters yellowUse a brim: small footprint
case-plate.stlglue side down (as exported)black (hidden)Holds the switches
case-lid.3mftop face down (as exported)Lid gray, frame black, screen blue
case-tray.stlupright (as exported)blackOne-layer caps over the screw holes: push the screw through

Printing an MX plate test first? switch-coupon has cut-outs from 13.9 to 14.2 mm, and stem-fit-test has keycap stems from 1.20 to 1.40 mm. The case uses 14.0 and 1.30.

Exploded view: keycaps, lid with the monitor inlay and R/B buttons, switch plate with four switches, the Feather board, tray

Wiring

Each key switch has two pins. Wire one pin of each key to its own Feather pin, and all the other pins together to GND. No resistors: the Feather's internal pull-ups are used.

Wiring: key 1 to A0, key 2 to A1, key 3 to A2, key 4 to A3; the other pin of every key to a shared GND

On the switches, the pins are short, so give each pin one wire. Run a single ground wire along the same pin of every switch: solder its end to key 4, then at keys 3, 2 and 1 cut the insulation and slide it apart to open a 3 mm bare window, and solder that. Upside down, key 1 is on the right.

Underside of the lid: one ground wire runs along the same pin of all four switches through stripped windows, then to GND; each switch's other pin has its own wire to A0 to A3, key 1 on the right

Don't fit pin headers. The board sits low in the case, so solder the wires straight into the A0–A3 and GND holes from the top and keep the joints low.

A0–A3 are just the defaults. Everything is configurable: each key can go to any input your monitor has, show the info screen, or do nothing, and any free pin can be used. The inputs here are the author's setup (two HDMI, DP, USB-C). Set your own in Configure, and print keycaps with your own legends (LEGENDS in case/keycaps.py).

Key (left to right)Feather pinDefault input
1A0HDMI 1
2A1HDMI 2
3A2DP
4A3USB-C

Then the Feather's HDMI goes to a spare HDMI port on the monitor (HDMI 2 here), and USB-C to power. Any USB charger works once it's set up.

Leave the Feather's STEMMA QT connector empty. It shares the I²C bus with the monitor's DDC lines.

Assembly

  1. Melt the 4 × M2.5 heat-set inserts into the tray's standoffs. Tray with four brass M2.5 inserts above the board standoffs
  2. Melt the M3 inserts into the lid: 2 into the front posts, 2 into the back posts. Do the back ones with the lid lying on its back, so you press straight down. Lid from below: two inserts under the front posts and two behind the rear posts
  3. Screw the Feather to the tray with the 4 × M2.5 × 6 screws, then wire the keys (see Wiring). Feather board above the tray with four screws lined up over the inserts
  4. Clip the four switches into the switch plate. Drop the R and B buttons into their holes from under the lid, then glue the plate in place: its two pins line it up, and its tab traps the buttons. Switch plate with four switches below the lid, and the R and B buttons below their holes
  5. Lower the lid onto the tray. Fit 2 × M3 screws up through the floor at the front and 2 through the back wall. Press on the keycaps and stick on the feet. Lid lifted above the tray, keycaps above the switches, two screws below the floor and two behind the back wall

The underside of the lid, for reference:

Underside of the lid: front screw posts, locating pins for the switch plate, pockets for the R and B buttons, and the two rear screw posts

Monitor setup

  • Make sure DDC/CI is on in the monitor's menu, if it has that setting.
  • The switch's HDMI port stays dark except while you're looking at its info screen, so the monitor won't jump to it when a computer sleeps, and can still go to standby. If yours does jump there anyway, turn off Auto Input Switch (LG) or anything like it.
  • LG UltraGear monitors ignore the standard input command. The LG UltraGear preset uses LG's own command, tested on the 45GR75DC-B.

Using it

  • Keys switch the monitor to their input. The key for the switch's own port (HDMI 2 here) shows the info screen; it goes dark again when you switch away, or after 5 minutes.
  • R restarts the switch. B is a spare key (the Feather's BOOT button) you can give a job in Configure.
  • Factory reset without a computer: hold keys 1 and 2 while plugging in USB.
  • Configure (tab above, Chrome or Edge): connect, then pick a preset or enter your monitor's values, use Try to test inputs, and choose what each key does. Marking This computer makes Try switch back after 10 seconds.
  • Install firmware (tab above) updates the switch. Your settings are kept.
The info screen: title with version, a Keys panel listing each key and its input with HDMI 2 highlighted as this screen, a Monitor panel with the preset and DDC status, a Tips panel, and the set-up address with uptime at the bottom

Adding a monitor

Most monitors use the standard input command (VCP 0x60 from source 0x51), but the value for each input varies by brand. To find yours:

  1. In Configure, pick MCCS standard, mark This computer, then press Try on each input and watch what the monitor does.
  2. Change values until each input switches correctly. Common ones: 0x0F DP 1, 0x10 DP 2, 0x11 HDMI 1, 0x12 HDMI 2, and often 0x1B USB-C.
  3. If nothing reacts, your monitor may use a proprietary command, like LG's VCP 0xF4 from 0x50.
  4. Save it to the switch, and share it: add an entry to web/presets.json in the project and open a pull request.

Troubleshooting

SymptomTry
Scan doesn't find DDC/CI (0x37)Check the HDMI cable and port, and that DDC/CI is on in the monitor's menu. Some monitors stop answering in deep standby: wake them first.
"ACK" but the input doesn't changeThe monitor heard the command but uses different values: see Adding a monitor.
The info screen says "no signal"Press the switch's own key: the picture only turns on then, for 5 minutes. Also check that the Feather's HDMI is in the port marked as The switch, and that the board has USB power.
A key does nothingCheck its wiring to the right pin and to GND, and that the key has an action in Configure.
Install mode doesn't show RPI-RP2Hold BOOT (the B button, or the board's button), tap RESET (R), release BOOT.
Connect lists nothingUse Chrome or Edge on a computer, and close any other program using the switch's serial port.