Make_Flora: A Valentine’s Installation That Plays Music When You Show It Flowers
Botanical Music — hear the melody of every bloom. For Valentine’s, we built an interactive installation that combines computer vision, floriography (the language of flowers), and hardware. Show a rose and the speaker plays one tune; show a bouquet and it plays another. A pulsing heart, driven by an op-amp, grows and shrinks with the moment.
Concept: We wanted something romantic and playful for Valentine’s — an experience that feels like flowers talking through music. Walk up with a rose, and the system recognizes it and plays a song. A separate ESP32 drives an I2S speaker, and an op-amp circuit controls a heart that pulses — bigger when there’s a flower in view, smaller when there isn’t.
Tech Stack: Camera: ESP32-CAM with MJPEG stream Detection: Roboflow serverless workflows (find-roses, find-cluster-of-flowers) Backend: Python, Flask, OpenCV, MjpegStreamReader Frontend: React, Vite, ReactPlayer (optional) Speaker: ESP32 with I2S DAC/amp and sine-wave synthesis Heart: Custom-built second-stage op-amp circuit with Miller compensation, using PWM or analog envelope for size control
Flow: Step 1: Point the ESP32-CAM at a flower or bouquet. Step 2: The PC pulls frames and sends them to Roboflow, receiving bounding boxes in return. Step 3: The server returns { "name": "Rose" } or { "name": "Flower Cluster" } through the /detection endpoint. Step 4: The speaker ESP32 polls that endpoint and maps results: Rose plays song 1, Flower Cluster plays song 2, and no detection produces silence. Step 5: The frontend displays live video with bounding boxes and floriography text. Step 6: The op-amp heart grows or shrinks based on detection intensity or a derived control signal.
Floriography: Rose: Roses symbolize love, passion, and beauty. The red rose speaks the language of the heart. In floriography, a single rose means “I love you still.” Flower Cluster: A gathering of blooms speaks of abundance, joy, and the beauty of nature in full expression.
Challenges and Learnings: Speaker static: HTTP polling blocked the main loop. Moving detection polling to a FreeRTOS task on another core kept the audio loop smooth. IP addresses: The ESP32-CAM, PC, and speaker ESP32 must share the same subnet. We set DETECTION_SERVER and CAMERA_SOURCE to the PC and camera IPs. MJPEG on Windows: cv2.VideoCapture was unreliable with ESP32 streams. A custom MjpegStreamReader that parses multipart boundaries worked better.
Valentine’s Twist: The heart circuit, driven by an op-amp and wired to grow or shrink with detection, turns the installation into a Valentine’s piece. The heart pulses when flowers are in view and settles when they’re gone. It’s a small analog detail that ties the whole experience together.
Built for Valentine’s — flowers, music, and a heart that listens.

Log in or sign up for Devpost to join the conversation.