Build against a dummy plant rig — a 470 kΩ fixed resistor in series with a 1 MΩ potentiometer. Turning the pot is “the plant responds”. No living plant is needed to develop firmware, and no plant gets stressed by a bug.
Savia Flow reads the electrical rhythm of a living plant and turns its changes into music — live, on a battery, with nothing proprietary anywhere in the chain. This page is how it gets built: the option chosen at each of the four stages, sixteen steps with the test each one has to pass, the parts list in full, and the six roles still open.
Every unit is the same four stages. The options differ only in how each stage is built.
A plant is not a sensor with a datasheet. What we measure is its change: the 555 path hears bulk resistance shift as water and ions move, the biopotential path sees genuine action potentials. Both are honest, and they answer different questions — which is why v1 carries both.
Highlighted is what gets built now. The rest stays in the spec so a fork can choose differently.
Sixteen steps, four phases. A step is done when its exit test passes in front of you — not when it was attempted.
Build against a dummy plant rig — a 470 kΩ fixed resistor in series with a 1 MΩ potentiometer. Turning the pot is “the plant responds”. No living plant is needed to develop firmware, and no plant gets stressed by a bug.
Interrupt on the rising edge, rolling buffer of the last 32 Δt, serial plot. Work in interval deltas, never absolute values — that is what cancels the drift.
The threshold, pitch, velocity and CC algorithm from section 04, out over standard MIDI-over-BLE. Pair with a phone synth.
Swap the dummy rig for a houseplant, gel electrodes, and wait out the full 15-minute settle before judging anything.
All fifteen ESP32s carry F2 out of the box, tagged fw-v0.2-instrument. A board that needs a laptop at the Hub is a board that eats a residency morning.
The kerf comb is cut first, on day one. Every finger-joint dimension in E-1 is downstream of that one measurement, and the Hub laser’s kerf is unknown to us.
Photograph every stage while you solder. There is no separate documentation pass — these frames are the kit build guide.
Captive portal at savia.local: scale, root, MIDI channel, thresholds, output toggles, OTA. MCP4725 pitch CV on the performance units.
Thirty minutes logged on the dummy rig for baseline noise, then thirty on a plant. Both CSVs into /calibration, named by unit number.
Two hours, then decide and nobody reopens it. Either RNode firmware on one Heltec acting as the radio for a Pi or laptop running RNS, or both boards native SX1262 with RNS over serial.
A ≤48-byte CBOR feature packet every 60 s; the receiver feeds it into its own mapping engine and out to the speaker. Features travel, audio never does.
Log RSSI and SNR at 100, 500 and 1000 m along the valley, and publish the map. The Höllental walls decide the real number, not the datasheet.
Labeled parts, a pre-flashed ESP32, and a printed two-page build guide using the photographs from step 07.
AD8232 and ADS1115 on one node, mains notch in firmware — 50 Hz here. Record a real cut-leaf action potential.
/firmware /cad /hardware /guide /calibration /dataset and a README, with a licence file in every folder — CERN-OHL-S for hardware, MIT for firmware.
Charge test · two-hour soak on the dummy rig without a crash · BLE pair from cold boot under 15 s · all jacks continuity · enclosure number engraved.
Six roles. Come to the Commons Hub fablab, or write to us from the front page — say which tag is yours.
ESP32 and Arduino C++: interrupt capture, the mapping engine, BLE MIDI, the captive config portal.
two wantedThe 555 front-end, three perfboards, jack wiring, continuity and QA.
two wantedFreeCAD or Onshape, the laser kerf test, the E-1 box, the E-2 snap case, printed accessories.
one wantedLoRa and Reticulum, RNode flashing, SaviaPacket, the range walk.
one wantedShoot the build as it happens, write the two-page kit guide, translate between Spanish, English and German.
one wantedElectrode protocol, settle-time discipline, the cut-leaf action potential, dataset metadata.
one wantedNo experience bar beyond wanting to do the thing. Every step above was written so that someone who has not seen the project can pick it up, and the exit test tells you when you are finished.
These get answered in Phase 0, not later. Each one blocks work downstream of it.
The full spec for each stage — open the one you are building.
The plant’s tissue sits in the timing path of a 555 running astable. Its changing resistance — typically 50 kΩ to 2 MΩ between electrodes — changes the pulse rate. The microcontroller timestamps every rising edge on an interrupt pin and works with pulse-interval deltas, not absolute values, which is what cancels most of the drift.
Verdict: every residency unit and every kit. This is the musical instrument.
An AD8232 single-lead ECG module (~€6) repurposed for plant surface potentials: a differential measurement between two tissue electrodes against a reference rod in the soil, the instrumentation-amp gain bringing µV–mV potentials into ADC range. Sample it with an ADS1115 at 128–250 SPS — the ESP32’s internal ADC is too noisy for this. Add an RC low-pass near 40 Hz and notch the mains in firmware: 50 Hz in Austria, 60 Hz in Mexico.
Fussier — gel quality matters, motion shows up as artifact, and it needs a fifteen-minute settle — but you can see an action potential when a leaf is cut, and the waveform is loggable for the open dataset.
The 555 plays music with no latency while the AD8232 logs science-grade waveforms. Two GPIOs and one extra module. This is the v1 architecture, and it is where the instrument and the sensor stop being different products.
Leads are shielded audio cable into a 3.5 mm TRS jack on the enclosure: tip and ring are the electrodes, sleeve is the reference.
| M-A · ESP32 DevKitC | M-B · Heltec LoRa32 V3 | M-C · LilyGo T-Beam | |
|---|---|---|---|
| Chip | ESP32 | ESP32-S3 + SX1262 + OLED | ESP32 + SX1276/1262 + GPS + 18650 |
| Price | ~€8 | ~€20 | ~€30 |
| BLE MIDI | yes | yes | yes |
| LoRa | — | built in | built in |
| Best for | instruments and kits | the mesh nodes | forest sentinels, solar |
All three run the same firmware behind build flags. Fifteen M-A boards, two M-B, and M-C waits for the wildfire work.
The ESP32 advertises as a standard MIDI-over-BLE device and pairs straight with iOS, Android and macOS synth apps and DAWs. Latency lands around 10–20 ms. Zero extra hardware, and it is how the residency units ship.
A MAX98357A amp (~€4) and a 3 W speaker, driven by a firmware wavetable synth: two oscillators, sine and triangle, one envelope, around three hundred lines. The unit sings by itself in the garden. A SAM2695 module does General MIDI in hardware for ~€15 if the crew would rather not write DSP.
An MCP4725 12-bit DAC gives 0–5 V pitch CV on a 3.5 mm mono jack, with a gate line from a GPIO through a transistor. It plugs into Eurorack, semi-modular and volca-class gear. One €3 module turns Savia into stage equipment. The H11L1 optocoupler circuit adds DIN-5/TRS serial MIDI for €2. Both go into the three performance units.
Features travel over LoRa and the far node re-synthesizes locally. The plant’s rhythm travels as a score, not a recording — which is also the engineering truth: LoRa cannot stream audio.
Input is timestamped rising edges from the 555, and on the science path a sampled waveform.
k·σ, k default 1.0. The plant’s changes play; a resting plant is nearly silent. That is both musically and philosophically correct.The science path adds a spike detector — derivative threshold with a 2 s refractory — that accents real action potentials, and logs (t, mV) CSV at 100 SPS with a session metadata file: species, location, weather, event tags.
Ensemble mode gives each unit a MIDI channel from 1 to 8 and a name — several plants into one DAW is the garden quartet. Configuration is a WiFi captive portal at savia.local: scale, root, channel, thresholds, output toggles, over-the-air update. There is no app to build.
LoRaWAN needs gateways and a network server. Reticulum is serverless and encrypted end to end, and it matches how the rest of this project is built.
| Option | Topology | Hardware | Use |
|---|---|---|---|
| N-1 | node to node, direct | 2× Heltec V3 as RNodes | the residency demo: two plants, one message, no internet |
| N-2 | mesh via a transport node | Pi Zero 2 W + RNode | a multi-node garden; the Pi also logs the dataset |
| N-3 | sentinel field | T-Beam + 18650 + 1 W solar | the research slope: wake every ten minutes, sample, send, sleep |
EU 868 MHz in Austria at roughly 1 % duty cycle means about 36 seconds of airtime per hour per node. Mexican and US builds use 915 MHz. So the unit of the protocol is a feature packet, never raw signal: a CBOR object of 48 bytes or less carrying an id, a timestamp, the mean interval, the variance, spikes per minute, baseline drift, battery, temperature and humidity — every 60 s in a garden, every 600 s for a sentinel, plus an event-triggered packet on spike bursts.
The receiving node feeds the packet into its own mapping engine, and the far plant plays here. Stock antennas give 1–5 km line of sight; valley walls will shape the real number, so we walk it and publish the map. Every node carries a BME280 — session data without weather context is scientifically worthless.
| Build | Source | Runtime |
|---|---|---|
| Instrument, BLE active | 2000 mAh LiPo with a TP4056 USB-C charger, MT3608 boost or a direct 3.3 V LDO | 10–14 h |
| Node, LoRa duty-cycled | the same cell | days |
| Sentinel, deep sleep on a ten-minute cycle | 18650 and solar | months |
Hard rules: a power switch on the enclosure face; charging while playing must work; the battery lives in a printed cradle, never loose; a fuse or PTC on the cell.
FreeCAD or Onshape, so the files are open and shareable. Export DXF and SVG for the laser, STL and 3MF for the printer, and STEP masters.
3–4 mm birch ply, a finger-jointed six-panel box, roughly 110 × 70 × 35 mm. The face carries the power switch, the electrode jack, the CV jack, DIN/TRS MIDI, USB-C, two status-LED light pipes, and an engraved unit number. Inside: a printed standoff tray and a battery cradle. Panel thickness and kerf are parameters, not constants — the laser’s kerf is measured before any panel is cut.
A two-part PETG snap fit, same port layout, printing in under three hours with no supports. Made to be remixed.
A printed body with an O-ring lid, a ground spike, an antenna gland, and a solar lid variant. It is a later build, but the mounting gets modelled now.
Accessories, all printable: an electrode clip with strain relief, a soft TPU leaf clip, and a wall or tripod mount with a ¼-20 insert for performances.
Everything but the radios is over the counter. Buy 20 % spares on passives and two spare ESP32s.
| # | Part | Qty | € each | Source | Goes into |
|---|---|---|---|---|---|
| 1 | ESP32-WROOM DevKitC | 1 | 8.00 | Conrad / AZ-Delivery | instrument + kit |
| 2 | NE555 timer, DIP | 1 | 0.50 | Conrad | instrument + kit |
| 3 | Film cap 4.7 nF + R/C assortment | 1 | 2.00 | Conrad | instrument + kit |
| 4 | 3.5 mm TRS panel jack | 3 | 2.00 | Conrad | instrument + kit |
| 5 | TENS/ECG gel electrodes, pack | 1 | 5.00 | pharmacy | consumable |
| 6 | Shielded electrode lead | 1 | 2.00 | cut audio cable | instrument + kit |
| 7 | LiPo 2000 mAh + TP4056 USB-C | 1 | 8.00 | Conrad / Amazon.de | instrument + kit |
| 8 | MCP4725 12-bit DAC | 1 | 3.00 | Amazon.de | performance |
| 9 | H11L1 + DIN/TRS MIDI parts | 1 | 2.00 | Conrad | performance |
| 10 | Switch, LEDs, perfboard, headers, wire | — | 4.00 | Conrad | instrument + kit |
| 11 | Enclosure — birch ply or PETG | 1 | 2.00 | Hub fablab | instrument + kit |
| 12 | Heltec LoRa32 V3 | 1 | 20.00 | Amazon.de | node |
| 13 | BME280 | 1 | 4.00 | Amazon.de | node |
| 14 | AD8232 front-end | 1 | 6.00 | Amazon.de | science |
| 15 | ADS1115 16-bit ADC | 1 | 4.00 | Amazon.de | science |
| 16 | MAX98357A I2S amp + 3 W speaker | 1 | 4.00 | Amazon.de | node |
| 17 | Stainless rod, 3–5 cm | 1 | 0.50 | hardware store | science |
| One instrument — S-A + M-A + V-1/V-3 | — | 30–38 |
Published in full because an open-hardware claim you cannot check is a slogan. Prices are indicative and want real supplier quotes before any run.