If you have ever squinted at a 0603 ceramic capacitor under a magnifying lamp trying to read a microscopic three-digit stamp, you already know the pain of surface-mount component identification. The standard SMD capacitor code follows the EIA-198 specification: the first two digits represent the significant figures, and the third digit is the multiplier (the number of trailing zeros) in picofarads (pF). For example, a code of 104 translates to 10 followed by four zeros (100,000 pF), which equals 100 nF or 0.1 µF.
However, as packages shrink to 0402 and 0201, manufacturers omit these codes entirely. Furthermore, cheap bulk assortments from online marketplaces frequently feature mislabeled or faded components. Relying on visual inspection alone is a recipe for debug nightmares. Below is the definitive reference chart for SMD capacitor codes, followed by a complete guide to building a high-precision ESP32 capacitance meter to verify your stash electrically.
The EIA SMD Capacitor Code Reference Chart
The table below maps the most common 3-digit SMD capacitor codes to their absolute values. Keep this bookmarked for your bench. Note that this system applies primarily to ceramic and film capacitors; tantalum SMD capacitors use a different letter-numeric system (e.g., 106C for 10 µF, 16V) which we will cover in a future deep-dive.
| SMD Code | Calculation (pF) | Value (pF) | Value (nF) | Value (µF) | Typical Package |
|---|---|---|---|---|---|
| 101 | 10 × 10¹ | 100 pF | 0.1 nF | 0.0001 µF | 0402 / 0603 |
| 222 | 22 × 10² | 2,200 pF | 2.2 nF | 0.0022 µF | 0603 / 0805 |
| 473 | 47 × 10³ | 47,000 pF | 47 nF | 0.047 µF | 0603 / 0805 |
| 104 | 10 × 10⁴ | 100,000 pF | 100 nF | 0.1 µF | 0402 to 1206 |
| 224 | 22 × 10⁴ | 220,000 pF | 220 nF | 0.22 µF | 0805 / 1206 |
| 475 | 47 × 10⁵ | 4,700,000 pF | 4,700 nF | 4.7 µF | 0805 / 1210 |
| 106 | 10 × 10⁶ | 10,000,000 pF | 10,000 nF | 10.0 µF | 1206 / 1210 |
| 476 | 47 × 10⁶ | 47,000,000 pF | 47,000 nF | 47.0 µF | 2220 / Tantalum |
If you see a letter trailing the 3-digit code (e.g.,
104K), it indicates the capacitance tolerance. J = ±5%, K = ±10% (most common for X7R/Y5V ceramics), and M = ±20%. For precision timing circuits, always hunt for J-tolerance (C0G/NP0 dielectric) parts.
Project: ESP32 Precision Capacitance Meter
To verify unmarked SMD capacitors, we will build an astable multivibrator capacitance meter. The circuit uses a CMOS 555 timer to generate a square wave whose HIGH pulse width is directly proportional to the capacitance under test. The ESP32 measures this pulse width using its high-resolution pulseIn() function and calculates the exact value.
Parts List
- Microcontroller: ESP32 DevKit V1 (ESP32-WROOM-32 module). Note: The ESP32's 3.3V logic and high-speed timers make it vastly superior to the Arduino Uno for this application.
- Timer IC: ICM7555, TLC555, or LMC555 (CMOS variants). Do not use a standard bipolar NE555. The NE555 draws ~100mA switching spikes that will cause brownouts on the ESP32's onboard 3.3V LDO, corrupting your timing data. See the NXP ICM7555 Datasheet for CMOS quiescent current specs.
- Resistors: Two 10kΩ 1% tolerance metal film resistors (Ra and Rb).
- Test Probes: Two short pieces of 22 AWG solid copper wire or SMD test tweezers.
- Breadboard & Jumpers: Standard 830-point solderless breadboard and male-to-male jumpers.
Difficulty Rating: Intermediate (Requires understanding of RC timing and breadboard wiring).
Estimated Build Time: 45 minutes.
Wiring and Pin Mapping
The ICM7555 is configured in standard astable mode. The capacitor under test (Cx) connects between Pin 1 (GND) and Pin 2 (Trigger). Ensure your connections are tight; parasitic capacitance from long jumper wires can skew readings on sub-100pF SMD caps.
| ICM7555 Pin | Function | Connect To |
|---|---|---|
| 1 (GND) | Ground | ESP32 GND & Cx (Negative/Arbitrary for Ceramic) |
| 2 (TRIG) | Trigger | Pin 6 (THRES) & Cx (Positive/Arbitrary) |
| 3 (OUT) | Output | ESP32 GPIO 4 |
| 4 (RESET) | Reset (Active Low) | ESP32 3V3 (Pull High) |
| 5 (CONT) | Control Voltage | 10nF Ceramic Cap to GND (Bypass noise) |
| 6 (THRES) | Threshold | Pin 2 (TRIG) & Cx |
| 7 (DIS) | Discharge | Junction of Ra and Rb |
| 8 (VDD) | Supply Voltage | ESP32 3V3 |
Resistor Network: Connect Ra (10kΩ) between Pin 8 (VDD) and Pin 7 (DIS). Connect Rb (10kΩ) between Pin 7 (DIS) and Pin 6 (THRES).
Complete ESP32 Measurement Code
This code targets the ESP32 DevKit V1 in the Arduino IDE (ensure the ESP32 board package by Espressif is installed). It measures the HIGH pulse width, applies the astable timing formula, and outputs the value in nanofarads (nF) and microfarads (µF). It includes robust timeout error handling to prevent serial monitor lockups.
/*
* ESP32 Precision Capacitance Meter
* Target: ESP32 DevKit V1 (ESP32-WROOM-32)
* Circuit: ICM7555 Astable Multivibrator (Ra=10k, Rb=10k)
*/
#define SENSOR_PIN 4 // ICM7555 Output (Pin 3)
#define TIMEOUT_US 2000000 // 2 second timeout (max ~144uF with 10k resistors)
// Timing constant for Ra=10k, Rb=10k
// t_high = ln(2) * (Ra + Rb) * C = 0.693147 * 20000 * C
// C (in Farads) = t_high (in seconds) / 13862.94
// C (in nF) = t_high (in microseconds) / 13.86294
const float TIMING_CONSTANT_NF = 13.86294;
void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT);
// Allow serial monitor to connect
delay(1500);
Serial.println("ESP32 SMD Capacitance Meter Initialized.");
Serial.println("Connect capacitor to test probes. Waiting for signal...");
}
void loop() {
// Measure the HIGH pulse width in microseconds
unsigned long pulseWidth = pulseIn(SENSOR_PIN, HIGH, TIMEOUT_US);
if (pulseWidth == 0) {
// Exact error string for debugging
Serial.println("Error: Capacitance read timeout - Check ICM7555 wiring or capacitor > 144uF");
} else {
// Calculate capacitance
float capacitance_nF = pulseWidth / TIMING_CONSTANT_NF;
float capacitance_uF = capacitance_nF / 1000.0;
float capacitance_pF = capacitance_nF * 1000.0;
// Format output based on magnitude for readability
if (capacitance_nF < 1.0) {
Serial.printf("Pulse: %lu us | Value: %.2f pF\n", pulseWidth, capacitance_pF);
} else if (capacitance_nF < 1000.0) {
Serial.printf("Pulse: %lu us | Value: %.2f nF\n", pulseWidth, capacitance_nF);
} else {
Serial.printf("Pulse: %lu us | Value: %.3f uF\n", pulseWidth, capacitance_uF);
}
}
// Small delay to prevent serial buffer flooding
delay(500);
}
Debugging: When the Meter Fails
If your serial monitor outputs the exact string: Error: Capacitance read timeout - Check ICM7555 wiring or capacitor > 144uF, the ESP32's pulseIn() function waited the full 2 seconds without detecting a complete HIGH pulse. This is almost never a software issue. Here are the first three things to check on your breadboard:
- Verify ICM7555 Power Rails: Use your multimeter to check Pin 8 (VDD) and Pin 1 (GND). You must read a stable 3.25V to 3.35V. If it reads near 0V, your ESP32's USB current limit may be tripping, or the breadboard power rail is discontinuous.
- Check the Trigger/Threshold Jumper: Pins 2 (Trigger) and 6 (Threshold) must be tied together and connected to the positive leg of the capacitor under test. If Pin 6 is left floating, the internal comparator will never trip, and the output will lock HIGH.
- Inspect the Discharge Pin (Pin 7): Pin 7 must sit exactly at the junction between Ra and Rb. If you accidentally plugged Pin 7 into the same breadboard row as Pin 8 (VDD), you have shorted the internal discharge transistor to the supply rail, permanently killing the IC or halting oscillation.
1. Floating Pin 2 or 6 (90% of breadboard mistakes).
2. Using a bipolar NE555 instead of CMOS, causing the ESP32 to brownout and reset continuously.
3. Testing a shorted SMD capacitor (the timing node is pulled directly to GND).
4. Attempting to measure an electrolytic capacitor >100µF, which exceeds the 2-second timeout window with 10kΩ resistors.
Extending and Simplifying the Build
The beauty of this embedded approach is its modularity. Depending on your bench needs, you can easily scale the complexity of this tool.
How to Simplify (The Arduino Uno RC Method)
If you do not have an ICM7555 and need a quick-and-dirty measurement for a through-hole capacitor, you can strip away the 555 timer entirely and use an Arduino Uno's internal pull-up resistors. Connect the capacitor between GND and an analog pin (e.g., A0), and a 10kΩ resistor between A0 and a digital output pin. Charge the cap via the digital pin and time how long it takes analogRead() to cross the 63.2% threshold (approx. 647 on a 10-bit ADC). Warning: This method is highly inaccurate for SMD ceramics below 10nF due to the Arduino's ADC sampling latency and stray breadboard capacitance.
How to Extend (Auto-Ranging and OLED Display)
To turn this into a standalone bench tool, add a 0.96" SSD1306 I2C OLED display to the ESP32 (SDA to GPIO 21, SCL to GPIO 22). For auto-ranging, implement a multiplexer (like the CD4052) to switch between different Ra/Rb resistor pairs (e.g., 1kΩ for large electrolytics, 1MΩ for tiny pF ceramics). This allows the ESP32 to maintain high-resolution pulse widths regardless of whether you are testing a 22pF 0402 RF capacitor or a 47µF tantalum bulk decoupler.
By combining a solid understanding of the standard capacitor coding systems with a custom microcontroller-based verification tool, you eliminate the guesswork from SMD prototyping. Stop trusting faded silk screens and start trusting your oscilloscope and microcontroller.






