Virridy Home | Lume — Water Quality Sensing Water for Carbon

Drift Mechanism — rate & duty factorial

Four TLF units in one room-temperature DI tank for a week, configured over Notehub (v0.1.21) into a 2×2 of sample rate (60 s vs 600 s) × LED duty (full sweep vs LED 512 only), bracketed by 24 h “bookends” at one identical config. The question the archive cannot answer (count and time collinear at r ≥ 0.997): is burn-in drift a function of sample count, elapsed time, or LED events? Started 2026-09-11, fully automated through 2026-09-18.

Design

UnitTargetSplit configArmNotes
50091FDOM puck (12.94 RFU)600 s · LEDs 32/128/512slow / full — rate armarm swapped 9/12 (cycle-skipping); chamber_override=1 from 9/12 eve (sampling wedged after the shake)
500214FDOM puck (13.59 RFU)60 s · LEDs 32/128/512fast / full — rate arm (swapped 9/12: holds 60 s cleanly)quench well characterized
500220bare DI—REMOVED 9/18firmware sampling stall from 9/13 07:31Z (modem alive, zero samples; config pushes did not revive); excluded from all analysis
50084bare DI (regular lid)600 s · LED 512 onlyslow / leanrails at LED512 top bias → read at bias≈3000 (sub-rail)

Within-unit analysis only. These four sensors differ in baseline offset, gain, intrinsic drift rate, and temperature dependence, so nothing is compared across units in absolute terms. Every trace below is each unit’s pedestal-subtracted net signal normalized to its own Bookend-1 median (log scale), and the verdicts come from each unit’s own rate change across its config transitions: a slow unit’s drift-per-hour should fall ~10× during the split if drift is per-cycle (unchanged if per-hour); 500220’s should fall ~3× if drift tracks LED events. 50091 never changes — it monitors the tank itself. Cross-arm deltas are corroboration only.

PhaseWindow (MDT)Config
Bookend 1Fri 9/11 ~5:00 PM → Sat 9/12 5:10 PMall four: 60 s, LEDs 32/128/512 × 36 steps, 34–48 V
SplitSat 9/12 5:10 PM → Thu 9/17 5:10 PMper-arm configs above (applied automatically over Notehub)
Bookend 2Thu 9/17 5:10 PM → Fri 9/18 5:10 PMall four back to the identical Bookend-1 config

Loading dataset…

Findings — test complete (2026-09-18)

The dominant drift this week was a decaying post-disturbance transient tied to elapsed time — not to accumulated sample cycles. The within-unit test that settles it: 50091 ran the split at 600 s (134 cycles/day, −1.00 ± 0.01 %/day temp-adjusted) and Bookend 2 at 60 s (1,399 cycles/day). Cycle-driven drift predicts ~−10 %/day in Bookend 2; observed: −0.43 ± 0.05 %/day — the rate fell despite 10× the cycling, because the settling transient had decayed in calendar time. The constant-config control corroborates: 500214, at an unchanged 60 s all week, decayed from −4.2 %/day (split) to −0.13 %/day (Bookend 2). Both units flattened together in calendar time despite a 10× difference in banked cycles (5,415 vs 636).

A smaller, persistent current-dependent LED-aging component is real: on both full-sweep units the net512:net32 ratio tilted down steadily (500214 −0.87 %/day, 50091 −0.35 %/day) — the high-current signal fading faster than low-current, the classic LED-wear signature, and larger on the unit firing 10× the LED events. This is the component the S-TLF shape correction exists for.

Implications: (1) the linear per-cycle drift term in drift_correction.mjs is a local approximation for a settled deployment — after any handling, redeployment, or re-immersion, expect a days-scale decaying transient in elapsed time; do not extrapolate a linear rate across handling events (this also explains the archive's “drift is a step between tests”). (2) Good operational news: fast cadence does not burn calibration 10× faster — the dominant component doesn’t count cycles. (3) The LED-wear tilt is the cycle-linked part; the proposed 512-vs-2048 drive-current experiment targets it directly, and it should be run on settled units so the transient doesn’t mask it.

Mechanism (open) — and the probe now running: the time-based transient needs a physical carrier, and the electronics have none at days-scale. Candidates, all in the optical path: (1) microbubble regrowth on the windows after each disturbance (the 9/12 shake steps of +16/+37% are direct evidence bubbles modulate the signal); (2) particulate settling in the shared water (most of every unit's signal is water-path blank); (3) water uptake by window/optical materials after immersion — the only candidate that is true instrument behavior. The week's data cannot separate them. Probe: units re-shaken 2026-09-18 2:46 PM on settled signals — if the step-then-decay reproduces on demand, the transient is bubble/particle dynamics (a tank artifact, not sensor drift); if signals step and hold flat, the original decline was immersion chemistry, not disturbance.

Probe result (2026-09-18, temp-corrected): 50091 stepped UP ~+7% and held flat over 4.5 h (raw data showed a false “decay” that was purely the −3.6 %/°C quench on a warming tank). The diagnostic feature is the direction: a shake restored signal. Mechanical disturbance recovering signal is incompatible with water uptake into the window material (a shake can’t reverse bulk chemistry) and points instead to removable surface accumulation — bubbles, particles, or film on the optics — that agitation clears and that re-accumulates over days (matching the week’s downward decline). Flat-over-4.5 h is consistent with days-scale re-accumulation, not against it. Limitations: one unit only — 500214 went dark at shake+10 min when its Notecard 11.3.2 update (fleet GPS-bug remediation) landed simultaneously; confirmation is now passive — watch whether 50091 drifts back down toward its pre-shake level over the coming days.

Caveats: one week; single unit per arm; the 9/12 shake reset the transient mid-Bookend-1 (50091 also stalled through post-shake B1, so its within-unit contrast uses split vs Bookend 2); 50084’s battery died with 3 h of Bookend 2 (its bookend delta is temperature-dominated and not used); 500220 removed; pucks contribute 20–35% over the wet blank, so “puck arm” = partially stabilized target. Preliminary 9/17 cross-unit read (“per-hour dead, 3.8× ratio”) is superseded by the within-unit result: that ratio reflected 500214 being earlier in its settling curve, not cycle count.

Status

Drift — each unit vs its own Bookend-1 level

ln(net / own Bookend-1 median) at LED 512, read at a fixed low bias (≈35 V) — sweeps truncate at the mon2 rail (~3050) on bright targets, so top-of-arc would pin at the rail and hide drift (50084 read at bias≈3000). Flat = no drift. Under the per-cycle hypothesis the fast arms fall ~10× faster than the slow arms during the split; under per-hour all four fall together. Dashed verticals = phase transitions.

Per-unit detail — net signal per LED

Tank temperature

5-min medians from each unit's diagnostics. Shared bath → temperature is common-mode; each unit's quench is fit and corrected per-unit in the final analysis.