AquaLoop
▲ 1ST @ MAKEOHI/O
Closed-loop water reuse system for semiconductor fabs — hardware, firmware, and ML.

MISSION BRIEF
Designed and prototyped a hardware-software closed-loop system for semiconductor fab water reuse. Integrated 4 sensors with custom signal conditioning circuits and routed output via 3-way solenoid pump controlled by Arduino. Programmed C++ firmware on Arduino for real-time sensor polling (sub-1s latency), data acquisition, and pump actuation logic. ML sidecar with Random Forest/SVM achieved 92.8% accuracy on 4K water-quality dataset.
THE PROBLEM
Semiconductor fabs use large volumes of ultrapure water to rinse wafers, and much of it is used once and discharged even when it's clean enough for less demanding uses. The challenge at MakeOHI/O 2026 (Intel track) was to make that water reusable without a person checking every batch. We set out to grade rinse water in real time and route it automatically: clean enough for high-grade reuse, good enough for a utility loop, or sent to treatment.
APPROACH
We framed it as a three-class decision: high-grade reuse, utility loop, or treatment and discharge. Four sensors measure turbidity, total dissolved solids, temperature, and pH, and two flow readings track inflow and outflow. An Arduino reads them about once a second and drives a 3-way solenoid valve and pump to send water to the right outlet. The routing logic starts with a transparent score based on WHO-aligned thresholds. Turbidity carries 40% of the weight, TDS 25%, pH 20%, and temperature 15%, and the total maps to the three classes. On top of that we trained a Random Forest classifier with engineered features (TDS-to-turbidity ratio, inflow minus outflow, and pH and temperature deviation from neutral), so the system could learn interactions the fixed thresholds miss.
ARCHITECTURE
Arduino firmware in C++ polls the sensors, conditions the signals, and actuates the valve. A Python bridge reads the serial stream, converts each line to timestamped JSON, and serves it over a local WebSocket, because browsers can't read a serial port directly. The React dashboard connects to that WebSocket and shows live sensor strips, an animated Three.js loop schematic, analytics charts with batch history, and a model page with the confusion matrix and feature importances. It can also run on simulated data when no hardware is attached, which made the judging demo reliable.
RESULTS
Won 1st place in the Intel Challenge at MakeOHI/O 2026. The classifier reached 92.8% test accuracy and 94.0% ± 0.5% in 5-fold cross-validation on a 5,000-sample dataset (4,000 train, 1,000 test) generated from the WHO-aligned scoring rules. Turbidity and TDS were the most important features, which matches how the thresholds were weighted.
WHAT I'D DO DIFFERENTLY
The training data was synthetic, so the model mostly learned our own thresholds back. The next step is to log real sensor readings from the prototype, label them with lab measurements, and retrain on that, so the accuracy reflects real water and not a generator.