When a DIY MIDI controller, motor speed dial, or custom dimmer starts outputting erratic values to the serial monitor, the fault usually lies in one of two places: a failing carbon track inside the potentiometer, or a misconfigured Analog-to-Digital Converter (ADC) on the microcontroller. Guessing which one is broken wastes hours. By combining a systematic multimeter sweep with targeted ADC debugging, you can isolate the failure in under five minutes.

Multimeter Setup and Probe Placement for Potentiometer Testing

Before probing the circuit, configure your digital multimeter (DMM) correctly. A standard auto-ranging meter is ideal, but manual ranging requires specific dial positions to avoid resolution loss.

Safety Category (CAT) Rating: For a 5V DC breadboard circuit, a CAT II 600V or CAT III 600V multimeter is the correct safety category. While the Arduino circuit itself is low voltage, CAT-rated meters contain internal high-rupture-capacity (HRC) fuses and blast shields. This protects you if the meter is accidentally left in resistance mode and later used on a mains-powered bench supply or wall outlet.

Meter Setup Block

  • Dial Position: Resistance / Ohms (Ω). Do not use the continuity beep setting, as it only checks for < 30Ω and will not display the sweep curve.
  • Lead Jacks: Black lead in COM, Red lead in V/Ω/mA. (Never use the 10A high-current jack for resistance measurements; it bypasses the internal fuse and can blow the meter's shunt).
  • Range: Auto-range, or manual 20kΩ / 200kΩ setting depending on your pot's nominal value.

Probe Placement per Test Point

A standard 3-pin rotary or slide potentiometer has two outer stator lugs (Pins 1 and 3) connected to the resistive carbon track, and a center wiper lug (Pin 2) that slides along the track.

  1. Total Track Resistance: Place probes on Pin 1 and Pin 3. Rotate the shaft fully back and forth. The reading should remain rock-solid.
  2. Wiper Sweep (CCW to CW): Place the black probe on Pin 1 (ground reference) and the red probe on Pin 2 (wiper). Rotate the shaft slowly from the counter-clockwise (CCW) stop to the clockwise (CW) stop.

Expected Readings: Good vs. Bad Potentiometer Values

The table below outlines exact numerical expectations for a standard B10K (10kΩ linear taper) potentiometer, such as the common Bourns 3386P or ALPS RK09K series. Use this as your benchmark. If your readings deviate significantly from the 'Good' column, the component is defective or the wrong taper.

Table 1: B10K Potentiometer Multimeter Diagnostics
Test Point & Action Dial Position Expected Good Reading Bad Reading (Failure Mode)
Pins 1 & 3 (Static) Ohms (Ω) 9.5kΩ to 10.5kΩ (±5% tolerance) OL / Open (broken track) or < 5kΩ (shorted track)
Pins 1 & 2 at CCW Stop Ohms (Ω) 0Ω to 15Ω (wiper contact resistance) > 100Ω (dirty wiper, causes dead-zone at low end)
Pins 1 & 2 at 50% Travel Ohms (Ω) 4.8kΩ to 5.2kΩ (Linear taper) ~1.5kΩ or ~8.5kΩ (Wrong taper: Audio/Logarithmic instead of Linear)
Pins 1 & 2 at CW Stop Ohms (Ω) 9.5kΩ to 10.5kΩ Fluctuating wildly (wiper lifting off track at end of travel)
Wiper Sweep (Slow rotation) Ohms (Ω) Smooth, monotonic increase Sudden jumps to OL or drops to 0 (pitted carbon track / mechanical wear)

Note on Tapers: If you are testing an Audio (Logarithmic/A-taper) potentiometer, the 50% travel reading will not be 5kΩ. It will typically read around 1.5kΩ to 2kΩ, as the resistance curve is skewed to match human hearing perception. Always verify the taper code printed on the casing (B = Linear, A = Audio/Log).

Interfacing the Potentiometer and Arduino: ADC Debugging

Once the multimeter confirms the potentiometer is mechanically and electrically sound, the issue lies in the microcontroller interface. A potentiometer wired to an Arduino acts as a variable voltage divider. The wiper outputs a voltage between 0V and VCC, which the microcontroller's ADC quantizes into a digital number.

On a standard 5V Arduino Uno or Nano (ATmega328P), the ADC is 10-bit, yielding 1024 discrete steps (0 to 1023). The resolution is 5.0V / 1024 = 4.88mV per step. According to the official Arduino analogRead documentation, the default analog reference voltage (AREF) is tied to the board's operating voltage (5V).

Mistakes That Give Misleading ADC Readings

If your serial monitor shows values that don't match the physical knob position, check for these common wiring and configuration errors:

  • The 3.3V vs 5V Reference Trap: If you power the potentiometer with 5V but connect it to a 3.3V microcontroller (like an ESP32 or Arduino Due), the ADC will clip. A 3.3V ESP32 has a 12-bit ADC (0-4095). If you feed it 5V, the reading will hard-clip at roughly 2700 (3.3V equivalent) long before the knob reaches its physical end, and you risk damaging the GPIO pin. Always match the pot's VCC to the microcontroller's logic level.
  • Floating Ground Reference: If the ground wire between the Arduino GND and the potentiometer Pin 1 is loose, the ADC pin will float. You will see erratic, high-value readings (e.g., jumping between 800 and 1023) even when the knob is at the zero position. The ADC requires a shared, low-impedance ground plane to measure the voltage divider accurately.
  • Digital Pin Assignment: Using analogRead() on a strictly digital pin (like D4 on an Uno) instead of an Analog pin (A0-A5) will result in readings that snap only between 0 and 1023, acting like a digital switch rather than a smooth sweep.

Troubleshooting Jitter and Non-Linear Sweeps

A 'good' potentiometer on a multimeter might still cause jitter when read by an Arduino. The serial monitor might flicker ±3 steps even when your hand is completely off the knob. This is rarely a bad pot; it is usually ADC quantization noise, USB power supply ripple, or high-impedance wiper contact issues.

Hardware Fix: The 100nF Bypass Capacitor

The ADC sample-and-hold circuit inside the ATmega328P requires a brief burst of current to charge its internal capacitor. If the potentiometer is set to a high resistance (e.g., 100kΩ or higher), the carbon track cannot supply this current fast enough, resulting in inaccurate, jittery readings. As noted in SparkFun's voltage divider applications guide, high-impedance dividers struggle to drive ADC inputs directly.

The Fix: Solder a 100nF (0.1µF) X7R ceramic capacitor directly between the wiper pin (Pin 2) and Ground. This capacitor acts as a local charge reservoir, stabilizing the voltage during the ADC sampling window and instantly killing high-frequency jitter.

Software Fix: Moving Average Filter

If hardware filtering isn't enough, or you are using a 100kΩ pot where the capacitor creates too much physical damping (making the knob feel 'laggy' in a UI), implement a software moving average. This smooths out the quantization noise without altering the physical feel of the dial.

const int potPin = A0;
const int numReadings = 16; // Must be a power of 2 for fast bit-shifting
int readings[numReadings];
int readIndex = 0;
long total = 0;

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < numReadings; i++) {
    readings[i] = 0;
  }
}

void loop() {
  total = total - readings[readIndex];
  readings[readIndex] = analogRead(potPin);
  total = total + readings[readIndex];
  readIndex = (readIndex + 1) % numReadings;
  
  // Bit-shift right by 4 is equivalent to dividing by 16, but much faster
  int average = total >> 4; 
  
  Serial.println(average);
  delay(10); // Stabilizes the loop rate
}

When to Suspect the Wiper Contact Resistance

If your jitter only occurs at the extreme CCW (zero) position, measure the resistance between Pin 1 and Pin 2 with the knob fully counter-clockwise. If it reads above 15Ω, the wiper is oxidized or dirty. While contact cleaner (like DeoxIT D5) can temporarily restore a sealed potentiometer, open-frame trimpots or cheap carbon pots with high contact resistance should be replaced with wirewound or conductive plastic alternatives (e.g., Bourns 3590 series) for mission-critical analog inputs.