The standard EIA 3-digit code for a 10uF capacitor is 106. The first two digits (10) represent the significant figures, and the third digit (6) is the multiplier in picofarads (pF). Therefore, 10 × 106 pF equals 10,000,000 pF, which converts to 10,000 nF, or exactly 10 µF. If you are sourcing components for an embedded design or debugging a power rail, misreading this code or selecting the wrong dielectric can lead to catastrophic inrush failures or ADC noise. This guide breaks down the 10uf capacitor code, provides a decision matrix for selecting the right chemistry, and walks through building an ESP32-based capacitance verifier to test your inventory.

Decoding the 10uF Capacitor Code and Selection Matrix

Beyond the base capacitance value, SMD and through-hole capacitors use additional markings for voltage and tolerance. A typical tantalum or MLCC (Multi-Layer Ceramic Capacitor) might read 106 16V or include a letter code for voltage (e.g., C = 16V, E = 25V in some manufacturer series). However, the physical size and dielectric material matter far more than the ink on the reel when designing embedded power trees.

When you need 10µF for decoupling an ESP32 or smoothing a sensor power rail, you have three primary chemistry choices. Here is the decision path to terminate your selection process:

Decision Matrix: 10µF Capacitor Chemistries for Embedded 3.3V/5V Rails
Criteria MLCC (X5R/X7R) Tantalum (MnO2) Aluminum Electrolytic
Typical Footprint 0805 or 1206 Case A or B (3216/3528) 5x11mm Radial
ESR (Equivalent Series Resistance) Ultra-low (<5 mΩ) High (1.0 - 3.0 Ω) Medium (0.5 - 2.0 Ω)
Polarity Non-polar Polar (Reverse = Fire) Polar
DC Bias Derating Severe (loses up to 50% at rated V) Moderate Minimal
Best Use Case High-frequency decoupling, tight spaces Bulk hold-up on low-ripple rails Through-hole prototyping, audio filtering
⚠️ Callout Tip: The DC Bias Trap
If you place a 10uF 0805 X5R MLCC rated at 6.3V on a 5V rail, the DC bias effect will reduce its actual capacitance to roughly 4µF. Always select an MLCC with a voltage rating at least 2x your operating voltage to maintain the 10uf capacitor code's promised value.

Project Build: ESP32 10uF Capacitance Verifier

Rather than trusting the 106 code printed on a salvaged SMD part, we can measure the actual capacitance using the RC time constant formula ($\tau = R \times C$). By timing how long it takes a capacitor to charge to 63.2% of VCC through a known resistor, we can calculate the true capacitance.

Difficulty Rating: Intermediate (Requires soldering SMD test points or using a breadboard)
Time to Build: 45 minutes
Target Board Variant: ESP32-WROOM-32 DevKit v1 (30-pin or 38-pin standard layout)

Parts List & Pin Mapping

  • MCU: ESP32-WROOM-32 DevKit v1
  • Display: 0.96" I2C OLED (SSD1306 driver, 128x64)
  • Resistors: 10kΩ (1% tolerance, charge resistor), 1kΩ (discharge protection)
  • Test Subject: Any capacitor marked 106 (10µF)
ESP32 Pin Mapping
ComponentESP32 GPIONotes
OLED SDAGPIO 21Standard I2C Data
OLED SCLGPIO 22Standard I2C Clock
Charge/Measure PinGPIO 32Must be ADC1 capable and output capable.
Discharge PinGPIO 33Pulls cap to GND via 1kΩ

Complete Compilable Code

This sketch utilizes the Adafruit_SSD1306 library. It includes critical error handling to prevent the ESP32's Watchdog Timer (WDT) from resetting the board if a capacitor fails to charge.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// --- Pin Definitions ---
#define CHARGE_PIN  32  // ADC1_CH4 (Must support output & ADC)
#define DISCHARGE_PIN 33

// --- OLED Definitions ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET   -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// --- Measurement Constants ---
const float VCC = 3.3;
const float R_CHARGE = 10000.0; // 10k Ohm
const int THRESHOLD = 2588;     // 63.2% of 4095 (12-bit ADC)
const unsigned long TIMEOUT_US = 5000000; // 5 second max wait

void setup() {
  Serial.begin(115200);
  pinMode(CHARGE_PIN, OUTPUT);
  pinMode(DISCHARGE_PIN, OUTPUT);
  
  digitalWrite(CHARGE_PIN, LOW);
  digitalWrite(DISCHARGE_PIN, LOW);

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Halt if display fails
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.println("Capacitance Meter");
  display.println("Target: 10uF (106)");
  display.display();
  delay(1000);
}

void loop() {
  // 1. Discharge the capacitor
  pinMode(CHARGE_PIN, OUTPUT);
  digitalWrite(CHARGE_PIN, LOW);
  digitalWrite(DISCHARGE_PIN, HIGH);
  delay(100); // Allow discharge
  digitalWrite(DISCHARGE_PIN, LOW);

  // 2. Start charging and timing
  unsigned long startTime = micros();
  unsigned long elapsedTime = 0;
  int adcVal = 0;
  bool timeout = false;

  // Switch charge pin to HIGH
  digitalWrite(CHARGE_PIN, HIGH);

  // 3. Wait for ADC to cross 63.2% threshold
  while(adcVal < THRESHOLD) {
    adcVal = analogRead(CHARGE_PIN);
    elapsedTime = micros() - startTime;
    
    // CRITICAL: Feed the watchdog and yield to RTOS
    yield(); 
    
    if(elapsedTime > TIMEOUT_US) {
      timeout = true;
      break;
    }
  }

  // 4. Calculate and Display
  display.clearDisplay();
  display.setCursor(0,0);
  
  if(timeout) {
    display.println("ERROR: Timeout!");
    display.println("Check connections");
    display.println("or Cap > 500uF");
    Serial.println("Measurement Timeout");
  } else {
    // tau (in seconds) = elapsedTime (us) / 1,000,000
    float tau = elapsedTime / 1000000.0;
    float capacitance = tau / R_CHARGE; // Farads
    float capacitance_uF = capacitance * 1000000.0;

    display.println("Measured Value:");
    display.setTextSize(2);
    display.print(capacitance_uF, 2);
    display.println(" uF");
    display.setTextSize(1);
    
    if(capacitance_uF > 8.0 && capacitance_uF < 12.0) {
      display.println("PASS: Matches 106 code");
    } else {
      display.println("FAIL: Out of 20% tol.");
    }
    Serial.printf("Time: %lu us | Cap: %.2f uF\n", elapsedTime, capacitance_uF);
  }
  
  display.display();
  delay(2000);
}

Debugging: "Core 1 panic'ed (Interrupt wdt timeout)"

When writing RC timing loops on the ESP32, beginners frequently encounter a fatal crash. If your serial monitor spits out the following exact error string, your code has violated the FreeRTOS watchdog constraints:

Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1)

This happens when a high-priority task hogs the CPU without yielding, starving the IDLE task and triggering the hardware watchdog. Here are the ranked causes and fixes:

  1. Missing yield() in the while loop: The ESP32 Arduino core runs on FreeRTOS. A tight while(analogRead() < threshold) loop blocks the Wi-Fi stack and RTOS housekeeping. Fix: Always include yield(); or esp_task_wdt_reset(); inside measurement loops, as shown in the code above.
  2. Using an Input-Only GPIO for Charging: If you mistakenly assign CHARGE_PIN to GPIO 34, 35, 36, or 39, the pin cannot drive HIGH. The capacitor will never charge, the threshold will never be met, and the loop will run infinitely until the WDT trips. Fix: Use ADC1 pins that support output (e.g., GPIO 32 or 33).
  3. Massive Capacitor or Short Circuit: If the capacitor is actually 1000µF instead of 10µF, or if your test jig has a solder bridge, the charge time will exceed the WDT limit. Fix: Implement the TIMEOUT_US break condition included in the provided sketch.

First Three Things to Check When the Tester Fails

If the code compiles but the OLED remains blank or the readings are wildly inaccurate, run through this rapid diagnostic sequence:

  1. Verify the I2C Address: The code assumes 0x3C. Many generic 0.96" OLEDs ship with 0x3D. Run the standard Arduino I2CScanner sketch to confirm your display's address and update SCREEN_ADDRESS accordingly.
  2. Check Resistor Tolerance: The math relies entirely on R_CHARGE being exactly 10,000 ohms. If you use a standard 5% carbon film resistor, your baseline error is already ±5%. Swap to a 1% metal film or SMD resistor for accurate 10uF verification.
  3. Account for ESP32 ADC Non-Linearity: The ESP32 ADC is notoriously inaccurate near the 0V and 3.3V rails. Fortunately, our 63.2% threshold (~2.08V) lands in the linear sweet spot of the ADC curve. Do not attempt to measure the 99% charge time; stick to the 1-time-constant (63.2%) method to avoid the non-linear upper rail.

Extending and Simplifying the Build

Depending on your bench needs, you can easily scale this project up or down.

To Simplify (Breadboard Prototyping):
Strip out the Wire.h and Adafruit_SSD1306 libraries entirely. Rely solely on Serial.printf() and use the Arduino IDE's Serial Plotter to watch the charge curve in real-time. This reduces flash usage and eliminates I2C bus lockups.

To Extend (Production Test Jig):
Add an ESP32 DAC (GPIO 25) to inject a known AC ripple and measure the voltage drop across the capacitor to calculate Equivalent Series Resistance (ESR). Tantalum capacitors marked 106 often suffer from high ESR as they age; measuring capacitance alone won't catch a degraded tantalum that will cause power rail ringing.

Final Verdict: Which 10uF Capacitor Should You Stock?

Stop buying assorted kits filled with high-ESR electrolytic caps that dry out, or dangerous polarized tantalums that catch fire when soldered backward. For 95% of embedded 3.3V and 5V microcontroller projects, the concrete pick is the Samsung Electro-Mechanics CL21A106KOQNNNE.

This is an 0805 package, 10µF, 16V, X5R MLCC. At roughly $0.05 per unit in tape-and-reel quantities, it offers ultra-low ESR, requires no polarity orientation during hand-soldering, and its 16V rating ensures that DC bias derating on a 5V rail is negligible, giving you the true 10µF the 106 code promises. Stock your bench with these and relegate the radial electrolytics to audio filtering and linear regulator bulk storage.