# Uncalibrated bench characterisation of low-cost turbidity, TDS, pH and level sensors on Arduino Uno R4 WiFi

- Version: v1.1, published 21 October 2026
- Written by: Nanupatruni Mahesh Kumar
- Reviewed by: Ravi Kumar Chintalapudi
- Domains: Sensing
- Readiness: TRL 3, experimental proof of concept
- Tested on: An Arduino Uno R4 WiFi (Renesas RA4M1, 14-bit ADC) with a KIE-TS-300B turbidity module, a generic two-needle TDS module, a PH-4502C pH module and an XKC-Y25-PNP level switch; one bench session per sensor, in dry air and household liquids, read through the board's uncalibrated ADC
- Standards: None followed. ISO 10523 (pH), ISO 7888 (conductivity), ISO 7027-1 and IS 3025 (Part 10):2023 (turbidity) are planned for the calibration phase
- Full paper: [PDF, 21 pages, 1.5 MB](https://dharanova.com/whitepapers/uncalibrated-water-sensors-arduino-uno-r4-wifi.pdf)

## Summary

Four sensor modules for a water-monitoring system (turbidity, TDS, pH, and water level) were each wired to an Arduino Uno R4 WiFi and tested in one bench session in dry air and household liquids, without reference standards. All four produced signals distinct from dry air and moving in the expected direction. Acidic water moved the pH output by +0.920 V and salt water by only +0.044 V. One turbid sample spanned 0.83 V depending on agitation alone. The TDS module ranked RO, drinking and tap water correctly but read distilled water out of order. No reading is calibrated and the ADC reference is unverified, so the work is an experimental proof of concept below TRL 4. The paper turns the observed effects into six rules for the calibration protocol and sets out the path to TRL 4.

## Key findings

- **pH.** Acidic lemon water moved the output +0.920 V from near-neutral water; salt water moved it only +0.044 V. The probe responds strongly to acidity and only slightly to salinity.
- **Turbidity.** One turbid sample read anywhere across a 0.83 V span depending only on how recently it was stirred. Sample agitation must be fixed before calibration.
- **TDS.** Two dips into the same distilled water agreed within 1.67 %, but distilled water read 6.4 times higher than RO water, against the expected order.
- **Water level.** The switch reported dry and wet correctly with no chatter, over a single transition.
- **Protocol.** Six rules for the calibration phase, each traced to a measured effect (Figure 10).
- **Readiness.** Experimental proof of concept (TRL 3), with a defined path to TRL 4 (Figure 12). No reading is calibrated yet.

## Figures shown on the page

- Figure 1: The four sensors as tested, each in its own session on an Arduino Uno R4 WiFi and read over USB serial. Block diagram of the four set-ups, each tested in its own session. Turbidity: KIE-TS-300B turbidity module, OUT to A0, on an Arduino Uno R4 WiFi with a 14-bit ADC and 200 ms averaging. TDS: two-needle probe and generic TDS module, AOUT to A0, 14-bit ADC, 200 ms average and a filter. pH: glass electrode on BNC and PH-4502C module, PO to A0, 14-bit ADC, 200 ms average. Water level: XKC-Y25-PNP capacitive switch, PNP output to D2, digitalRead with a 50 ms debounce. All four report over USB serial at 115200 baud, one JSON line per second, logged with arduino-cli, with settled readings recorded in each session. Marked as later and not part of this work: integration into one water-monitoring system.
- Figure 6: Turbidity module output per condition. Clear liquids read above dry air; the four powder-suspension readings of the same cup spread widely with agitation. Range chart of the KIE-TS-300B's output voltage, uncalibrated, on 2026-10-19, with the dry-air baseline marked. Dry air 3.081 to 3.082 V; distilled water 3.574 to 3.576 V; lemon water 3.48 V; powder suspension, dip 1, 3.00 to 3.13 V; dip 2, more powder and still mixing, 2.41 to 2.66 V; dip 3, unstirred minutes later, 3.12 to 3.24 V; continuously stirred, 2.81 to 2.95 V.
- Figure 7: TDS module output per condition. RO, canned and tap water rise in the expected order; both distilled-water dips sit out of order between canned and tap water. Range chart of the generic two-needle TDS module's output voltage, uncalibrated, on 2026-10-17, with the dry-air baseline marked. Dry air 0.006 V; RO water (user-described) 0.079 V; canned or bottled drinking water 0.100 to 0.101 V; distilled water, dip 1, 0.507 to 0.508 V; distilled water, dip 2, 0.516 V; fresh tap water 0.721 V.
- Figure 8: pH module output per condition. Tap, distilled and salt water cluster together; acidic lemon water stands well apart. The excluded unplugged-electrode reading is not shown. Range chart of the PH-4502C module's output voltage, uncalibrated, on 2026-10-19, with the dry-air baseline marked. Tap water 1.370 to 1.372 V; distilled water 1.387 to 1.389 V; salt water (table salt in tap water) 1.422 to 1.425 V; dry air 1.486 V; lemon water (diluted, acidic) 2.299 to 2.300 V.
- Figure 10: Six rules for the calibration protocol, each traced to an effect observed in this work. Six rows, each pairing what the bench showed with what the calibration protocol must do. Turbidity: a 0.83 V spread in one cup of turbid water from agitation alone, so fix the agitation state, stirring continuously or reading at a fixed time after stirring stops. pH: 25 to 60 s to settle after immersion, so set warm-up from measured settling data; the 500 ms firmware placeholder is far too short. pH: 1.121 V between near-neutral output and the firmware's 2.5 V placeholder, so calibrate with certified buffers on both sides of pH 7 before reporting any pH value. TDS: distilled water read 6.4 times higher than RO water, against the expected order, so take calibration constants only from certified standards, never from an unverified sample. ADC: 19.1 to 19.2 % of full scale with A0 jumpered to 5 V, where near 100 % was expected, so verify the ADC chain with a calibrated multimeter before any calibration run. Records: the raw serial stream, temperatures, sample recipes and containers were not saved, so log the raw stream to CSV and record temperature, sample recipe, container and immersion depth.
- Figure 12: Path from this work to TRL 4. Five steps in sequence. 1, set limits first: pass/fail limits for accuracy, repeatability and settling, fixed before testing. 2, verify the chain: a calibrated multimeter on the 5 V rail and a reference voltage on A0. 3, get standards: pH buffers 4, 7 and 10, two conductivity standards and turbidity standards. 4, calibrate and repeat: runs repeated on more than one day, with raw CSV and temperature saved, and both level transitions. 5, validate: check each calibration against a held-out sample. These lead to TRL 4, each sensor validated in the lab against defined criteria. Then: define the relevant environment (TRL 5) and integrate one multi-sensor node (TRL 6).

## Related reading

- [What a sensor actually is](https://dharanova.com/learn/what-is-a-sensor.md): background on Learn
- [Analog-to-digital conversion](https://dharanova.com/learn/adc-basics.md): background on Learn
- [Accuracy, precision and resolution](https://dharanova.com/learn/accuracy-precision-resolution.md): background on Learn
- [Signal conditioning](https://dharanova.com/learn/signal-conditioning.md): background on Learn
- [Taking a load cell apart until it makes sense](https://dharanova.com/inside-a-load-cell.md): an engineering note from our team
- [Environmental sensors for VAHA: wiring, how readings reach the app, and two TVOC data-integrity gaps](https://dharanova.com/whitepapers/vaha-environmental-sensors-tvoc-data-integrity.md): another whitepaper

This paper documents component-level work in the lab. It is not a product specification.
