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

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
powerKP-channel reverse-polarity MOSFET, Infineon IRF4905PBF SEXT
groundAGND

3. Connections between "reverse_mosfet" and "ESP32"

Functionreverse_mosfetESP32
powerD5.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_PTI LightCrafter Display 3310 / TIDA-080000 projector subsystem HDMI_CLK_PEXT
dataHDMI0_CLK_NTI LightCrafter Display 3310 / TIDA-080000 projector subsystem HDMI_CLK_NEXT
dataHDMI0_D0_PTI LightCrafter Display 3310 / TIDA-080000 projector subsystem HDMI_D0_PEXT
dataHDMI0_D0_NTI LightCrafter Display 3310 / TIDA-080000 projector subsystem HDMI_D0_NEXT
dataUSB3_SS_TX_PUltraleap Leap Motion Controller 2 SS_RX_PEXT
dataUSB3_SS_TX_NUltraleap Leap Motion Controller 2 SS_RX_NEXT
dataUSB3_SS_RX_PUltraleap Leap Motion Controller 2 SS_TX_PEXT
dataUSB3_SS_RX_NUltraleap Leap Motion Controller 2 SS_TX_NEXT
dataUSB2_DPUltraleap Leap Motion Controller 2 D+EXT
dataUSB2_DNUltraleap Leap Motion Controller 2 D-EXT

7. Connections between "projector_switch" and "ESP32"

Functionprojector_switchESP32
powerVSP-channel reverse-polarity MOSFET, Infineon IRF4905PBF DEXT
powerOUTTI 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
digital2Green 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