VF ← All work
PHYSICAL UI · AI · CONCEPT PROTOTYPE · 2026

Drug
Dozy

A smart pill organiser that reads the physical act of taking medication — and an AI layer that rates it normal, risky or uncertain without ever deciding for the person.

ROLE
Interaction Design · Prototyping
TYPE
Physical device concept
CONTEXT
CS coursework · Physical Interface
TOOLS
Figma, Wokwi, Raspberry Pi Pico + MicroPython, HTML/CSS/JS
DRUG DOZYTOP VIEW
MORNING
08:00
NOON
13:00
EVENING
19:00
NIGHT
22:00
◉ ENCODER + “TAKEN”♪ BUZZER
EVENING pulses → open → verdict → feedback
01 / CONTEXT & PROBLEM

Older adults rarely get the dose wrong. They get the sequence and timing wrong.

They open the wrong compartment, take a dose twice “just in case”, or skip it and can’t recall whether they took it. A normal pill box senses none of this; a medical app demands screen attention that isn’t there in the moment. What’s needed is a physical object that understands the interaction itself — and responds clearly, without becoming a box that decides for the person.

N
Nina, 72
Primary user
Takes 4 medications, 4 times a day.
Reduced vision and motor control — can’t read small text.
Barely uses a smartphone. Main pain: “did I already take it?”
O
Olia
Daughter · caregiver (secondary)
Notified only about a risk or a missed dose — not every dose.
Doesn’t want to check every intake by hand.
Wants peace of mind, and to step in only when needed.
HAPPY PATH · normal
  1. 19:00 — evening intake time.
  2. The “Evening” compartment pulses with light + a soft sound.
  3. Nina opens the highlighted compartment.
  4. Right compartment, right window → green confirmation, dose logged.
RISKY · wrong compartment

At 19:00 “Morning” is opened instead of “Evening”. The AI sees wrong_slot + a large time delta → RISK_WARNING, and asks for confirmation rather than hard-blocking.

UNCERTAIN · repeat

40 s later the same compartment is opened again. She may have forgotten she already took it → CONFIRMATION_REQUIRED: “You already took this. Take it again?”

02 / THE LAWS BEHIND THE BUTTONS

The AI should ask — never decide silently. Every choice here follows a known interaction-design law.

Naming a law is easy. Below, each one is small print — the weight is on the exact decision it shaped in Drug Dozy, with the state, number or test result that proves it.

LAW 01 Visibility of system status

Always show the current state.

HOW I APPLIED IT

At 19:00 the EVENING lid physically pulses — light plus a soft buzzer tone — and the device ring carries one colour per state: amber “reminding”, purple “Checking…”, green “taken”. Nina reads status with no screen at all.

REMINDER_PENDING → LED pulse + tone
LAW 02 Doherty Threshold

Keep response fast and, above all, steady.

HOW I APPLIED IT

I pinned RISK_EVALUATION to a fixed ~1.5 s and captioned it “Checking…”. My usability test proved why it matters: when that time drifted, people tapped again — so the top P0 change I logged was a steady timer with a progress cue.

≈1.5 s fixed · P0 fix from testing
LAW 03 Hick’s Law

More options, slower decisions.

HOW I APPLIED IT

Of four compartments, only the one that’s due lights up; the other three stay dim. At intake time there is exactly one obvious action — nothing to read, nothing to choose between.

1 of 4 lit at a time
LAW 04 Fitts’s Law

Bigger, closer targets are faster and safer to hit.

HOW I APPLIED IT

The hit targets are the physical lids themselves, plus oversized “Yes / Cancel” buttons on the device. Testing with a reduced-vision participant pushed me to enlarge and boost their contrast further — logged as a P1 change.

Full lids + P1 · larger buttons
LAW 05 Recognition over recall

Don’t make people remember; let them recognise.

HOW I APPLIED IT

The box remembers “did I take it?” for her. Re-open the same compartment within 60 s and it asks “You already took this — take it again?” instead of leaning on Nina’s memory. Try it in the demo below.

repeat_open < 60 s → CONFIRM
LAW 06 Error prevention & recovery

Prevent slips; when they happen, offer a way back.

HOW I APPLIED IT

A wrong compartment never hard-blocks. It flows RISK_WARNING → CONFIRMATION_REQUIRED, and “Cancel” returns to REMINDER_PENDING — the dose simply isn’t counted. An error is a fork, never a dead end.

wrong slot → ask → back, never blocked
LAW 07 Natural mapping

Match controls to the real world.

HOW I APPLIED IT

Four physical compartments map one-to-one to MORNING / NOON / EVENING / NIGHT, laid out top-left to bottom-right in reading order. The layout is the schedule — there is nothing to decode.

4 lids = 4 times of day
LAW 08 Graceful degradation

When the smart layer fails, the core must keep working.

HOW I APPLIED IT

Flip “AI offline” in the live demo: the device drops to SAFE_MODE and the on-board RTC still reminds on schedule. The base safety of intake never depends on the cloud or the AI.

SAFE_MODE · try it in the demo ↓
03 / STATE LOGIC

Twelve states. Rules first, AI only for the grey zone.

IDLE REMINDER_PENDING GUIDED_OPEN RISK_EVALUATION → branch: normal risky uncertain
IDLE

Calm. Waits for the time trigger, dim light.

REMINDER_PENDING

It’s time: the active compartment pulses + soft sound.

GUIDED_OPEN

The highlight guides the hand to the correct lid.

RISK_EVALUATION

The AI rates the sequence: normal / risky / uncertain.

OPEN_CORRECT

Right compartment in window — green confirmation.

OPEN_WRONG_COMPARTMENT

A different intake was opened — enters risk evaluation.

RISK_WARNING

Red signal: the action looks risky, attention needed.

CONFIRMATION_REQUIRED

Unsure — asks the person to confirm intent.

MISSED_DOSE

Reminder ignored past grace — a miss is recorded.

SAFE_MODE

AI/network unavailable — only the base rule reminder.

MANUAL_OVERRIDE

The person controls directly; dose marked manually.

SYNC_LOG

Event (without PII) written to the local log.

Safe mode

Not “the system shut down”, but deliberate safe behaviour: a simple time-based reminder stays. The screen says “Running without AI — reminding on schedule.”

Manual override

The “Taken manually” button is available in any state. The person can always record a dose themselves; the log stores manual_confirmed: true.

Error recovery

An error is never a dead end. After a warning or a failed confirmation, the system returns to a clear state and explains the next step instead of silently blocking.

Logic table — input → check → decision → action

Input (event) Check Decision Action (state + feedback)
reminder_time(evening)RTC timer, no AItriggerREMINDER_PENDING · pulse + sound
lid_opened(evening)rule: right slot + windownormalOPEN_CORRECT · green, logged
lid_opened(morning) @19:00AI: wrong_slot, Δ −660risky ≈ 0.91RISK_WARNING → CONFIRMATION
multiple_slots <10sAI: unusual_sequenceuncertain ≈ 0.58CONFIRMATION · amber
lid_opened(evening) +40srule: cooldown/debounceuncertain“Already took this. Again?”
reminder_ignored > gracerule: minutes elapsedmissedMISSED_DOSE · notify daughter
confirm_pressedperson confirmed intentoverrideMANUAL_OVERRIDE → OPEN_CORRECT
ai_unavailable / offlinegate: health-check failedfallbackSAFE_MODE · base reminder
manual_override (anytime)person controls directlyoverrideMANUAL_OVERRIDE · dose marked
04 / PHYSICAL PROTOTYPE

The organiser as a physical object.

SENSORS (INPUT)
reed × 4magnetic sensor for each lid opening
RTC DS3231accurate time → intake-time trigger
encoder+btnmanual confirmation / override
ToF (opt.)presence near the organiser
ACTUATORS (FEEDBACK)
WS2812 × 4RGB highlight (green / amber / red)
buzzersound patterns: reminder / error
vibro (opt.)haptic pattern for reduced hearing
enclosure~14×14×5 cm, 3D-printed (PLA); each compartment a hinged lid with a magnet.

Bill of materials — estimated budget ≈ €28

Raspberry Pi Pico W€7
RTC DS3231€2
Reed sensors + magnets ×4€2
WS2812 RGB LED ×4€1.5
Piezo buzzer€0.5
Encoder + button€2
Li-ion 18650 + TP4056€5
3D-printed enclosure (PLA)€6
Wires, small parts€2

Six scenario frames: what the person sees

01 IDLE

Dim, waiting for the time.

02 REMINDER

Compartment pulses + sound.

03 GUIDED

A hand reaches the lit lid.

04 CHECKING

Purple: system evaluating.

05 CORRECT

Green: dose counted.

06 WARNING

Red + clarify: wrong slot.

05 / AI ROLE & ARCHITECTURE

The AI has a limited, justified role. It rates behaviour — it never reads medicine.

Its input is a short structured event (expected slot, opened slot, time delta, opens in 10 min, whether there was a miss); its output is one of three verdicts with a confidence and a reason. Rule gates run BEFORE the AI; it only runs when the case isn’t trivially right or wrong. On low confidence it asks the person — it never secretly decides.

normal

Confirms quietly, green.

risky

Warns + requires confirmation.

uncertain

Asks — doesn’t decide alone.

ARCHITECTURE — EDGE-FIRST

“Edge” means the logic runs on the device itself — locally and offline — instead of in the cloud.

EDGE LEVEL
RTC trigger · reed reading · LED/buzzer feedback · SAFE_MODE (rule-only) · local event log
AI LEVEL
lightweight classifier · local or Node-RED/Python · normal/risky/uncertain + confidence + reason · runs after the gates
EVENT LOG
events + timestamps + risk ratings. NO medication names, NO diagnoses.
CAREGIVER
push only for MISSED_DOSE / repeated RISK — not every dose.
EVENT CONTRACT — schema v1
message schema v1
{
  "schema_version": "v1",
  "event": "COMPARTMENT_OPENED",
  "expected_slot": "EVENING",
  "opened_slot": "MORNING",
  "time_delta_min": -660,
  "open_count_last_10_min": 2,
  "ai_result": "risky",
  "confidence": 0.91,
  "reason": "wrong_slot_and_unusual_sequence",
  "action": "RISK_WARNING",
  "fallback": false
}

Privacy & security — a threat per risk, a mitigation per threat

Medication-intake data is sensitive, so each threat gets a concrete mitigation — not just “encrypt everything”.

R1 · data sensitivity

The log stores only slot-id + time + risk rating. No medication names, dosages or diagnoses — data minimisation.

R2 · cloud / transfer

Edge-first — all base logic on the device. Sync is optional, anonymised, over TLS. Offline it’s fully functional.

R3 · caregiver disclosure

Explicit consent at setup; the push carries the minimum — “evening intake missed”, no medication details.

R4 · physical access

The log is anonymised and low-value alone; the key stays on-device, retention limited (~30 days) with auto-purge.

R5 · AI false positives

Thresholds + a confirmation step, no auto-escalation; escalation only on repeated risk or a miss.

R6 · user control

The right to view and delete the log, and to turn off caregiver notifications and sync at any time.

06 / INTERACTIVE PROTOTYPE

Click — the state machine really runs.

Pick the active time of day, fire the reminder and open a compartment. The verdict and confidence are computed deterministically by the rules above. Try the five scenarios in the hints.

SAFE_MODE · offline. The AI layer is unavailable — only the base rule reminder runs. Risk rating is off, control stays with the person.
{{ deviceName }} {{ clockText }} · expected {{ expectedLabel }}
{{ ledIcon }}
{{ displayMain }}
{{ displaySub }}
confidence · {{ aiResult }}{{ confPct }}%
reason: {{ reasonText }}
CONTROLS
Active time:
WHAT THE AI SEES (INPUT)
expected
{{ aiExpected }}
opened
{{ aiOpened }}
Δ min
{{ aiDelta }}
opens/10m
{{ aiOpens }}
missed
{{ aiMissed }}
result
{{ aiResult }}
last event → log live
{{ eventJson }}
CAREGIVER (OLIA)
{{ caregiverText }}
RECENT EVENTS
{{ l.t }}{{ l.text }}
① normal
Time “Evening” → “It’s intake time” → open Evening.
② risky
Time “Evening” → open Morning → RISK_WARNING.
③ uncertain
Open the correct compartment twice in a row.
④ missed
“It’s intake time” → “Ignore” → MISSED_DOSE.
⑤ offline
Turn on “Offline” → open a compartment → rule flow.
07 / TESTING & EVALUATION

Usability test with 3 people — no explanations given.

Each participant got 4 tasks (normal intake, wrong compartment, repeat, offline) and had to act with no instruction. I recorded success, time, errors, repeats and whether they understood the state.

Participant Success Time Wrong opens Repeats Understood? Confidence
Mari4/4~7 s00yes5
Pavlo4/4~12 s10partly4
Sashko3/4~18 s21partly3
LATENCY · JITTER · CONSISTENCY

A ~1.5 s average delay is fine on its own. The key thing: when RISK_EVALUATION occasionally took longer, people started pressing again. It’s not the average but the variability of response (jitter) that most destroys the sense of control — so the evaluation time must stay steady, even if that means showing progress.

5 key insights

01Purple RISK_EVALUATION with no caption reads as an error — it needs “Checking…”.
02People want a tactile response to touch, not light alone — vibro/click matter for older adults.
03CONFIRMATION_REQUIRED is clear, but the Yes/Cancel buttons need to be larger and higher-contrast.
04No one read offline mode as “broken” — the SAFE_MODE banner worked, trust held.
05Steady evaluation time matters more than speed: jitter → repeated presses.

Prioritised changes for v2

P0Caption RISK_EVALUATION + a steady evaluation time with progress (remove jitter).
P1Add a tactile click/vibro to every opening and confirmation.
P1Enlarge the confirmation buttons, raise contrast for reduced vision.
P2Add a “guest” mode for the caregiver: a short intake history on her phone.
WHAT I LEARNED

For a home medical PUI, the value of AI isn’t intelligence — it’s removing doubt while leaving control with the person.

The AI should ask, not decide silently — that’s the main ethical line, and it’s what earns trust.

Physical feedback (light + sound + touch) reads faster than any screen — the whole product rests on it.

Privacy by default: a log without medication names is both enough and safe. Predictability beats “magic”.

LIKE WHAT YOU SEE?

Let’s design a device people trust.

Start a project →
NEXT PROJECT
Mocktail Finder