The Modular Sensor Array began with a frustration shared across the environmental research lab I was embedded in: every field deployment required a custom hardware build, and adding a new measurement type meant a new PCB spin and a new firmware compile. The whole pipeline was bottlenecked on hardware engineering for what were, fundamentally, configuration changes.
This article walks through the system-level decisions that shaped the platform — what we kept, what we threw out, and where the boundaries between modules ultimately landed.
Three constraints, ranked
Early on we settled on a strict priority order for design decisions. Whenever two requirements conflicted, the higher one won — no exceptions.
- Field reliability. A failed deployment can mean months of lost data and a multi-thousand-dollar helicopter trip.
- Configurability without recompilation. Field scientists should be able to swap sensors without touching code.
- Power efficiency. Most deployments run on a single 100Wh battery for six months.
The self-describing module pattern
The key insight that unlocked configurability was borrowing from Eurorack and USB: every module carries a small EEPROM that describes itself — sensor type, address, sample rate, calibration coefficients. On boot, the controller walks the bus, reads the EEPROMs, and constructs its scheduling table at runtime.
This meant firmware shipped once, and configuration happened by physically swapping modules. A research team in the field could literally pull out a humidity sensor and plug in a soil pH sensor, and the system would just work.
Tradeoffs we accepted
The EEPROM-per-module approach added cost (about $0.40 per module) and required a more disciplined bus protocol. We also gave up the ability to do certain compile-time optimizations. In exchange we got a system where the human in the loop — the field scientist — never had to touch a compiler. That was the right trade for this audience.