Overview
This project tests and compares the ADC performance of three popular platforms:
- Arduino Uno — 10-bit internal ADC
- ESP32 — 12-bit internal ADC
- ADS1115 — 16-bit external I²C ADC
The main focus is linearity, noise, and measurement stability using identical input voltage for all ADCs.
Test Setup
The test setup ensures fair comparison and accurate measurements:
- Input Voltage: 0 V–3.3 V adjustable using a multi-turn potentiometer (fine control down to 1 mV)
- Buffering: Voltage follower op-amp prevents loading effects
- Noise Reduction: RC low-pass filter minimizes input noise
- Power Supply: Lead-acid battery to avoid SMPS switching noise
- ADC Timing: Minimum 20 ms between consecutive readings ensures proper settling
Circuit Diagram:

Data Collection Method
- ESP32 collects ADC data from Arduino Uno (UART), ADS1115 (I²C), and its own ADC.
- All readings are sent to PC via USB and logged in a CSV file using Python.
- Two main experiments:
1️⃣ Linearity Test
- 88 voltage points, 100 samples per point
- Plots show ADC linearity and allow ESP32 calibration
2️⃣ Noise Test
- 5 fixed voltage points, 1000 samples per point
- Histograms and standard deviation calculated for stability evaluation
Source Codes
All codes are available on GitHub:
- Arduino Uno:
adc_test_arduino_uno.ino - ESP32:
adc_test_esp32.ino - Python Logger:
adc_test_N_samples.py
Linearity Results
Linearity Comparison:
- Arduino Uno & ADS1115 almost perfectly linear
- ESP32 shows non-linearity with dead zone <0.13 V and saturation >3.18 V

ESP32 2-Point Calibration (0.501 V & 2.000 V):
- Improves usable range to ~0.15 V–2.5 V

Noise Results (Noise + Histogram)
ESP32: Highest fluctuation, wide histogram — filtering & calibration required

Arduino Uno: Stable but quantization steps visible due to 10-bit resolution

ADS1115: Most stable, lowest noise

Standard Deviation Comparison
Numeric comparison of noise level: lower SD = better stability

Rupayan Halder
ADS1115 performed best overall (linearity & noise)
Arduino Uno ADC is stable but resolution-limited
ESP32 requires calibration; raw readings have non-linearity and high noise