Projects

UART Transceiver in Verilog
A UART transmitter and receiver (8N1) written from scratch in Verilog, built from counters, shift registers and state machines, and verified with a self-checking loopback testbench in Icarus Verilog.
- Full 8N1 serial link in Verilog: a parameterised baud generator, a transmitter and a receiver
- Receiver uses 16x oversampling and a two-flop synchroniser to sample every bit at its centre
- Self-checking loopback testbench: 13 bytes, including a back-to-back burst, all received with zero errors
- Found and fixed a start-bit timing bug that shifted every sample half a bit early

ESP32 Vitals Monitor
An ESP32 reading heart rate, SpO2, body temperature, and a single-lead ECG, serving its own live dashboard over WiFi from a self-hosted access point; no router, app, or internet connection needed.
- A self-contained vitals monitor: heart rate, SpO2, body temperature, and a single-lead ECG all read from one ESP32
- Serves its own live dashboard straight from the board over WiFi, no router, app, or internet connection needed
- Plots a live, adjustable ECG waveform on the dashboard, not just a single heart-rate number
- Timestamps every ECG sample as it arrives in the browser, so the trace stays accurate even if the WiFi send rate drifts

ESP32 Stabilised Spoon for Parkinson's Disease
A self-levelling spoon for hand tremor: an ESP32 fuses MPU6050 accelerometer and gyro data to hold the spoon head level with two servos, correcting roll and pitch in real time.
- Built to counteract hand tremor from Parkinson's disease or essential tremor
- Complementary filter fuses MPU6050 accelerometer and gyro data into a stable roll/pitch estimate
- Two servos actively counter measured tilt in real time to hold the spoon head level
- Boot-time auto-calibration zeroes out mounting offset in about a second

ESP32 Bluetooth Speaker with FFT Spectrum Analyser and OLED
A Bluetooth speaker built around an ESP32: A2DP audio into a custom amp stage, with a live 16-band FFT spectrum and scrolling track info on an OLED.
- Live 16-band FFT spectrum on an OLED, computed straight off the incoming Bluetooth audio stream
- Log-spaced, self-calibrating frequency bands so quiet and loud tracks both stay readable
- Custom amp stage: resistor-divider into a PAM8403 class-D amp driving two 5W speakers
- Debounced volume and play/pause controls, with a mode button reserved for a planned AM radio source

Circuit Builder
A desktop circuit editor and simulator where users can sketch a schematic, wire it up, and watch it actually work in DC, transient, and frequency response.
- Constructed a nodal analysis solver for DC, transient, and AC
- Live Simulate mode shows the voltage at every terminal, updating as you edit the circuit
- Conduct Frequency response and make Bode plots, for each circuit
- Saves all files in a plain-JSON save format

EEE Lunar Rover
A WiFi-controlled rover that drives across a fake lunar surface, tasked to hunt down artificial rocks, and reads their signals and classify rocks.
- Awarded Best First Year Project 2026 at Imperial College London
- Designed, tested, and debugged the infrared and magnetic circuits, and soldered three of the four sensor boards
- Built a separate analogue circuits for each of the four sensors, then combined them onto one PCB
- 3D printed chassis with ackermann steering and attached the flags of the nationalities in the team
- Controlled and monitored live from a browser over WiFi

Operational Amplifier in LTSpice
Spent a few months teaching myself the internal layout of an OpAmp, then built one from scratch out of individual transistors in LTSpice.
- Learned and built every stage myself: differential pair, current mirrors, and a push-pull power stage
- Tested it by stepping the feedback resistor through four values and checking the gain against theory
- Measured gain matched the predicted Rf/Rin ratio almost exactly, even at ×1000

websiteproject
A personal Django site with a few small apps (accounts, file storage, a to-do list with email reminders, and more), which was self-hosted on a Raspberry Pi at home.
- Five small apps: accounts, file storage, to-do, random tools, server diagnostics
- File uploads can be edited and deleted, with validation on what's accepted
- To-do list emails you reminders on a schedule, via a custom management command
- Hosted it myself on a Raspberry Pi at home

Billiard Club
A full 2D pool game built from scratch in Python, complete with its own physics engine, an AI opponent, and a full menu system.
- Full 8-ball rules: turn tracking, fouls, potting, win detection
- Wrote my own physics engine for ball-to-ball and ball-to-wall collisions
- Bank-shot aim assist that projects the cue ball's path off the rails
- A basic AI opponent, plus Player vs Player and Sandbox modes

Pygame Games
A small collection of games built in Pygame while I was learning Python and game dev: a brick-breaker and a from-scratch Tetris.
- Ballz: an aim-and-fire brick-breaker with combo scoring and coin pickups
- Tetris: full piece rotation and row-clearing, built entirely from scratch

Digital Alarm Clock
A 24hr digital alarm clock I designed and built from scratch for a real client brief: a custom-etched PCB, crystal-accurate timekeeping, and a 3D-printed case.
- Crystal-accurate 24hr timekeeping, using a 32kHz oscillator and EEPROM storage
- Etched and soldered the PCB by hand, with its own dedicated voltage regulator
- 3D-printed PLA case with laser-cut acrylic faces (190×90×90mm, 500g)
- Designed end-to-end for a real client brief and tested against every spec point
Electronic Reaction Time Game
A reaction-time game built around LED chasers, with a custom PCB and a 3D-printed triangular enclosure I designed myself.
- LED chaser sequence: light travels along the strip and you react to stop it on target
- Custom PCB built around the CD4514BE demultiplexer
- Housed in a 3D-printed triangular enclosure I designed in CAD