Overview
Stay connected across any distance with these WiFi-enabled LED touch lights. Touch your lamp, and your partner's lights up too—an instant, a powerful way to show you're thinking of them from anywhere in the world.
This project was inspired by commercial Filimin lamps, but built from scratch at a fraction of the cost. Filimin lamps are essentially built in the exact same way as these DIY lamps. They use a custom PCB with an ESP and originally used the same conductive paint for the touch surface. A pair of these DIY lamps costs around ~$50 to build, compared to $150+ for Filimin lamps.
How It Works
The lamps communicate over WiFi using MQTT, a lightweight messaging protocol designed for IoT devices. The outside of the lamp is covered in a black geometric pattern that is actually conductive paint. This paint forms a large capacitive touch sensor that can detect proximity. When you touch the lamp:
- The conductive paint detects the touch via capacitive sensing
- Your lamp changes color and broadcasts its new color over MQTT
- All paired lamps receive the message and light up in the same color
Unlike the original Filimin prototype which polled a server, MQTT provides instant synchronization with no perceptible latency. Wherever the lamps are in the world, they update simultaneously. Adafruit IO is used as the MQTT broker.
Parts List
| Component | Purpose |
|---|---|
| WeMos D1 Mini | Inexpensive WiFi-capable Arduino |
| 16 LED Neopixel Ring | RGB LEDs |
| Bare Conductive Paint | Capacitive touch surface |
| 3.5" Square Wooden Plaque | Base |
| 12" x 12" x 1/8" Acrylic Sheet | Diffuser (enough for 1 lamp) |
| 470kΩ Resistor | Touch sensing circuit |
| USB Power Supply | Power |
| Black Spray Paint | Finish |
| Acrylic Cement #16 | Assembly |
Technical Details
The firmware leverages several key libraries:
- PubSubClient: MQTT client for real-time message passing
- WifiManager: Creates an access point for easy WiFi configuration
- Neopixel: Addressable LED control
- CapacitiveSensing: Touch detection using the conductive paint
The WifiManager library is particularly useful—if the lamp ever disconnects from its WiFi network, it automatically creates an access point. Users can connect to this AP from their phone and select a new network from a list, making the lamps easy to set up without any code changes.
A 470kΩ resistor is used for the capacitive sensing circuit, which is the maximum value I found that works reliably with the 3.3V logic of the WeMos D1 Mini.
Assembly
Here are some photos of the assembly process:
Here are the rough steps for assembly:
- Paint the touch surface: Apply Bare Conductive Paint to the inside of the acrylic. A ziploc bag with a cut corner works better than the pens Bare Conductive sells. Attach a small jumper to each panel and let the paint dry.
- Create the base: Cut a hole through the center of the base and drill out a channel underneath the base for the WeMos to sit in.
- Solder the panels together: Solder the panel jumpers together to create a single large sensor.
- Mount the electronics: Glue the WeMos to the channel underneath the base, with the micro USB port flush with the back.
- Mount the Neopixel ring: Glue the Neopixel ring to the top of the base and route all wires through the hole in the base.
- Connect the touch sensor: Solder the combined panel jumper to a wire connected to a 470kΩ resistor and then to the WeMos.
- Assemble the enclosure: Use acrylic cement to bond the pieces together and attach the base to the acrylic diffuser.
