Back to Guides
Makers Guide / Power Supplies

Voltage Follower (Buffer) Explained: The Circuit Every Maker Needs

Op-amp voltage follower buffer circuit on a breadboard

You wire up a sensor, read the voltage with your Arduino, and the number is completely wrong. You double-check your wiring. Everything looks fine. What happened? Chances are, your circuit has an impedance mismatch problem — and the fix is one of the simplest, most useful circuits in all of electronics: the voltage follower, also called a buffer.

A voltage follower copies a voltage from one part of your circuit to another without stealing current from the source. It is the electronic equivalent of looking at a thermometer without touching the mercury — you get the reading without disturbing it.

📊 What You'll Learn

  • Why impedance mismatch corrupts sensor readings
  • How an op-amp voltage follower works (with zero math first, then the equations)
  • How to build a buffer circuit on a breadboard with an LM358 or TL072
  • Arduino code to compare buffered vs. unbuffered sensor readings
  • Real-world applications from audio gear to medical devices
  • Common mistakes that trip up beginners (and how to avoid them)

1. The Impedance Problem — Why You Need a Buffer

Imagine trying to fill a swimming pool using a garden hose. The hose delivers water just fine. Now imagine someone connects a fire truck pump to the same garden hose to suck water out faster than the hose can supply it. The pressure drops to almost nothing. That is exactly what happens when a high-impedance source (like a sensor or a voltage divider) tries to drive a low-impedance load (like an Arduino ADC pin or a speaker).

Impedance is a measure of how much a component resists the flow of current. A source with high output impedance can only supply a tiny amount of current. If the load demands more current than the source can provide, the voltage sags — and your reading becomes inaccurate.

💡 Real Example: Voltage Divider Feeding an Arduino

A voltage divider made from two 100kΩ resistors should output exactly half the supply voltage. But the Arduino Uno's ADC has an input impedance of about 10kΩ during sampling. That 10kΩ loads the divider, pulling the voltage down significantly. With a buffer between the divider and the ADC, the reading stays accurate because the buffer's input impedance is in the millions of ohms — it draws almost no current from the divider.

When Do You Need a Buffer?

  • High-impedance sensors — piezoelectric pickups, pH probes, capacitive touch sensors
  • Voltage dividers — any resistive divider feeding an ADC, especially with resistors above 10kΩ
  • Signal conditioning chains — between filter stages where loading would change the filter response
  • Reference voltages — sharing one reference across multiple loads without sagging
  • Audio circuits — between a guitar pickup and an amplifier input

2. How a Voltage Follower Works

A voltage follower is an op-amp (operational amplifier) wired in the simplest possible configuration: the output is connected directly back to the inverting (−) input, and the signal you want to copy goes into the non-inverting (+) input.

+ VIN VOUT Feedback: output tied to inverting (−) input +VCC GND Op-Amp Voltage Follower (Buffer)

Here is the key insight: the op-amp will do whatever it takes to make its two inputs equal. Since the output is wired to the − input, the op-amp drives its output to match the + input. The result? Vout = Vin. The output voltage is an exact copy of the input voltage.

Why Not Just Connect a Wire?

A wire copies the voltage too, but it also connects the source directly to the load. The load's current demand flows back through the source, pulling the voltage down. The op-amp buffer isolates the source from the load. It has:

  • Very high input impedance (10 MΩ to 1 TΩ) — draws almost zero current from the source
  • Very low output impedance (typically <1Ω) — can supply current to the load without voltage drop
  • Unity gain — output equals input (gain = 1)

The Math (Simple Version)

For a non-inverting amplifier, the gain formula is:

Non-inverting amplifier gain formula: Gain = 1 + (Rf / Ri) In a voltage follower: Rf = 0 (direct wire) Ri = ∞ (no resistor) Gain = 1 + (0 / ∞) = 1 VOUT = VIN

3. Choosing an Op-Amp for Your Buffer

Not all op-amps are created equal. The right choice depends on your supply voltage, signal frequency, and whether you need the output to reach 0V (ground).

Op-Amp Supply Rail-to-Rail Input Type Bandwidth Best For
LM358 3–32V Output only (to GND) Bipolar 1 MHz General purpose, DC signals, cheapest option
TL072 ±6–18V No JFET 3 MHz Audio, higher impedance sources
MCP6002 1.8–6V Yes (in & out) CMOS 1 MHz 3.3V / 5V single-supply, battery projects
OPA2340 2.7–5.5V Yes (in & out) CMOS 5.5 MHz Precision ADC buffering, low noise
LM324 3–32V Output only (to GND) Bipolar 1 MHz Quad op-amp, multiple buffers in one chip
NE5532 ±5–15V No Bipolar 10 MHz Audio preamps, low-noise applications

⚠️ Rail-to-Rail Matters for Single-Supply Circuits

If you are running from a single supply (e.g. 5V and GND — no negative rail), you need a rail-to-rail output op-amp. A standard op-amp like the TL072 cannot swing its output below about 1.5V above the negative supply. That means on a 0–5V supply, your buffer output would be stuck above ~1.5V — useless for reading a sensor that outputs 0–5V. The LM358 and MCP6002 both handle single-supply operation well.

JFET vs. CMOS vs. Bipolar Input

The op-amp's input stage determines how much current it steals from your source:

  • Bipolar (LM358, NE5532) — input bias current around 20–200 nA. Fine for sources below 100kΩ
  • JFET (TL072) — input bias current around 20–200 pA. Good for sources up to 10 MΩ
  • CMOS (MCP6002, OPA2340) — input bias current around 1 pA. Essential for extremely high-impedance sources like pH probes or piezo sensors

4. Building a Voltage Follower on a Breadboard

Let's build a practical buffer using the LM358 — the most common and cheapest op-amp available. It comes in a DIP-8 package with two independent op-amps inside.

LM358 Pinout

LM358 Dual Op-Amp OUT_A 1 −IN_A 2 +IN_A 3 GND 4 VCC (+5V) 8 OUT_B 7 −IN_B 6 +IN_B 5 LM358 DIP-8 Pinout

Wiring (Single Buffer Using Op-Amp A)

VOLTAGE DIVIDER +5V 100k 100k Signal + LM358 Feedback wire +5V 100nF Arduino Uno A0 5V GND Complete Voltage Follower Wiring Voltage Divider → LM358 Buffer → Arduino ADC

💡 Pro Tip: Always Add a Bypass Capacitor

Place a 100nF (0.1µF) ceramic capacitor as close as possible between the Vcc and GND pins of the op-amp. This filters out high-frequency noise on the power supply and prevents oscillation. Skip this step and your buffer might oscillate or give noisy readings.

5. Arduino Code: Buffered vs. Unbuffered Reading

This sketch reads the same voltage divider through two paths — one direct (unbuffered) and one through the LM358 voltage follower — so you can see the difference on the Serial Monitor.

💡 Buffered vs. Unbuffered ADC Reading

// Voltage Follower (Buffer) Demo
// Compares buffered vs unbuffered ADC readings
//
// Wiring:
//   Voltage divider (2x 100k) output → LM358 pin 3 (+IN)
//   LM358 pin 2 (-IN) tied to LM358 pin 1 (OUT)  [feedback]
//   LM358 pin 1 (OUT) → Arduino A0  (buffered)
//   Voltage divider output → Arduino A1  (unbuffered, direct)
//   LM358 pin 8 → 5V,  pin 4 → GND
//   100nF cap between pin 8 and pin 4
//
// Required libraries: none

const int BUFFERED_PIN   = A0;  // Through voltage follower
const int UNBUFFERED_PIN = A1;  // Direct from divider

void setup() {
    Serial.begin(115200);
    Serial.println("Voltage Follower Buffer Demo");
    Serial.println("----------------------------");
    Serial.println("Pin\t\tRaw ADC\t\tVoltage");
}

void loop() {
    // Take multiple samples and average for stability
    long sumBuffered   = 0;
    long sumUnbuffered = 0;
    const int SAMPLES  = 16;

    for (int i = 0; i < SAMPLES; i++) {
        sumBuffered   += analogRead(BUFFERED_PIN);
        sumUnbuffered += analogRead(UNBUFFERED_PIN);
        delayMicroseconds(100);
    }

    int avgBuffered   = sumBuffered   / SAMPLES;
    int avgUnbuffered = sumUnbuffered / SAMPLES;

    float vBuffered   = avgBuffered   * (5.0 / 1023.0);
    float vUnbuffered = avgUnbuffered * (5.0 / 1023.0);

    Serial.print("Buffered:\t");
    Serial.print(avgBuffered);
    Serial.print("\t\t");
    Serial.print(vBuffered, 3);
    Serial.println(" V");

    Serial.print("Unbuffered:\t");
    Serial.print(avgUnbuffered);
    Serial.print("\t\t");
    Serial.print(vUnbuffered, 3);
    Serial.println(" V");

    Serial.print("Error:\t\t");
    float errorMv = (vBuffered - vUnbuffered) * 1000.0;
    Serial.print(errorMv, 1);
    Serial.println(" mV");
    Serial.println();

    delay(1000);  // Print once per second
}

With 100kΩ divider resistors, you will typically see the unbuffered reading 50–150 mV lower than the buffered reading. With 1MΩ resistors, the error can exceed 500 mV — a massive 10% error on a 5V range.

6. Voltage Follower Variations

The basic unity-gain buffer is the starting point, but there are several practical variations you will encounter in real circuits.

A. Basic Unity-Gain Buffer

The standard configuration we have been discussing. Output equals input, no gain, no attenuation. This is what you use 90% of the time.

V_out = V_in
Gain = 1

B. Buffer with DC Offset

Sometimes you need to shift a signal up or down. For example, a sensor outputs −1V to +1V but your ADC only accepts 0–3.3V. Add a voltage divider to the non-inverting input to set a DC bias, then AC-couple the signal through a capacitor. The buffer isolates the bias network from the load.

C. Bootstrapped Buffer (Ultra-High Impedance)

For sources with impedances above 100 MΩ (like glass pH electrodes), even a CMOS op-amp's input leakage can cause errors. A bootstrapped guard ring on the PCB — driven by the buffer output — surrounds the input trace, keeping the voltage on both sides of the insulation equal. This eliminates surface leakage currents.

D. Dual-Supply vs. Single-Supply

Feature Single Supply (0V & +5V) Dual Supply (−12V & +12V)
Output swing ~0V to ~4V (rail-to-rail: 0 to 4.9V) −10.5V to +10.5V (typ.)
Can buffer signals near 0V? Only with rail-to-rail op-amp Yes, easily
Power supply complexity Simple — one regulator Needs positive + negative rails
Typical op-amps LM358, MCP6002, OPA340 TL072, NE5532, OPA2134
Common use case MCU / sensor projects Audio, analog signal processing

7. Real-World Applications

Voltage followers are everywhere — hiding inside almost every electronic device you use. Here are some places where they do critical work.

🎸 Audio Equipment

A guitar's magnetic pickup has an output impedance of 7–15 kΩ. Plugging it directly into a long cable (which has capacitance) rolls off the high frequencies and makes the tone muddy. Guitar pedal boards and active DI boxes use voltage follower buffers as the very first stage to present a low-impedance signal to the cable. Every studio mixing console uses buffer stages between processing blocks to prevent one module from loading another.

🏥 Medical Instruments

An ECG (electrocardiogram) machine reads microvolt-level signals from skin electrodes. The electrode-skin interface has an impedance of 1–100 kΩ that varies with moisture and movement. Instrumentation amplifiers (which contain buffer stages internally) present an input impedance above 10 GΩ to avoid distorting the tiny heart signals. Pulse oximeters and EEG monitors use similar buffering for their photodiode and electrode inputs.

🏭 Industrial Process Control

In chemical plants, pH sensors use a glass electrode with an output impedance exceeding 100 MΩ. Without a high-impedance buffer amplifier built into the probe housing, the reading would be completely dominated by cable resistance. Temperature transmitters (4–20 mA loops) also use internal buffers to isolate the RTD or thermocouple from the current-driving output stage.

🔬 Test & Measurement

An oscilloscope probe contains a FET-input voltage follower to achieve its rated 10 MΩ || 12 pF input impedance. Without this buffer, connecting the probe to a circuit would load it down and change the very signal you are trying to measure. Multimeter input stages use the same principle to achieve >10 MΩ impedance on voltage ranges.

📱 Smartphones & Wearables

Inside every smartphone, the microphone MEMS element feeds into a buffer amplifier before the ADC. Capacitive touchscreen controllers use buffer stages to accurately measure the tiny charge on each pixel. Fitness trackers buffer the signal from optical heart-rate sensors (photodiodes) before amplification and filtering.

8. ESP32 Example: Buffering a Thermistor for Accurate Temperature

Thermistors are popular temperature sensors, but their resistance changes with temperature — meaning the voltage divider they form has a varying output impedance. Buffering the divider output gives you stable, accurate ADC readings on an ESP32.

💡 ESP32 Buffered Thermistor Reading

// Buffered NTC Thermistor Temperature Reading (ESP32)
// Uses LM358 voltage follower between divider and ADC
//
// Wiring:
//   3.3V → 10k fixed resistor → junction → NTC thermistor → GND
//   Junction point → LM358 pin 3 (+IN)
//   LM358 pin 2 (-IN) → LM358 pin 1 (OUT)  [feedback]
//   LM358 pin 1 (OUT) → ESP32 GPIO 34 (ADC1_CH6)
//   LM358: Vcc = 3.3V, GND = GND
//   100nF bypass cap on LM358 Vcc-GND

const int THERM_PIN = 34;       // ADC input (buffered)
const float SERIES_R = 10000.0; // 10k series resistor
const float NOMINAL_R = 10000.0;// NTC resistance at 25C
const float NOMINAL_T = 25.0;   // Reference temp (C)
const float B_COEFF = 3950.0;   // Beta coefficient (datasheet)
const float V_REF = 3.3;        // ESP32 ADC reference

void setup() {
    Serial.begin(115200);
    analogReadResolution(12);    // ESP32: 12-bit ADC (0-4095)
    analogSetAttenuation(ADC_11db); // Full 0-3.3V range
    Serial.println("Buffered Thermistor Demo");
}

void loop() {
    // Average 32 samples for noise reduction
    long sum = 0;
    for (int i = 0; i < 32; i++) {
        sum += analogRead(THERM_PIN);
        delayMicroseconds(50);
    }
    float adcAvg = sum / 32.0;

    // Convert ADC to resistance using voltage divider formula
    float voltage = adcAvg * (V_REF / 4095.0);
    float thermR  = SERIES_R * (voltage / (V_REF - voltage));

    // Steinhart-Hart simplified (Beta equation)
    float tempK = 1.0 / (
        (1.0 / (NOMINAL_T + 273.15)) +
        (1.0 / B_COEFF) * log(thermR / NOMINAL_R)
    );
    float tempC = tempK - 273.15;
    float tempF = tempC * 9.0 / 5.0 + 32.0;

    Serial.print("ADC: ");
    Serial.print((int)adcAvg);
    Serial.print("  R: ");
    Serial.print(thermR, 0);
    Serial.print(" ohm  Temp: ");
    Serial.print(tempC, 1);
    Serial.print(" C / ");
    Serial.print(tempF, 1);
    Serial.println(" F");

    delay(1000);
}

9. Common Mistakes & Troubleshooting

⚠️ Mistake: Using a Non-Rail-to-Rail Op-Amp on a Single Supply

A TL072 powered from 0V and +5V cannot output anything below about 1.5V. If your sensor signal drops below 1.5V, the buffer output just sits at 1.5V — a flat dead zone. Fix: Use the LM358 (output swings to GND) or a true rail-to-rail part like the MCP6002.

⚠️ Mistake: Forgetting the Bypass Capacitor

An op-amp without a 100nF bypass capacitor on its supply pins can oscillate at high frequency — turning your buffer into a radio transmitter. The oscillation is often invisible on a basic multimeter but shows up as erratic ADC readings or as noise on nearby circuits. Fix: Always place a 100nF ceramic cap within 5mm of the Vcc and GND pins.

⚠️ Mistake: Exceeding the Input Voltage Range

Most op-amps cannot accept input voltages above Vcc or below the negative supply (GND for single-supply). Exceeding this range causes phase inversion on some op-amps — the output suddenly flips to the opposite rail. Fix: Keep input signals within the op-amp's specified common-mode input range. Add clamping diodes if transients are possible.

⚠️ Mistake: Driving Capacitive Loads Without a Series Resistor

Connecting the buffer output directly to a long cable (which has significant capacitance) can cause the op-amp to oscillate. The capacitance creates a phase shift in the feedback loop. Fix: Add a small series resistor (47–100Ω) between the output pin and the cable. This isolates the capacitive load from the feedback loop.

💡 Pro Tip: Check for Oscillation with an LED

If you suspect your buffer is oscillating but don't have an oscilloscope, connect an LED (with a 1kΩ series resistor) from the output to ground. If the LED glows dimly even when the input is at 0V, the op-amp is likely oscillating. A properly working buffer at 0V input should keep the LED completely off.

💡 Pro Tip: Unused Op-Amp Channels

The LM358 has two op-amps in one package. If you only use one, do not leave the other one floating. Wire the unused op-amp as a follower with its + input tied to GND (or Vcc/2). Floating inputs can cause the unused channel to oscillate, which increases power consumption and injects noise into the shared supply.

10. When NOT to Use a Voltage Follower

Buffers are incredibly useful, but they are not always the right answer.

  • When you need gain — a voltage follower has a gain of exactly 1. If your signal is too small, use a non-inverting amplifier instead (same circuit, but add two resistors to set gain > 1).
  • When speed matters and impedance is already low — the op-amp introduces a small delay (propagation delay) and bandwidth limit. If your source already has low impedance, the buffer adds complexity for no benefit.
  • Very high frequency signals (>1 MHz) — standard op-amps struggle above a few MHz. For RF or video signals, use a dedicated buffer IC (like the BUF634) or a discrete transistor emitter follower.
  • When you need to drive heavy loads (>20 mA) — most op-amps max out at 20–40 mA output current. For driving motors, LEDs, or speakers, use the buffer to feed a power transistor or driver IC.

11. Quick Reference: Transistor-Based Buffers

Before op-amps became cheap, engineers used discrete transistors as buffers. You may still encounter these in legacy designs or high-speed applications.

Buffer Type Gain Input Z Output Z Notes
Op-amp follower 1.000 10M–1TΩ <1Ω Most accurate, easiest to use
BJT emitter follower ~0.99 ~β × RE ~10–50Ω Fast, introduces ~0.6V drop (VBE)
MOSFET source follower ~0.8–0.95 >10 GΩ ~50–200Ω Very high input Z, gain less than 1
Darlington pair ~0.98 ~β² × RE ~5–20Ω Very high current gain, ~1.2V drop

For most maker projects, the op-amp voltage follower is the best choice. It has unity gain with no voltage offset, extremely high input impedance, and costs under $0.30 in DIP-8 form.

🚀 Key Takeaways

  • A voltage follower copies a voltage without loading the source — it has very high input impedance and very low output impedance
  • Use it whenever a high-impedance source (sensor, voltage divider, piezo) feeds a low-impedance load (ADC, cable, next stage)
  • For single-supply Arduino/ESP32 projects, use the LM358 or MCP6002 (rail-to-rail)
  • For audio circuits with dual supply, use the TL072 or NE5532
  • Always add a 100nF bypass capacitor on the supply pins
  • Do not leave unused op-amp channels floating — wire them as followers tied to a mid-rail voltage
  • The voltage follower is the foundation for more complex circuits: active filters, instrumentation amps, and sample-and-hold stages all rely on buffer stages internally