Inspiration
Many of us learned CPR in high school but never practised the Heimlich maneuver. Around 6,000 Americans die from choking each year, the 4th leading cause of preventable injury death, and only about half of people know how to perform the Heimlich.
Heimlich training mannequins often cost up to $600. Cheaper instructor-worn vests are uncomfortable and don’t provide empirical feedback. We wanted the vest's affordability with a mannequin's realistic experience.
Our web app goes further, with feedback never seen before in Heimlich instruction. We approximate force in newtons, provide a placement heat map, implement pacing and sharpness checks for every hit, and grade scenarios that make training measurable.
What it does
Thrustworthy is an all-in-one Heimlich trainer. It is a sensor-equipped mannequin paired with a coaching web app.
Guided procedure: The app walks trainees through three scenarios of increasing severity:
• Effective cough: keep hands off and encourage coughing, then act fast when it fails.
• Severe choking: 5 back blows, then 5 abdominal thrusts, repeated.
• Unresponsive: CPR, graded on compression rate, chest recoil and hand placement in 30:2 cycles.
Real-time judgment: Every hit is scored on where it landed, how sharply force was delivered (slow pushes don't count), and pacing. Each scenario ends with a score and notes on what to fix.
Gemini voice coaching: With hands and eyes on the mannequin, trainees hear coaching aloud in a Gemini-generated voice: "Too high. Move down.", "Good. Three." They can also ask hands-free, e.g. "Gemini, where does my fist go?", and Gemini answers using their live scenario and recent hits, explaining their own mistakes.
Heat mapping: Multiple sensors combine into a live heat map of where force landed.
Rhythm skill check: An optional game where trainees match back blows, thrusts or compressions to moving beats.
How we built it
Sensing hardware: 9 force-sensitive resistors (FSR 402): 5 on the abdomen, 3 on the back, 1 on the sternum. 3D-printed plates spread each hit so off-centre presses still register, giving the heat map more spatial information. Each FSR sits in a voltage divider (2.2k ohm resistor) read by the microcontroller's ADC.
Microcontroller: An ESP32-S3 samples all 9 sensors every 5 ms and streams each sensor's latest and peak value every 20 ms over USB serial.
Web app: React + TypeScript, connecting to the ESP32 through the browser's Web Serial API and auto-reconnecting to a paired board.
• A spatial model turns sparse readings into a placement estimate and heat map.
• A press detector measures each hit's peak, duration and rise time, filtering out plate bounce and sensor bleed. Using the FSR datasheet, we can tell how many newtons the force is.
• Scenario-based models grade the cough, choking and CPR sequences.
AI pipeline: Gemini text-to-speech voices all coaching cues, pre-generated and cached for instant playback. Gemini Flash-Lite answers spoken questions, triggered by a "Gemini" wake word.
Challenges we ran into
A problem could live in hardware, firmware, the serial link or the web app.
• Once we were sure our code was broken, but a wire had simply snapped off, so we learned to rule out the physical layer first.
• FSR readings are far from linear, one saturated under hard hits, and the plates rebounded into false extra hits until we filtered them. Reliable voice recognition took several rewrites: browser speech recognition cuts off early, and the app had to avoid hearing its own voice.
Accomplishments that we're proud of
• A full working MVP for about 3-8 times less than a commercial Heimlich trainers' price.
• Heat mapping and good-hit judgment that hold up on the real mannequin, with thresholds tuned from our own test data.
• Judging more than location: rise time and pacing mean slow pushes and rushed hits don't count.
• A Gemini voice coach to enhance the experience beyond the web app.
• Graded cough, choking and CPR scenarios, plus a rhythm skill check. This ensures the student knows when it’s appropriate to perform Heimlich (if they are asphyxiating, then it’s CPR, etc).
What we learned
Calibrating the sensors was difficult. FSRs respond roughly logarithmically, so readings aren't proportional to force. We fit a power-law curve to estimate newtons and set thresholds from real presses at different strengths.
A single sensor can't tell you where a hit landed, only how hard. Location comes from comparing several, hence our plates and multiple pads per region. And impulse proved the wrong measure: a slow push has more impulse than a sharp one. How quickly force rises separates a real thrust from a push, so we measure that.
What's next for Thrustworthy
• More FSRs for finer heat mapping, especially under the chest for CPR hand placement.
• Computer vision to verify stance and hand position alongside the sensors.
• Load cells instead of FSRs: linear, accurate to about 1-2%, and they don't saturate. A plate on 3-4 load cells gives the exact centre of pressure: true force and position, not estimates.
• Validation with certified first-aid instructors, plus child and infant modes.
Built With
- arduino
- c++
- css
- electronic-prototyping
- esp32
- fsr-sensor
- google-gemini-api
- html
- javascript
- platformio
- react
- sensor-fusion
- typescript
- vercel
- vite
- web-serial-api
- web-speech-api

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