
Pressure rev2
CohenLabPrinceton/pvp
Raspberry pi code for controlling the rapid-deploy critical care ventilator

Home early warning of worsening heart failure for elderly rural patients: check-in stool + amulet + SMS care loop (hackathon prototype, synthetic data; monitoring, not diagnosis)
Hridaymitra afe is an open-source printed circuit board by aadityaa0523, from the aadityaa0523/HridayMitra repository on GitHub, published under the MIT licence. It is a 2-layer board of 70 × 50 mm with 35 parts on 37 nets, routed with 412 tracks and 47 vias.
It is built around the INA126U and MCP6002-I/P. Its parts include 14 resistors, 10 capacitors, 5 ICs and 2 connectors. It belongs with the ESP32 boards of this library.
Monitoring, not diagnosis. Research prototype for the Transfinitte 2026 hackathon (hardware track, problem statement by Dare 2 Dream Ventures). All patient data in this repository is synthetic (plus public PhysioNet BIDMC ECG for heart rate). No human data was collected.
![]() | ![]() |
| The product: any household chair on our weighing platform, with the hand sensor bar | Our working prototype on an ordinary plastic chair, Kavach amulet on a cord |
No special chair to buy. No patch to wear.
In one line: any household chair + a weighing platform + a hand bar + an amulet = a 90-second daily check-in that warns the family about 3 days before a heart-failure hospital visit, for about ₹4,400.
Browse by area (each folder has its own README with images, results and links to the code):
| Folder | Inside |
|---|---|
| 📁 Deliverables | Concept image (any chair), pitch video, report, storyboard, block diagram, schematics, cost report, PCB, simulation video |
| 📁 01_Hardware_Design | Prototype photo, block diagram, 4 schematic sheets, front end with test points, power budget, routed PCB + Gerbers, parts list (₹4,402) |
| 📁 02_Software_and_Analytics | App screenshots, signal processing, personal-baseline alert engine, hybrid ML, firmware engine, care loop, Saathi app, a real alert SMS |
| 📁 03_Data | Synthetic dataset card, sample patients, how noise is modelled |
| 📁 04_Testing_and_Validation | The four PS measures with 95 % ranges, assumption and stress tests, PhysioNet real-data checks, 217 automated tests |
| 📁 05_Simulation | Live Wokwi, demo video, LTspice results, firmware emulator, PCB DRC |
| Deliverable (PS requirement) | Where |
|---|---|
| 5-minute pitch video | Deliverables/5min_pitch.mp4 |
| Live simulation (Wokwi, runs in the browser) | wokwi.com/projects/478945371100594177 |
| Simulation demo video (one patient month, circuit + SMS) | Deliverables/simulation_demo.mp4 |
| Technical report | Deliverables/report.pdf |
| User-journey storyboard | Deliverables/user_journey_storyboard.pdf |
| Block diagram | Deliverables/block_diagram.webp · production set HM-HW-001 |
| PCB of the custom sensor board (2-layer, 70 × 50 mm, fully routed, 0 DRC errors) | 3D view · Gerbers · KiCad files |
| Schematics (4 sheets) and power budget | Deliverables/schematics.pdf · HM-HW-003 |
| Cost report (₹4,402, under ₹5,000) | Deliverables/cost_report.pdf |
| Working phone app (Saathi, offline, 10 languages) | app/ |
| Firmware (stool + amulet, ESP32) | firmware/ |
The four PS measures (hybrid engine, held-out test set): sensitivity 86 %, specificity 97.9 %, median lead time 3 days, false alerts 0.19 per patient per month.
Headline results (synthetic benchmark, tuned on dev only, scored once; 95 % bootstrap range in brackets; full table in benchmark/LEADERBOARD.md):
| System | Caught episodes | False alerts / patient-month | Median warning |
|---|---|---|---|
| HridayMitra hybrid (test, 60 patients) | 86 % [73–95] | 0.19 [0.08–0.30] | 3 days |
| HridayMitra hybrid (external, 1,000 patients) | 86 % [79–93] | 0.09 | 3 days |
| Weight rule, SCALE-HF (today's standard, test) | 40 % [25–57] | 0.53 | 2 days |
Checked automatically: 67 Python tests, 109 app tests, 41 firmware-emulator checks; firmware compiles (66 % of flash). Real-data checks on public PhysioNet BIDMC: pulse median error 0.91 bpm, breathing 1.0 breath/min.
Jump to: For judges · The problem · How it works · Results · Quick start · Saathi phone app · Hardware and firmware · Simulate it · Reproduce · Repository map · Documents · Troubleshooting · Honest limits
Fluid builds up silently for days before a heart-failure admission. A daily weight rule catches about one event in three and floods families with false alarms. Elders will not wear sticky patches, and rural homes have power cuts, 2G and low literacy.
HridayMitra measures what a weight scale cannot (fluid in the legs and chest) in the way an elder will actually accept (sit down, hands on a bar), learns each person's own normal, and tells the family why it raised an alert, by SMS, with no internet.
| Part | What it is | What it measures |
|---|---|---|
| Check-in set | A weighing platform under the patient's own chair (4 load cells, 4 stainless foot plates) plus a hand sensor bar (4 hand strips, fingertip optical cradle, ✓ / ✗ / SOS buttons, speaker, status light). No chair modification; never on wheeled chairs. | Weight; 8-electrode bioimpedance spectroscopy at 5 / 20 / 50 kHz (legs, arms, both sides → chest fluid by segmental subtraction; water outside the cells from a Cole-model fit, which cancels foot position and skin temperature); pulse and SpO₂; sit-to-stand speed from the platform's force; 3 spoken yes/no questions |
| Kavach amulet | ESP32-C3 + accelerometer on a breakaway cord, no magnets | Night breathing, night sit-ups, activity, a weekly 6-minute walk test (it finds the best 6 minutes itself, no button), falls, SOS |
| Offline alert engine | Runs on the ESP32 | Personal baseline, green / amber / red, reasons in plain words |
| Care loop | SMS over 2G with retries | family 1 → family 2 (30 min) → ASHA worker (2 h) → PHC doctor (6 h) |
| Saathi app | Offline PWA, 10 Indian languages | Elder, family, ASHA and doctor views |
| Step | Elder does | Device does |
|---|---|---|
| 1 | Sits on their own chair at the usual time (an SMS reminder if the check-in is missed) | Platform recognises the person by weight; a guest is ignored |
| 2 | Puts bare feet on the plates, holds the bar, finger in the cradle | Checks contact; if bad, the voice asks again ("no reading", never a made-up number) |
| 3 | Sits still about 60 s | Weight, 8-electrode impedance at 3 frequencies, pulse and SpO₂ |
| 4 | Answers 3 spoken questions with ✓ / ✗ | Breathless? Extra pillows? Tablets taken? |
| 5 | Stands up | Sit-to-stand time from the platform force |
| 6 | Sees the light: green / amber / red | Amber: check again tomorrow. Red: SMS to family with the reason |
The amulet needs nothing: it is worn on a cord day and night and charges on the dock beside the chair.
Why they keep using it for months
We designed the patients, so we tested what happens when our guesses are wrong (reports/assumption_sensitivity.csv, reports/stress_and_ablation.csv):
This shows the method is robust to our assumptions. It does not replace a clinical study.
flowchart LR
A[Kavach amulet<br/>ESP32-C3 + MPU6050] -- BLE advertisement, no pairing --> S
S[Check-in set<br/>ESP32 + load cells + 8-electrode impedance + finger sensor<br/>offline alert engine] -- light + voice --> E[Elder]
S -- SMS over 2G --> C[Care loop<br/>family 1 → family 2 → ASHA → PHC doctor]
S -- BLE or USB --> P[Saathi phone app]
S -- USB, optional --> D[Laptop bridge → live dashboard]| Signal | Sensor and position | Family | Weight in family | Worse when |
|---|---|---|---|---|
| Body weight | 4 load cells under the platform (corners) → HX711 | fluid | 1.0 | up |
| Leg reading (5 kHz impedance) | 4 stainless foot plates + 4 hand strips, 8 electrodes, ESP32 DAC excitation via MCP6002 → INA126 | fluid | 1.0 | down |
| Leg water outside cells (EWI) | same electrodes, spectroscopy at 5 / 20 / 50 kHz, Cole-model fit (cancels foot position, skin temperature) | fluid | 1.0 | up |
| Chest reading | segmental subtraction of the same 8-electrode readings | fluid | 0.5 | down |
| Resting pulse | MAX30102 in the hand bar's fingertip cradle | heart-lungs | 1.0 | up |
| Night breathing rate | Kavach amulet accelerometer (MPU6050), chest motion at night | heart-lungs | 1.0 | up |
| Oxygen (SpO₂, trend only) | MAX30102 | heart-lungs | 0.5 | down (below 90 % = red at once) |
| Activity + 6-minute walk | Kavach amulet, steps and best 6 minutes of the week | daily life | 1.0 | down |
| Sit-to-stand time | platform force, double-integrated centre-of-mass rise, min-jerk fit | daily life | 1.0 | up |
| Night sit-ups (can't lie flat) | Kavach amulet posture | daily life | 1.0 per sit-up beyond 1 in 3 days | up |
| 3 spoken questions (breathless, extra pillows, tablets) | speaker + ✓ / ✗ buttons, local language | daily life | 1.2 per "yes" beyond 1 in 3 days | yes |
Each signal is scored in "spread units" against the person's own normal (median of days t−35..t−7), only in the worsening direction. Family score = strongest sign + half the second. Red needs two families to agree. Source: engine/alert_engine.py.
| File | One row per | Contents |
|---|---|---|
| data/processed/patients.csv | patient | sex, age, event yes/no, worsening start, admission day, lead days, weight-silent flag, cause, sensitivity |
| data/processed/daily_features.csv | patient-day | what the devices report after quality checks (empty = no reading) |
| data/processed/truth_daily.csv | patient-day | hidden truth: congestion, guest on platform, infection, salty meal… (never shown to the engine) |
| data/processed/labels.csv | patient | answer key: worsening start and admission day |
| benchmark/splits.json | — | dev / test / external / stress patient split (each patient in one split only) |
| engine/frozen_hybrid.json | — | frozen threshold and model weights, tuned on dev only |
| docs/DATA.md | — | how the patients were built: every parameter with its published source or marked ASSUMPTION |
The alert engine (engine/alert_engine.py): each person's baseline is the median/MAD of their own days t−35..t−7. Only the worsening direction is scored. Red needs two independent witnesses (for example weight and leg fluid), and bad-data guards ignore guests on the platform, a toe ring bridging two plates, lifted feet and noisy fingers. The same engine exists three times and is held identical by tests:
| Where | File | Checked by |
|---|---|---|
| Python (research, dashboard) | engine/alert_engine.py | reference |
| C++ on the ESP32 | firmware/hridaymitra_stool/engine_core.h | tests/test_engine_parity.py: 100% of 3,231 days |
| TypeScript in the app | app/src/engine/ | app/tests/engine.test.ts against docs/app/engine_test_vectors.json (2,732 comparisons) |
Hybrid engine (engine/hybrid.py): rules propose, a 13-weight logistic model trained on dev only must agree before red. It runs on the laptop and in the benchmark; the stool itself runs rules v3.
Synthetic cohorts; thresholds tuned on training patients, frozen, then tested once.
| Rules engine v3 | Hybrid (rules + ML) | Weight rule (SCALE-HF) | |
|---|---|---|---|
| Sensitivity, held-out patients | 66% | 86% | 40% |
| Sensitivity, external 1,000-patient cohort | 72% | 86% | 31% |
| Specificity (held-out) | 98.7% | 97.9% | 97.6% |
| False alerts per patient-month (held-out / external) | 0.06 / 0.06 | 0.19 / 0.09 | 0.53 / 0.38 |
| Median lead time before the visit | 3 days | 3 days | 2 days |
Full tables with 95% ranges and an open scorer anyone can run: benchmark/LEADERBOARD.md, benchmark/README.md.
Details: reports/phase1_summary.md, reports/phase2_summary.md, sim/circuit/HOW_TO_VERIFY.md, docs/EVIDENCE.md (every problem-statement requirement → proof file, plus a failure-modes table).
Requires Python 3.11. All code lives in source_code/; every path and command below is relative to it.
cd source_code
python run.py setup # install packages, generate the synthetic cohorts if missing
python run.py test # pytest suite, incl. the real firmware in an emulated month and C++ engine = Python engine
python run.py demo # dashboard: patient light + voice, family SMS, ASHA/doctor trends, "break it" switches| What you want | Command |
|---|---|
| Watch a pretend patient arrive live in the dashboard (no hardware) | python run.py live --simulate P0022, then python run.py demo → "Live stool" |
Compile both boards (needs arduino-cli with the esp32 core) | python run.py firmware |
| Flash the stool (COM5) and the amulet (COM6) | python run.py firmware --upload COM5 --amulet-port COM6 |
| Log the real stool's check-ins into the dashboard | python run.py live --port COM5 |
| Prove the real stool decides exactly like the tested engine | python run.py hil --port COM5 |
| Simulate the whole stool in Wokwi | python run.py wokwi, then wokwi/README.md |
| Re-run every result / rebuild every document | python run.py reproduce / python run.py docs |
| Everything | python run.py all |
In the dashboard, try patient P0022: slide to the red day, then tick "guest" and "toe ring" and watch the light refuse to lie.
![]() Elder one big status, voice in their language | ![]() Family alerts, medicines, check-in streak | ![]() ASHA worker visit list, visit form | ![]() PHC doctor timeline, care plan, labs, notes |
Demo data on a simulated red-alert day (synthetic patient). Screens captured by source_code/app/tools/screenshots.mjs.
app/ is HridayMitra Saathi: an offline-first PWA (React 18 + TypeScript + Vite, Tailwind, Workbox, Dexie) for one Android phone with role switching.
firmware/hridaymitra_stool/app_link.h), plus a built-in simulator.docs/app/PHASE_9.md).cd source_code/app
python ../tools/prepare_voice_models.py # optional: 82 MB voice packs, not in git
npm ci && npm test && npm run devNode.js 22.12+. End-to-end tests: npm run test:e2e (Playwright, Pixel 5 viewport).
A PWA installs only from HTTPS or localhost; plain http://<lan-ip> does not work.
Option A: host it. cd app && npm ci && npm run build, then upload app/dist/ to the root of a static host (Netlify Drop, or Vercel / Cloudflare Pages with root directory app, build npm run build, output dist). The app uses root-absolute paths (/models/, /audio/), so it cannot sit under a sub-path such as GitHub Pages /HridayMitra/. On the phone: Android Chrome → menu → Install app; iPhone Safari → Share → Add to Home Screen.
Option B: USB, no hosting (Android). Enable Developer options → USB debugging, connect the phone, then:
cd source_code/app && npm ci && npm run build
npm run preview -- --port 4173 # serves the production build
adb reverse tcp:4173 tcp:4173 # in a second terminal
# phone: Chrome → http://localhost:4173 → menu → Install appOpen the installed app once while connected and wait for "App ready offline"; it then works without the cable. Web Bluetooth pairing needs Chrome on Android (not iOS). Per-phase details: app/README.md, docs/app/PHASE_*.md.

| Path | Contents |
|---|---|
firmware/hridaymitra_stool/ | ESP32 DevKit. 90 s check-in, HX711 weight (one HX711 for all four cells), 4 impedance paths with Goertzel, MAX30102 pulse/SpO₂, 3 questions, sit-to-stand fit, amulet scan, the alert engine on the chip (engine_core.h), SMS ladder with retries, replies and missed calls, engine state in flash, daily self-test, CHARGE / USE safety switch. Phone numbers and timings are in config.h. |
firmware/hridaymitra_amulet/ | ESP32-C3 + MPU6050. Night breathing, sit-ups, activity, 6-minute walk (walk_core.h), falls, SOS, sent in the BLE advertisement (no pairing). |
hardware/kicad/ | KiCad 9 schematic generated from code (ERC 0), netlist, PDF. |
docs/hardware/ | HM-HW-001 block diagram, HM-HW-002 schematic set, HM-HW-003 power budget, HM-HW-004 routed PCB of the impedance front end (tools/make_pcb.py: KiCad + Freerouting, DRC clean, Gerbers ready to order), system architecture, front-end sheet with LTspice test points. |
sim/circuit/ | LTspice netlists, Monte Carlo of 100 devices, mains-hum test, spectroscopy, self-calibration, IEC 60601-1 fault analysis, charger leakage. |
Safety design: two series coupling capacitors plus a current-limit resistor (every single fault within IEC 60601-1 type-BF limits, margin ≥ 12.8×), battery-only measuring, a CHARGE / USE switch that cuts both USB wires, impedance and ECG switchable off for pacemaker / ICD users.
Voice prompts: python tools/make_voice_clips.py. Recorded Hindi / Tamil WAVs in firmware/voice/<lang>/ replace the built-in English voice.
wokwi/): the production firmware on an emulated ESP32 with a virtual patient chip (drag leg fluid, chest fluid, lifted foot, mains hum), a MAX30102 chip, a monitor chip showing the engine's decision, and a SIM800L chip with a phone screen that receives the SMS ladder. Build with python run.py wokwi; run in the browser in two minutes, see wokwi/README.md.tests/test_firmware_sil.py, tests/sil/): the same firmware compiled for the laptop and driven through a month.docs/demo/hridaymitra_month_demo.mp4, one month of the stool firmware driving the Wokwi screens.Run from source_code/.
| Step | Command |
|---|---|
| Synthetic patients (PS cohort, 200 × 60 days) | python sim/patients/make_patients.py |
| Real-world cohort (1,000 × 180 days) | python sim/patients/make_patients.py --patients 1000 --days 180 --event-fraction 0.1 --seed 43 --out data/processed/realworld |
| Tune on training patients, freeze, test once | python engine/leadtime_v2.py |
| Stress tests and ablations | python engine/stress_and_ablation.py |
| Assumption sensitivity | python engine/assumption_sensitivity.py |
| Published-trial calibration | python engine/calibrate_published.py |
| ML comparator, hybrid engine, benchmark | python engine/ml_comparator.py, python engine/hybrid.py, python benchmark/bench.py |
| Score your own method | python benchmark/score.py my_submission.csv test |
| Care-loop simulator | python sim/careloop/careloop.py |
| Heart rate on PhysioNet BIDMC CHF | python engine/validate_bidmc_hr.py |
| LTspice: legs, chest paths, Monte Carlo, hum (needs LTspice) | python sim/circuit/trunk_paths.py, montecarlo.py, hum.py |
| KiCad schematic + ERC + netlist checks (needs KiCad 9) | python tools/make_schematic.py |
| Block diagram, cost simulation | python tools/make_block_diagram.py, python tools/cost_sim.py |
Every synthetic-patient parameter carries a source or is marked ASSUMPTION in data/processed/DATA.md; each ASSUMPTION was pushed low and high in the sensitivity sweep.
Judge folders at the top level (01_ … 05_, Deliverables/); all code in source_code/:
Folder (inside source_code/) | What is inside |
|---|---|
engine/ | signals.py (raw → numbers), alert_engine.py (baseline, scores, lights, reasons), hybrid.py, product.py (sick-day plan, coaching, two users, FHIR), sts.py (sit-to-stand), evaluate.py (the four PS measures, no-peeking check), baselines, tuning scripts, frozen thresholds |
benchmark/ | Open benchmark v2: fixed splits with sha256, public scorer with bootstrap ranges, 5 baselines, leaderboard |
sim/patients/ | Synthetic patient generator |
sim/circuit/ | LTspice netlists and analyses |
sim/careloop/ | alert → family → ASHA → doctor simulator |
firmware/ | Stool (ESP32) and amulet (ESP32-C3) sketches |
hardware/kicad/ | Schematic, ERC report, netlist |
wokwi/ | Wokwi projects and custom chips |
app/ | Saathi PWA |
demo/ | Streamlit dashboard |
tools/ | Generators for documents, schematics, voice clips, Wokwi projects, stool bridge, cost simulation, progress.py |
tests/ | pytest suite plus C++ parity checks |
data/ | Synthetic cohorts and public BIDMC ECG |
reports/ | All results (CSV, PNG, summaries) |
docs/ | Report, pitch, build guide, wiring guide, evidence, decisions, app phase docs |
docs/research_notes/ | Background research that shaped the design |
progress.json | Workstream progress, rendered by tools/progress.py |
docs/HridayMitra report.pdf (2 pages) and docs/HridayMitra pitch deck.pdf, plus docs/PITCH_SCRIPT.md; regenerated from live results by python run.py docs.docs/EVIDENCE.md: requirement traceability, failure modes and safeguards, assumption ledger.docs/DECISIONS.md: starting ideas, every design decision with evidence, next improvements.docs/.| Problem | Fix |
|---|---|
Imports fail in python run.py test | Use Python 3.11, then python run.py setup |
npm run build complains about missing /models/*.bin | python tools/prepare_voice_models.py (downloads and checks sha256) |
| "Install app" not offered on the phone | Not HTTPS / localhost, or first load unfinished; reload and wait for "App ready offline" |
Phone cannot reach localhost:4173 | Re-run adb reverse tcp:4173 tcp:4173; check adb devices lists the phone |
| No Bluetooth button in the app | Use Chrome on Android; iOS Safari has no Web Bluetooth |
| Firmware compile or upload fails | Install the esp32 core for arduino-cli; check the COM port; hold BOOT while flashing if the board does not enter download mode |
MIT. The medical-safety limits above still apply: this is a research prototype, not a medical device.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 5 | 100n | C_0805_2012Metric | C6, C7, C8, C9, C13 |
| 4 | 1k | R_0805_2012Metric | R6, R7, R12, R13 |
| 4 | MountingHole_3.2mm_M3 | MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 1u | C_0805_2012Metric | C2, C3, C4 |
| 2 | 10M | R_0805_2012Metric | R8, R9 |
| 2 | 10k 1% | R_0805_2012Metric | R1, R2 |
| 1 | 1.5k | R_0805_2012Metric | R11 |
| 1 | 100 0.1% (Rcal) | R_0805_2012Metric | R22 |
| 1 | 100k | R_0805_2012Metric | R3 |
| 1 | 10n | C_0805_2012Metric | C5 |
| 1 | 10u | C_0805_2012Metric | C1 |
| 1 | 120 | R_0805_2012Metric | R5 |
| 1 | 16k (15k+1k) | R_0805_2012Metric | R10 |
| 1 | 4.7k 1% | R_0805_2012Metric | R4 |
| 1 | 74HC4052 (current pair) | SOIC-16_3.9x9.9mm_P1.27mm | U4 |
| 1 | 74HC4052 (sense pair) | SOIC-16_3.9x9.9mm_P1.27mm | U5 |
| 1 | 74HC4053 (body / referen | SOIC-16_3.9x9.9mm_P1.27mm | U3 |
| 1 | Electrodes: 4 foot plate | JST_XH_B8B-XH-A_1x08_P2.50mm_Vertical | J1 |
| 1 | INA126 | SOIC-8_3.9x4.9mm_P1.27mm | U2 |
| 1 | MCP6002 | SOIC-8_3.9x4.9mm_P1.27mm | U1 |
| 1 | to ESP32 DevKit | PinHeader_1x08_P2.54mm_Vertical | J13 |
It measures 70 × 50 mm and has 2 copper layers, 1.6 mm thick.
35 parts, built around the INA126U and MCP6002-I/P. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the aadityaa0523/HridayMitra repository on GitHub, at the commit this page was made from: the board is source_code/hardware/pcb/hridaymitra_afe.kicad_pcb and its schematic source_code/hardware/kicad/hridaymitra.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

CohenLabPrinceton/pvp
Raspberry pi code for controlling the rapid-deploy critical care ventilator

simlun/i2c-weight-scale
I²C Weight Scale: strain gauges in a Wheatstone bridge amplified in an instrumentation amplifier, A/D converted and made available over I²C in a PIC microcontroller

AGVOLUTION/arduino_weatherstation
Embedded software and hardware design for Arduino MKR-board based Weatherstation (Atmel SAMD processors).

aindustriosa/UnderWaterComms
UnderWater ultrasonic communications project

jsvana/coffeetron
Arduino sketch to pour a shot of espresso in a Gaggia Classic Pro to a specific weight.

SimonDaniel605/Development-of-a-Resistojet-Thruster
This project involves the development of a resistojet thruster for nanosatellite station-keeping.

timohueser/MyoSense
As mentioned before the MyoSense Sensor Modules use dry stainless steel electrodes to pick up the small voltages generated by muscle activity on the skin above the monitored muscle.

waterloo-rocketry/daq
Data Acquisition schematics, boards, datasheets, docs, and software