Community project
Interactive Projector Workbench
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

Gather all the parts
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"
2. Connections between "tvs_input" and "ESP32"
3. Connections between "reverse_mosfet" and "ESP32"
4. Connections between "buck_5v1" and "ESP32"
5. Connections between "logic_ldo" and "ESP32"
6. Connections between "pi5" and "ESP32"
7. Connections between "projector_switch" and "ESP32"
8. Connections between "projector_evm" and "ESP32"
9. Connections between "leap_motion_2" and "ESP32"
10. Connections between "temp_sensor" and "ESP32"
11. Connections between "status_led_resistor" and "ESP32"
12. Connections between "status_led" and "ESP32"
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.




