$ █
krishna@embedded
────────────────────────
OS: Linux — Embedded Systems
Host: Custom Hardware
Role: Embedded Enthusiast & Hobbyist
Method: Spec-Driven AI Development
Shell: bash · PlatformIO · Claude
Focus: MCU · Automotive · Hardware
Status: ● learning in public
────────────────────────
$
$
I'm Krishna. Hobbyist, not a professional. This is less of a portfolio and more of a record — things I built because I was curious, because I needed them, or just because I wanted to see if I could.
“Most things here exist for pretty simple reasons — I wanted to know how something actually works, I needed it and nobody built it quite the way I wanted, or the idea just wouldn't leave me alone until I built it.”
No grand plan, no monetization strategy. Just problems I found interesting — and the strong suspicion that you don't really understand something until you've built it yourself.
My main thing is embedded systems — MCUs, real hardware, stuff you can actually hold and wire up. I like when code does something in the real world, not just on a screen. When a wrong decision means a bent connecting rod, you think more carefully.
▶ how I build things
I use what I'd call spec-driven AI development: I figure out exactly what needs to be built, how it should work, and what rules it absolutely cannot break — then I use AI to implement it. I design the system, pick the hardware, write the constraints. AI writes the C++.
I'm not going to pretend I write C++ or FreeRTOS from scratch. But I know exactly why every decision exists, I can debug at the logic level, and I understand what the system is and isn't allowed to do — including what happens physically when it gets it wrong. That part is fully mine.
Ignition Management System — MCU · Yamaha Vixion 150cc
A real-time ignition management system for a single-cylinder 4-stroke engine, built entirely out of curiosity about how ECUs actually work and frustration with off-the-shelf options. It intercepts the High-Side coil line via a P-Channel MOSFET (IRF5210) — the stock ECU still runs Low-Side, so the engine always has a fallback. The whole system runs on one rule that can never be broken: cuts only fire on Rising Edge GPIO18. Fire during Dwell and you collapse the magnetic field too early — advanced spark — bent connecting rod. Break that rule and the engine breaks. Everything else works around it.
▸ anti-misfire ISR chain
Rising Edge GPIO18 (spark / TDC) ↓ resolveCutArbiter() [IRAM_ATTR, inline in ISR] ↓ Priority scan: FAILSAFE → QS → PIT → LAUNCH → IDLE → BACKFIRE ↓ First true winner → GPIO26 HIGH [cut] ↓ Falling Edge GPIO18 → re-arm coil [next dwell]
▸ hardware mapping
Anti-Misfire ISR
All cuts synced to Rising Edge GPIO18 via resolveCutArbiter() inline in ISR. Queue-on-Dwell prevents advanced spark. 1ms refractory filters back-EMF ringing safe to 12,000 RPM.
Cut Arbiter
1 physical pin, 6 competing features. Priority single-winner scan (FAILSAFE→QS→PIT→LAUNCH→IDLE→BACKFIRE). Losers run state internally, GPIO26 stays silent.
FreeRTOS Dual-Core
Core 1 priority 5–6: ISR, cut logic, sensor sampling. Core 0 priority 1–2: web server, WebSocket, LED, CSV logging. Zero Flash/LittleFS access from Core 1.
Quick Shifter
Hall sensor ISR trigger. Cut duration adjustable per RPM band (low/mid/high). 500ms lockout after trigger. Duration latched from actual GPIO26 assert — not from trigger time.
Pit Limiter & Launch Control
2 scenarios (Early Warning + Hard Cut) × 2 algorithms: Stochastic (random % per cycle, organic scatter sound) or N-of-M (exact cut/fire ratio, constant rhythm).
Idle Rumble
5 sound presets: Gallop, Drumband, High Cam, Rotary, Custom. Custom = 8-slot on/off sequencer. Auto-off on gas (acceleration detect or RPM threshold). Anti-stall protection.
Backfire FSM
4-state machine: IDLE→ARMED→EXECUTING→LOCKOUT. Armed at target RPM, fires on decel trigger. Cooldown lockout prevents repeat bangs. 100% non-blocking.
Virtual Dyno & Telemetry
Real-time HP & Nm from road-load physics: F = ma + 0.35v² + Crr·mg. On-demand peak-hold dyno session (SOP: gear 3, WOT). No external sensors — reuses speed + RPM.
Data Logger
Daily CSV: 10 columns, 1-second interval, 700KB cap. Burst CSV: per-cycle (up to ~83 rows/sec at 10k RPM), double-buffer RAM, 300KB cap. Flash writes stay on Core 0 only.
Overheat Failsafe
NTC >115°C: all 5 cut features disabled, relay forced NC, manual toggle locked. Hysteresis release at ≤110°C. Double-layer: central arbiter backstop + per-module defense.
Web Dashboard OTA
16-menu SPA served from PROGMEM (68KB zero-copy via AsyncProgmemResponse). WiFi AP mode. Real-time WebSocket. Gated streams per active menu. OTA via ElegantOTA + ArduinoOTA.
Oil Health & Diagnostics
Hour-meter with stress multipliers: RPM>8000 = 1.5×, NTC>100°C = 1.3×, both = 1.95×. Battery drop detector during crank. Regulator diagnosis at RPM>3000. All NVS-persisted.
Built with spec-driven AI development. System design, hardware choices, safety rules, and all the logic are mine — AI wrote the C++/FreeRTOS.
▸ live from github — experiments, explorations, works-in-progress. most of these exist because I was curious.