A standard 10kΩ linear taper (B10K) potentiometer in an Arduino circuit should measure exactly 10kΩ across the two outer pins, and sweep smoothly from 0Ω to 10kΩ between the center wiper and either outer pin as you rotate the shaft. If your Arduino analogRead() values are jumping erratically or stuck at 1023, the issue is almost always wiper contact resistance, a floating ground reference, or ESP32 ADC non-linearity—not your code. Before you rewrite your sketch, grab your multimeter and verify the hardware.

Multimeter Setup and Probe Placement for Potentiometer Verification

Testing a potentiometer requires measuring both fixed resistance and variable resistance. You must isolate the component from the Arduino to get accurate readings; measuring resistance while the circuit is powered will yield ghost voltages and can damage your multimeter's internal shunt resistors.

⚠️ Safety & CAT Rating Note: For standard 5V or 3.3V Arduino breadboard circuits (Safety Extra Low Voltage), a CAT I or CAT II multimeter is perfectly adequate. However, if your potentiometer is wired into a mains-voltage DIY triac dimmer or motor controller, you must de-energize the mains, verify dead with a CAT III/IV meter, and physically disconnect the pot from the high-voltage side before taking resistance measurements. Never measure resistance on a live circuit.

Meter Setup Block

  • Dial Position: Resistance (Ω). If using a manual-ranging meter, set it to the 20kΩ range for a standard 10kΩ pot.
  • Lead Jacks: Black lead in COM, Red lead in V/Ω.
  • Preparation: Touch the probe tips together. The meter should read 0.1Ω to 0.5Ω (this is your lead resistance; subtract it if you need extreme precision at the low end of the sweep).

Probe Placement Guide

Most through-hole and breadboard potentiometers (like the Bourns 3386 or Alpha 16mm series) have three pins in a row. Facing the shaft, the pins are typically Pin 1 (CCW), Pin 2 (Wiper), and Pin 3 (CW).

  1. Total Resistance Test: Place probes on Pin 1 and Pin 3. Rotate the shaft; the reading should remain completely static.
  2. Wiper Sweep Test: Place one probe on Pin 2 (Wiper) and the other on Pin 1. Rotate the shaft from fully counter-clockwise to fully clockwise. The resistance should sweep smoothly from ~0Ω to the total resistance value.

Expected Readings: Good vs. Bad Potentiometer Values

The table below details the exact numerical thresholds for a standard 10kΩ Linear (B10K) potentiometer. Use this as your benchmark when diagnosing noisy analog inputs or dead zones in your Arduino project.

Test Point Shaft Position Expected Reading (Good) Failing Reading (Bad) Probable Failure Mode
Outer Pins (1 & 3) Any 9.5kΩ - 10.5kΩ >11kΩ, <8kΩ, or OL Resistive carbon track degradation, overheating, or blown element.
Wiper (2) to Pin 1 0% (Fully CCW) 0.1Ω - 5.0Ω >50Ω Wiper contact oxidation, dirty track, or weak wiper spring tension.
Wiper (2) to Pin 1 50% (Mid-point) 4.8kΩ - 5.2kΩ Erratic jumps or >6kΩ Worn carbon track, physical scratching, or loose internal wiper.
Wiper (2) to Pin 3 100% (Fully CW) 9.5kΩ - 10.0kΩ OL (Open Loop) or drops to 0Ω Open circuit at the mechanical end stop or wiper lifted off track.

Note on Audio/Logarithmic Tapers (A10K): If you are using an audio-taper potentiometer (often marked with an 'A' instead of 'B'), the 50% mid-point mark will not read 5kΩ. Due to the logarithmic curve, a 10kΩ audio pot will typically read between 1.0kΩ and 2.0kΩ at the physical midpoint when measured from the CCW pin. This is normal and not a sign of a defective component (All About Circuits).

Common Measurement Mistakes and Misleading Readings

Even with a good multimeter, technique errors can make a perfectly good potentiometer look broken, or mask a failing one. Avoid these common bench mistakes:

1. The "Finger Resistance" Parallel Path

The human body has a skin resistance ranging from 10kΩ to 100kΩ depending on moisture. If you hold the metal probe tips and the potentiometer pins simultaneously with your bare fingers, your body creates a parallel resistor network. On a 10kΩ pot, this can skew your high-end readings by 20% or more. Fix: Use alligator clip leads, or hold the plastic probe shafts and the plastic body of the potentiometer while taking the measurement.

2. Measuring In-Circuit Without Power Isolation

If you leave the potentiometer wired to the Arduino's 5V and GND rails while measuring resistance, the multimeter's internal test current will flow through the Arduino's voltage regulator and decoupling capacitors. This parallel path will usually result in a reading much lower than 10kΩ, leading you to falsely condemn the part. Fix: Always pull at least one leg of the potentiometer out of the breadboard, or disconnect the jumper wires before switching your meter to the Ohms setting.

3. Ignoring the Mechanical "Dead Zone"

Cheap carbon-track potentiometers (often found in bulk Arduino starter kits) have a physical dead zone of 5° to 10° at both mechanical stops. In these zones, the wiper is resting on the bare metal terminal rather than the resistive carbon. If your Arduino serial plotter shows a "flat spot" where the value stays at exactly 0 or exactly 1023 for the first and last 5% of the physical rotation, the pot isn't broken—it's just a low-tolerance part. Fix: Map your software to ignore the extreme 0-50 and 970-1023 ADC ranges.

4. The Floating Wiper (Rheostat Wiring Error)

When using a potentiometer as a variable resistor (rheostat) to limit current or tune a frequency, beginners often wire only the wiper and one outer pin, leaving the third pin floating. If the wiper momentarily loses contact with the carbon track due to vibration or dirt, the Arduino analog input becomes a floating, high-impedance node, picking up 60Hz mains hum and random noise. Fix: Always jumper the unused outer pin directly to the wiper pin. This ensures that if the wiper lifts, the circuit defaults to maximum resistance rather than an open circuit.

Live ADC Verification with Arduino and ESP32

Once your multimeter confirms the hardware is mechanically and electrically sound, you must verify that the microcontroller's Analog-to-Digital Converter (ADC) is interpreting the voltage correctly. Wire Pin 1 to GND, Pin 3 to 5V (or 3.3V), and the Wiper (Pin 2) to an analog pin (e.g., A0).

Standard Arduino (Uno/Nano/Mega) Verification

The ATmega328P features a 10-bit ADC, meaning it maps the 0-5V range to integer values between 0 and 1023. Upload this minimal verification sketch to check for linearity and noise:

const int potPin = A0;

void setup() {
  Serial.begin(115200);
  analogReference(DEFAULT); // 5V on Uno/Nano
}

void loop() {
  int rawADC = analogRead(potPin);
  float voltage = rawADC * (5.0 / 1023.0);
  Serial.print("Raw: ");
  Serial.print(rawADC);
  Serial.print(" | Voltage: ");
  Serial.println(voltage, 3);
  delay(100); // Prevent serial buffer flooding
}

Open the Serial Plotter in the Arduino IDE. As you turn the shaft, you should see a smooth, straight diagonal line. If you see "stair steps" or sudden vertical drops, your potentiometer has a dirty track. A quick spray of contact cleaner (not standard WD-40) into the wiper slot, followed by 20 full rotations, usually clears carbon dust.

The ESP32 ADC Non-Linearity Gotcha

If you are using an ESP32 (like the DevKit V1 or WROOM-32), you will encounter a well-documented hardware quirk: the ESP32's 12-bit ADC (0-4095) is notoriously non-linear at the voltage extremes. Readings below 150 (approx. 0.1V) and above 3100 (approx. 2.5V on a 3.3V system) will flatten out, meaning your potentiometer will appear to have massive dead zones at both ends of its rotation (Espressif ADC Docs).

The Fix: Do not use raw analogRead() for precision voltage mapping on the ESP32. Instead, use the built-in calibrated function analogReadMilliVolts() available in modern ESP32 Arduino cores, or restrict your physical potentiometer sweep to the linear middle range (0.2V to 2.4V) by adding fixed resistors in series with the outer pins to create a hardware voltage divider.