Three days ago I deleted the main feature of my product because 8.6 mm of buckle cavity could not hold an earpiece. What replaced it is a belt that measures your waist circumference from the tension in its own strap.
That claim rests on one assumption I have not tested: that strap tension carries a signal you can actually recover — through clothing, while walking, at different fits and temperatures.
If it doesn't, circumference and respiration both fall at once and I start over.
So rather than write another paragraph asserting it works, I published the experiment that could kill it. Parts list, wiring, firmware, analysis. About €20.
The trap that eats this test
The obvious build is: strain gauge → HX711 → microcontroller. Buy the parts, glue the gauge to the belt, read the value.
That gives you 8388607. Every time. Forever.
The HX711 is not an ohmmeter. It is a differential ADC designed for a Wheatstone bridge — it measures the imbalance between two voltage dividers. Hand it a single resistor and its input sits at a rail, and you get the 24-bit maximum.
Search that number and you'll find forum threads of people debugging their code for an evening. The bug is not in the code.
Why a half bridge, not a quarter
You can complete the bridge with three fixed resistors and one gauge. Don't — not for something worn on a body.
A foil strain gauge responds to temperature almost as much as it responds to strain. Put it against a torso and it goes from 20 °C to about 32 °C over the first twenty minutes. That drift is larger than the breathing signal you are trying to see. Your beautiful trace will be a slow ramp with noise on it.
The fix costs one extra gauge:
E+ (~4.3 V from the HX711)
│
┌────┴────┐
│ │
R_active R1 350Ω 0.1%
│ │
├── A+ ├── A- ← the measured difference
│ │
R_dummy R2 350Ω 0.1%
│ │
└────┬────┘
│
E-
R_active is bonded to the strap and stretches with it. R_dummy is bonded to an offcut of the same leather, right next to it, carrying no load.
Both gauges sit in the same leg, at the same temperature. Thermal drift moves them together and cancels in the difference. Mechanical strain moves only one, and survives.
Use metal-film resistors for R1/R2, not carbon. Carbon's tempco is large enough to reintroduce exactly the drift you just removed.
The firmware is deliberately not a library
long readRaw() {
while (!ready()) { delay(1); }
long value = 0;
noInterrupts(); // an interrupted 24-bit shift-in is garbage
for (int i = 0; i < 24; i++) {
digitalWrite(PIN_SCK, HIGH); delayMicroseconds(1);
value = (value << 1) | digitalRead(PIN_DT);
digitalWrite(PIN_SCK, LOW); delayMicroseconds(1);
}
for (int i = 24; i < 25; i++) { // 25 pulses = channel A, gain 128
digitalWrite(PIN_SCK, HIGH); delayMicroseconds(1);
digitalWrite(PIN_SCK, LOW); delayMicroseconds(1);
}
interrupts();
if (value & 0x800000L) value |= ~0xFFFFFFL; // sign-extend
return value;
}
HX711 libraries differ in whether they block, how they handle the rate pin, and whether they quietly drop samples. This experiment is worthless if samples are unevenly spaced, because the whole analysis is frequency-domain. Bit-banging it means the timing is visible and checkable in the output.
It also refuses to start quietly when the bridge is wrong:
long probe = readRaw();
if (probe >= 8388600L || probe <= -8388600L) {
Serial.println("# ERROR: HX711 saturated. You almost certainly have a single "
"gauge on the input instead of a bridge.");
}
Making the answer not depend on hope
The analysis prints a verdict against a gate written down before any data existed:
GO: a 1 cm change in circumference is distinguishable from walking noise, and breathing rate is recoverable from the same signal.
Breathing is found by direct DFT over 0.10–0.60 Hz (6–36 breaths/min) after removing a linear trend — the trend being the thermal drift and creep the dummy gauge didn't fully cancel. A peak only counts if it stands above a quarter of that block's own standard deviation.
Circumference is scaled against a tape measure. That matters more than any of the electronics. Without a tape measure you have proven that something changed, not that circumference did. The script refuses to return GO without it.
Walking is the noise floor, because walking is what the sensor will spend its life doing.
I validated the analysis on synthetic data with a known 15 breaths/min buried in walking noise before trusting it on anything real.
Why publish the thing that could kill it
Because the alternative is asking people to believe a render.
Everything is here, and it is the same repository as the ten earpiece shape studies that failed:
https://github.com/vojtisprime11/vyldor-specs/tree/main/hardware/p1-strain-gauge
If you have built strain-gauge instrumentation on soft, moving, human-shaped things and I've made an obvious mistake, I would genuinely rather hear it now than after I've spent someone's money. I'm 16 and I have never built hardware — that's exactly why the test is written down where you can check it.
One more thing
I am looking for one person who has actually built hardware — as a co-founder, as an advisor with an hour a month, or as a paid contractor once there is money to pay with.
I can do the software, the companion app and the parametric CAD, and I have shipped all of it where you can inspect it. What I have never done is take a physical object from a model to something manufactured. Sensing and signal recovery on a soft, moving, human-shaped thing is exactly the part I am least qualified to get right alone.
If that is your work, I would like to hear from you: vyldorhq@gmail.com. A link to one thing you have built beats a CV.
And if you only want to tell me the bridge is wrong, that is worth as much to me right now.











