Community project

Interactive Projector Workbench

ESP32
Photo of Interactive Projector Workbench
Generated with AI

Sambhu SS

Published September 15, 2026

The Interactive Projector Workbench combines an ESP32 microcontroller with a TI LightCrafter Display 3310 DLP projector and Ultraleap hand gesture sensor to create a responsive projection system. This guide covers building a complete power delivery and control platform with thermal monitoring, including a protected high-side power switch, synchronous buck converter for clean 5.1 V rails, and reverse-polarity protection.

Builders will receive a complete wiring diagram, detailed parts list with sourcing information, ESP32 firmware with temperature-based thermal throttling, and step-by-step assembly instructions. The system monitors projector temperature via I2C and automatically manages power delivery to prevent overheating, while a status LED provides real-time operational feedback.

Wiring diagram

Wiring diagram for Interactive Projector Workbench
Loading diagram…

Gather all the parts

QtyComponent
1

Locking 5.5 mm × 2.1 mm DC barrel input connector, CUI Devices PJ-002AH

19 V DC input

The panel connector that accepts the external 19 volt DC supply.

1

SMBJ24A input transient suppressor, Littelfuse SMBJ24A

24 V TVS

A surge clamp that protects the 19 volt input from voltage spikes.

1

P-channel reverse-polarity MOSFET, Infineon IRF4905PBF

−55 V P-MOSFET

A low-loss reverse-battery protection switch for the 19 volt input.

1

5.1 V 6 A synchronous buck converter, Texas Instruments TPS56637RPAR

5.1 V, 6 A

The switching regulator that converts protected 19 volt power into the high-current 5.1 volt computer rail.

1

Raspberry Pi 5, 16 GB

16 GB RAM, 1 TB storage

The single-board Linux computer that runs the projector and hand-tracking software.

1

TI LightCrafter Display 3310 / TIDA-080000 projector subsystem

Prebuilt 1080p DLP subsystem

The complete prebuilt 1080p DLP projector subsystem with its optical engine and driver electronics.

1

40 V protected high-side power switch, Texas Instruments TPS1H200AQPWPRQ1

19 V projector switch

A controlled switch that lets the ESP32 turn the 19 volt projector rail on and off.

1

Ultraleap Leap Motion Controller 2

USB 3.0

The USB hand-tracking camera that detects hands above the workbench.

1

TMP117 digital temperature sensor, Texas Instruments TMP117MAIDR

I²C temperature sensor

A small sensor that lets the controller detect enclosure temperature.

1

Green status LED, Kingbright WP7113SGD

Green

A green light that shows the controller has enabled the projector.

1

220 ohm LED series resistor, Yageo RC0603FR-07220RL

220 Ω

The resistor that limits current through the green status light.

1

3.3 V 1 A low-noise LDO, Texas Instruments TPS7A8101DRBR

3.3 V, 1 A

The quiet regulator that provides 3.3 volt logic power for the controller and temperature sensor.

Assemble it in 6 steps

1. Mount the protected power carrier

Mount the custom power carrier on insulated standoffs inside the workbench. Keep the locking DC barrel connector at the enclosure edge, and use a regulated 19 V supply rated for at least 8 A; its centre pin goes to VIN+ and its outer sleeve goes to GND.

  • Keep the input TVS diode and reverse-polarity MOSFET physically close to the barrel connector so a surge or accidental reversed supply is stopped before it reaches the rest of the bench.
  • Use wide copper or short, thick wire for the 19 V input and 5.1 V output paths.
  • Do not connect the 19 V input to the Raspberry Pi or Leap Motion 2; it can permanently damage 5 V equipment.
  • Do not bypass the TVS diode or reverse-polarity circuit: a wrongly connected supply can damage every connected board.

2. Connect the projector power path

Connect the protected 19 V output to the projector high-side switch, then connect the switch output to the TI LightCrafter Display 3310 projector subsystem 19V_IN terminal. Connect the projector ground terminal to the same GND return. The switch input is ESP_PWR_EN from ESP32 GPIO5, so the controller can turn the projector rail off if the enclosure gets too hot.

  • Keep the 19 V projector wires short and use wire sized for the projector supply current.
  • Leave the projector's original power connector and internal driver board intact.
  • Make sure the projector 19V_IN and GND terminals are not swapped — swapped power can damage the projector board.
  • Do not power this projector subsystem from the 5.1 V rail; it requires its own 19 V input.

3. Power the Raspberry Pi and hand sensor

Connect the regulated 5.1 V output to a USB-C power-input cable or certified USB-C power board feeding the Raspberry Pi 5 USB-C power connector. Use the Pi's blue USB 3 port and a short USB 3 Type-A cable/header for the Leap Motion 2: VBUS is 5.1 V (power), GND is ground, and the SuperSpeed pairs plus D+ and D− carry data.

  • Use a low-resistance USB-C power lead; voltage drop in a thin or long cable can make the Pi show an undervoltage warning.
  • Keep the Leap Motion cable away from the buck inductor and projector power wires.
  • Do not feed the Pi through its GPIO header for this design; use its USB-C power connector so the Pi can manage USB power correctly.
  • Do not connect or disconnect the USB 3 cable while the connector is carrying loose, exposed power wiring.

4. Connect the picture cable

Run a short shielded micro-HDMI-to-HDMI cable from Raspberry Pi micro-HDMI port 0 to the intact HDMI input on the TI projector subsystem. The named pair HDMI0_CLK_P/N carries the clock and HDMI0_D0_P/N is one video data pair; the cable also carries the remaining HDMI pairs, control wires, shields, and ground required for a working link.

  • Use a certified short HDMI cable rather than hand-wiring HDMI differential pairs; this prevents picture dropouts caused by signal reflections.
  • Route the HDMI cable separately from the 19 V projector wiring.
  • Do not attempt to connect only the named HDMI pairs; a complete shielded HDMI cable is required for reliable 1080p video.
  • Do not crush or sharply bend the HDMI cable; damaged high-speed wires can cause a blank or flickering picture.

5. Install the temperature monitor and status light

Mount the TMP117 where it measures warm enclosure air, not directly on the projector heat sink. Connect V+ to 3V3_LOGIC (power), GND to GND (ground), SDA to ESP32 GPIO8 (data), and SCL to ESP32 GPIO9 (clock). Connect ESP32 GPIO4 through the 220 Ω resistor to the long LED leg, then connect the flat-side LED leg to GND; the light shows that projector power is enabled.

  • Place the TMP117 near the projector exhaust path but out of direct hot-air contact, so it reacts to enclosure temperature rather than a single metal surface.
  • The LED's longer lead is positive; the flat side of its body marks the negative lead.
  • Make sure V+ and GND are not swapped on the TMP117 — swapped power can damage the sensor.
  • Never connect the LED directly to GPIO4; the 220 Ω resistor limits current and protects the LED and ESP32 pin.

6. Inspect before applying power

With power unplugged, check that all GND connections share one return, that the 19 V projector branch cannot touch the 5.1 V Pi branch, and that every IC supply location has its nearby 100 nF and 10 µF ceramic capacitors fitted. Then plug in the 19 V supply, confirm the Pi receives 5.1 V through USB-C, and only then connect the Leap Motion 2 and HDMI cable.

  • Use a multimeter first: check approximately 19 V at the projector input path, 5.1 V at the Pi power lead, and 3.3 V at the TMP117 before attaching the boards.
  • Keep the projector ventilation openings clear during use.
  • Stop immediately if a wire, connector, or board becomes hot; unplug the 19 V supply before investigating.
  • Do not look into the projector lens at close range while it is operating.

Review all connections

1. Connections between "dc_input" and "ESP32"

Functiondc_inputESP32
powerVIN+ → P-channel reverse-polarity MOSFET, Infineon IRF4905PBF SEXT
groundGNDGND

2. Connections between "tvs_input" and "ESP32"

Functiontvs_inputESP32
powerK → P-channel reverse-polarity MOSFET, Infineon IRF4905PBF SEXT
groundAGND

3. Connections between "reverse_mosfet" and "ESP32"

Functionreverse_mosfetESP32
powerD → 5.1 V 6 A synchronous buck converter, Texas Instruments TPS56637RPAR VINEXT
groundGGND

4. Connections between "buck_5v1" and "ESP32"

Functionbuck_5v1ESP32
powerVOUT5V
groundGNDGND
powerEN5V

5. Connections between "logic_ldo" and "ESP32"

Functionlogic_ldoESP32
powerIN5V
powerOUT3V3
groundGNDGND

6. Connections between "pi5" and "ESP32"

Functionpi5ESP32
powerUSB-C 5V IN5V
groundGNDGND
dataHDMI0_CLK_P → TI LightCrafter Display 3310 / TIDA-080000 projector subsystem HDMI_CLK_PEXT
dataHDMI0_CLK_N → TI LightCrafter Display 3310 / TIDA-080000 projector subsystem HDMI_CLK_NEXT
dataHDMI0_D0_P → TI LightCrafter Display 3310 / TIDA-080000 projector subsystem HDMI_D0_PEXT
dataHDMI0_D0_N → TI LightCrafter Display 3310 / TIDA-080000 projector subsystem HDMI_D0_NEXT
dataUSB3_SS_TX_P → Ultraleap Leap Motion Controller 2 SS_RX_PEXT
dataUSB3_SS_TX_N → Ultraleap Leap Motion Controller 2 SS_RX_NEXT
dataUSB3_SS_RX_P → Ultraleap Leap Motion Controller 2 SS_TX_PEXT
dataUSB3_SS_RX_N → Ultraleap Leap Motion Controller 2 SS_TX_NEXT
dataUSB2_DP → Ultraleap Leap Motion Controller 2 D+EXT
dataUSB2_DN → Ultraleap Leap Motion Controller 2 D-EXT

7. Connections between "projector_switch" and "ESP32"

Functionprojector_switchESP32
powerVS → P-channel reverse-polarity MOSFET, Infineon IRF4905PBF DEXT
powerOUT → TI LightCrafter Display 3310 / TIDA-080000 projector subsystem 19V_INEXT
groundGNDGND
digitalINGPIO 5

8. Connections between "projector_evm" and "ESP32"

Functionprojector_evmESP32
groundGNDGND

9. Connections between "leap_motion_2" and "ESP32"

Functionleap_motion_2ESP32
powerVBUS5V
groundGNDGND

10. Connections between "temp_sensor" and "ESP32"

Functiontemp_sensorESP32
powerV+3V3
groundGNDGND
i2cSDAGPIO 8
i2cSCLGPIO 9

11. Connections between "status_led_resistor" and "ESP32"

Functionstatus_led_resistorESP32
digital1GPIO 4
digital2 → Green status LED, Kingbright WP7113SGD AEXT

12. Connections between "status_led" and "ESP32"

Functionstatus_ledESP32
groundKGND

Deploy the firmware

#include <Arduino.h>
#include <Wire.h>


// Forward declarations
void setProjectorPower(bool on);
bool readTemperatureC(float &temperatureC);

constexpr int ESP_PWR_EN = 5;
constexpr int STATUS_LED_PIN = 4;
constexpr int I2C_SDA_PIN = 8;
constexpr int I2C_SCL_PIN = 9;
constexpr uint8_t TMP117_ADDRESS = 0x48;
constexpr uint8_t TMP117_TEMP_REGISTER = 0x00;
constexpr float PROJECTOR_TRIP_C = 60.0F;
constexpr float PROJECTOR_RESTART_C = 52.0F;
constexpr uint32_t SAMPLE_INTERVAL_MS = 1000;

bool sensorAvailable = false;
bool projectorEnabled = false;
uint32_t lastSampleMs = 0;

void setProjectorPower(bool on) {
  projectorEnabled = on;
  digitalWrite(ESP_PWR_EN, on ? HIGH : LOW);
  digitalWrite(STATUS_LED_PIN, on ? HIGH : LOW);
}

bool readTemperatureC(float &temperatureC) {
  Wire.beginTransmission(TMP117_ADDRESS);
  Wire.write(TMP117_TEMP_REGISTER);
  if (Wire.endTransmission(false) != 0) {
    return false;
  }

  if (Wire.requestFrom(TMP117_ADDRESS, static_cast<uint8_t>(2)) != 2) {
    return false;
  }

  int16_t rawTemperature = static_cast<int16_t>(
      (static_cast<uint16_t>(Wire.read()) << 8) | Wire.read());
  temperatureC = rawTemperature * 0.0078125F;
  return true;
}

void setup() {
  pinMode(ESP_PWR_EN, OUTPUT);
  pinMode(STATUS_LED_PIN, OUTPUT);
  setProjectorPower(false);

  Serial.begin(115200);
  Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);

  float initialTemperatureC = 0.0F;
  sensorAvailable = readTemperatureC(initialTemperatureC);
  if (sensorAvailable) {
    setProjectorPower(true);
    Serial.println("Temperature monitor ready; projector rail enabled.");
  } else {
    Serial.println("TMP117 not found; projector rail remains disabled.");
  }
}

void loop() {
  if (!sensorAvailable || millis() - lastSampleMs < SAMPLE_INTERVAL_MS) {
    return;
  }
  lastSampleMs = millis();

  float temperatureC = 0.0F;
  if (!readTemperatureC(temperatureC)) {
    setProjectorPower(false);
    Serial.println("Temperature reading failed; projector rail disabled.");
    return;
  }

  Serial.printf("Enclosure temperature: %.1f C\n", temperatureC);
  if (projectorEnabled && temperatureC >= PROJECTOR_TRIP_C) {
    setProjectorPower(false);
    Serial.println("Overtemperature: projector rail disabled.");
  } else if (!projectorEnabled && temperatureC <= PROJECTOR_RESTART_C) {
    setProjectorPower(true);
    Serial.println("Temperature recovered: projector rail enabled.");
  }
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace, diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik