The 1uF capacitor code is typically 105. In the standard EIA 3-digit marking system, the first two digits represent the significant figures (10) and the third digit is the multiplier in picofarads (10^5). This equals 1,000,000 pF, or exactly 1 µF. Misreading this code and accidentally soldering a 104 (0.1 µF) instead is one of the most common hardware mistakes that leads to the dreaded ESP32 Brownout detector was triggered serial error.

When an ESP32-WROOM-32E module fires up its WiFi or Bluetooth radio, it draws current spikes up to 500mA in microseconds. The onboard AMS1117 LDO cannot react fast enough due to trace inductance. A properly placed 1 µF (105) ceramic capacitor acts as a local high-speed charge reservoir. If you grab the wrong component from your bin because you misread the code, your voltage rail will sag below the 2.4V brownout threshold, and the chip will instantly reset.

Decoding the EIA Capacitor Marking Standard

Before we wire up our debugging circuit, you need to be able to verify the components in your drawer. Ceramic capacitors use a 3-digit pF code. Here is the reference table for the values you will encounter most often in embedded decoupling and I2C pull-up filtering.

Marking Code Math (pF) Value in pF Value in µF Common Application
104 10 × 10^4 100,000 pF 0.1 µF High-frequency bypass, I2C noise filtering
105 10 × 10^5 1,000,000 pF 1.0 µF RF decoupling, bulk local storage (The 1uF code)
225 22 × 10^5 2,200,000 pF 2.2 µF Secondary bulk decoupling, audio coupling
475 47 × 10^5 4,700,000 pF 4.7 µF Power rail stabilization, LED driver smoothing
106 10 × 10^6 10,000,000 pF 10.0 µF Main rail bulk capacitance, motor spike absorption
Dielectric Warning: When buying your 105 capacitors, always check the datasheet for the dielectric material. You want X7R or X5R. Avoid Y5V or Z5U dielectrics for power decoupling; a Y5V capacitor marked 105 can lose up to 80% of its actual capacitance when subjected to its rated DC bias voltage, effectively turning your 1 µF cap into a 0.2 µF cap under load.

Project Build: ESP32 Brownout Monitor & I2C Sensor

To prove the necessity of the correct 1uF capacitor code and monitor power stability, we are building an I2C sensor node that logs reset reasons and detects voltage sags. We will use the ESP32-DevKitC V4 (featuring the ESP32-WROOM-32E module) and a BME280 environmental sensor to simulate a realistic I2C bus load.

Parts List

  • MCU: ESP32-DevKitC V4 (ESP32-WROOM-32E, 38-pin variant)
  • Sensor: BME280 I2C Breakout Board (Adafruit 2652 or generic clone)
  • Capacitor 1: 1 µF (Code: 105) X7R Ceramic, 0805 SMD or 5mm radial through-hole
  • Capacitor 2: 0.1 µF (Code: 104) X7R Ceramic
  • Power: High-quality USB-A to Micro-USB cable (minimum 22 AWG power cores)

Pin Mapping Table

ESP32-DevKitC V4 Pin BME280 Breakout Pin Function / Notes
3V3 VCC / VIN Power rail (Place 105 and 104 caps across this and GND)
GND GND Common ground reference
GPIO 21 SDI / SDA I2C Data (Default Wire SDA)
GPIO 22 SCK / SCL I2C Clock (Default Wire SCL)

Difficulty Rating: 2/5 (Basic soldering and I2C wiring)
Estimated Time: 25 Minutes

Wiring and the First Three Things to Check

Solder or breadboard the 1 µF (105) and 0.1 µF (104) capacitors in parallel directly across the 3V3 and GND pins on the ESP32 breakout header. The 104 handles high-frequency switching noise, while the 105 handles the heavy RF transmission spikes. Keep the leads as short as physically possible; parasitic inductance increases by roughly 1nH per millimeter of wire, which defeats the capacitor's purpose at 2.4 GHz.

If you upload the code and the system still fails, here are the first three things to check when it fails:

  1. Verify the 1uF Capacitor Code: Pull out your magnifying glass or multimeter. Did you actually solder a 105 (1 µF), or did you accidentally grab a 104 (0.1 µF) or a 103 (0.01 µF)? Measure it with a multimeter's capacitance setting if possible (expect ~950nF to 1.1µF).
  2. Swap the USB Cable: Over 60% of ESP32 brownouts are caused by cheap, thin-gauge USB cables. When the WiFi radio spikes to 500mA, a 28 AWG cable will drop 1.5V across its length, starving the AMS1117 LDO. Use a known-good, thick 22 AWG data cable.
  3. Check LDO Thermal Shutdown: Touch the AMS1117-3.3 voltage regulator on the DevKit board. If it is burning hot, it may be entering thermal protection. Ensure you aren't drawing more than 600mA total from the 3V3 pin, and check for accidental solder bridges on your I2C headers.

Complete ESP32 Brownout Logging Code

This code targets the ESP32-DevKitC V4. It uses the ESP-IDF esp_system.h library to read the hardware reset reason on boot. If a brownout occurred, it flags it. It then initializes the BME280 over I2C with robust error handling to ensure bus noise isn't crashing the loop.

#include <esp_system.h>
#include <Wire.h>
#include <Adafruit_BME280.h>

// Pin Definitions for ESP32-DevKitC V4
#define I2C_SDA 21
#define I2C_SCL 22
#define BME_ADDRESS 0x76 // Change to 0x77 if your breakout uses the alternate address

Adafruit_BME280 bme;
unsigned long lastRead = 0;
int brownoutCount = 0;

void setup() {
  Serial.begin(115200);
  delay(1500); // Allow serial monitor to connect
  
  Serial.println("\n--- ESP32 Power Stability Monitor ---");
  
  // 1. Check Reset Reason
  esp_reset_reason_t reason = esp_reset_reason();
  if (reason == ESP_RST_BROWNOUT) {
    Serial.println("CRITICAL ERROR: Brownout detector was triggered");
    Serial.println("Action: Check 105 capacitor placement and USB cable gauge.");
    brownoutCount++;
  } else if (reason == ESP_RST_POWERON) {
    Serial.println("Normal Power-On Reset detected.");
  } else {
    Serial.printf("Other reset reason code: %d\n", reason);
  }

  // 2. Initialize I2C with explicit pin mapping
  Wire.begin(I2C_SDA, I2C_SCL);
  Wire.setClock(100000); // Standard 100kHz for noise immunity

  // 3. Initialize BME280 with Error Handling
  if (!bme.begin(BME_ADDRESS, &Wire)) {
    Serial.println("FATAL: Could not find a valid BME280 sensor on I2C bus.");
    Serial.println("Check wiring, pull-up resistors, and I2C address.");
    while (1) {
      delay(1000); // Halt execution to prevent I2C bus spam
    }
  }
  
  Serial.println("BME280 initialized successfully. Monitoring loop starting...");
}

void loop() {
  if (millis() - lastRead > 2000) {
    lastRead = millis();
    
    float temp = bme.readTemperature();
    
    // Error handling for I2C read failures (NaN check)
    if (isnan(temp)) {
      Serial.println("WARNING: I2C Read Failed (NaN). Power rail noise or disconnected SDA/SCL.");
    } else {
      Serial.printf("Temp: %.2f C | Hum: %.2f %% | Boot Reason: Stable\n", 
                    temp, bme.readHumidity());
    }
  }
}

Debugging the Exact Error String

If your serial monitor prints the exact string Brownout detector was triggered, the ESP32's internal voltage monitor detected VDD33 dropping below ~2.4V for more than a few microseconds. The ROM bootloader immediately halts execution and resets the chip to prevent flash memory corruption.

Here are the ranked causes for this specific error string, assuming your code is correct:

  1. Missing or Incorrect Decoupling (The 105 Code Error): You omitted the 1 µF capacitor, or you misread the capacitor code and installed a 104 (0.1 µF). The 0.1 µF is excellent for high-frequency logic switching, but it lacks the physical dielectric volume to sustain a 500mA WiFi TX spike.
  2. Parasitic Inductance in Placement: You used the correct 105 capacitor, but you placed it 5cm away on a breadboard. At high di/dt (change in current over time), the breadboard traces act as inductors, choking off the capacitor's stored energy. It must be within 10mm of the VCC/GND pins.
  3. USB Port Current Limiting: You are powering the ESP32 from a standard USB 2.0 port on an older laptop, which is hardware-limited to 500mA. The WiFi spike exceeds this, causing the host port to drop voltage.
Pro-Tip for Oscilloscope Users: If you have a bench scope, set it to single-shot trigger mode on the 3.3V rail, triggering on a falling edge at 2.8V. You will visually catch the microsecond sag that the ESP32's internal brownout detector is complaining about. This proves whether your 105 capacitor is actually doing its job.

How to Extend or Simplify the Build

Depending on your bench setup and project goals, you can easily modify this hardware and software baseline.

Simplify the Build

If you don't have a BME280 on hand, you can strip out the I2C code entirely and use the ESP32's internal sensors to simulate load and monitor stability. Replace the BME280 initialization with the internal Hall Effect sensor (hallRead()) or simply force the WiFi radio into continuous TX mode using WiFi.setTxPower(WIFI_POWER_19_5dBm). This forces the maximum current draw, intentionally stressing the power rail to test if your 105 capacitor is sufficient to prevent the brownout reset.

Extend the Build

To turn this into a professional-grade power integrity logger, add an INA219 I2C Current/Power Sensor between your USB power source and the ESP32's 5V input. By logging the INA219's voltage and current readings at 10ms intervals to an SD card or via MQTT to a Node-RED dashboard, you can graph the exact correlation between current spikes and voltage sags. This data is invaluable when designing custom PCBs, as it tells you exactly how much bulk capacitance (e.g., parallel 106 and 105 codes) you need to specify in your schematic to guarantee field reliability.