Fried Rice Master
A phygital cooking game where a circuit board becomes the frying pan
Fried Rice Master turns an Adafruit Circuit Playground Express (CPX) into the handle of a frying pan. Press its buttons to add ingredients, then toss the board to stir-fry them on screen until the rice turns golden.
I built it solo: the concept, the board’s MakeCode program, and the p5.js game, with Gemini as a coding partner along the way.
Role
Solo: concept, hardware & code
Tools
Circuit Playground Express, MakeCode, p5.js, Gemini
Context
Course project, UW MHCI+D
Year
2025
The full loop in 40 seconds: add ingredients, toss, serve.
Idea
Plugged in, the board already looked like a pan
The concept came from the hardware itself. With its USB cable attached, the round CPX looks and feels just like a frying pan on its handle.
That sparked a “phygital” (physical + digital) fried-rice game where the controller defines the experience.

How it works
Two buttons and a toss
The CPX acts as a USB keyboard. Each input types a short command (RICE, EGG, COMBO or TOSS) that the p5.js game listens for.

Step 1
Add ingredients
Button A adds rice, B adds eggs, and A+B add shrimp and green onion. The LED ring lights up to match.

Step 2
Toss to cook
The accelerometer detects each toss. The ingredients fly up and mix, and the rice browns as their cooked level rises.

Step 3
Serve
Once the rice reaches perfect browning, a procedurally generated plate of golden fried rice appears.
Under the hood

On the board (MakeCode): every input types a command; button presses also light the LED ring.

On screen (p5.js): the sketch reads each command and runs the pan physics.
Challenges
Firmware fights, and a feature I had to cut
The vibe-coding trap
I started with pure vibe coding. Gemini suggested CircuitPython, but its knowledge was out of date for the current CPX libraries. The version mismatch caused constant crashes (the blinking red light of death), and about 60% of my time went to debugging firmware. Switching to MakeCode solved in minutes what had taken hours to fail in Python.
A microphone that heard every click
I wanted a “blow to put out the flame” feature, but pressing the buttons physically triggered the board’s microphone. When I raised the sound threshold in code, the CPX disconnected and the program failed to download. I cut the feature to save the project.
Learnings
AI moves fast, but I still decide when to change course
01
Pivot fast
When a tool isn’t working, don’t sink more time into it. Rapid iteration means being willing to abandon a broken path right away, and knowing when to do that still takes human judgment.
02
AI knowledge has an expiration date
Gemini’s training data on hardware libraries wasn’t current. With firmware, I now double-check any version an AI suggests.
03
Prompt for polish, hand-edit the layout
AI generated the procedural rice art with almost no errors, but kept overlapping the text and progress bar. For spatial UI tweaks, reading and editing the code myself was faster than prompting.
UMI CHEN
Product Designer
© 2026 UMI CHEN

