01 System overview
Five subsystems work together around an ATtiny84A microcontroller: a proximity subsystem (UWB RF), a confirmation subsystem (pressure), an alarm (piezo speaker), control & processing (the state machine), and a power chain. I owned the PCB layout, the key-fob board, and the proximity + pressure subsystems.
02 Sensing: RF + force fusion
- Ultra-wideband ranging โ paired DWM1000 modules (one in the dish, one on the fob) measure separation by time-of-flight over SPI, detecting the fob out to ~15 ft.
- Force sensing โ an FSR 406 force-sensing resistor in a voltage-divider feeds the MCU's ADC, registering the slight weight of keys in the dish.
- Combining "keys present" (force) with "user nearby" (RF) is what lets the device fire only when you're home and haven't put your keys down.
03 Control: a four-state machine
Sleep
Keys detected in the dish by the pressure pad โ nothing to do.
Timer
Keys removed; wait 2โ4 minutes before arming proximity, so it doesn't nag you before you've left.
Waiting
Watch the RF range; if the fob stays inside the radius for 30โ90 s, escalate.
Alarm
Sound the piezo until keys are placed (back to sleep) or the snooze button is pressed.
04 Hardware engineering
On the power side I sized an LM1117 LDO to step a 12 V supply down to 3.3 V and ran a thermal tolerance analysis โ the worst-case junction temperature lands at ~84 ยฐC, comfortably under the 150 ยฐC limit. For ranging accuracy I analyzed DWM1000 antenna-delay calibration: the uncalibrated 3-ฯ delay spread corresponds to ~30 cm of error, which calibration cuts to roughly 4.5 cm โ essential for a reliable proximity trigger. Everything was laid out on a custom PCB.