The Verdict: Which ESP32-S3 Box Variant Should You Buy?
If you are building an offline voice-controlled interface or a smart home dashboard, Espressif offers three hardware revisions of their "Box" development kits. Choosing the wrong one leads to immediate software roadblocks, specifically around power management and audio routing. Here is the decision path to select the right hardware for your bench.
| Criteria | ESP32-S3-BOX-Lite | ESP32-S3-BOX (Original) | ESP32-S3-BOX-3 |
|---|---|---|---|
| Target Use Case | Budget voice-remote prototypes | Legacy IoT displays (Discontinued) | Production-ready voice/sensor hubs |
| PMIC (Power Management) | None (USB 5V direct) | AXP192 | AXP2101 (Highly efficient) |
| Microphones | 2x Analog (Lower SNR) | 2x I2S Digital | 2x I2S Digital (Improved placement) |
| Touch Interface | Physical Buttons | Capacitive Touch (TT21100) | Capacitive Touch (GT911) |
| Price Range (2026) | ~$25 USD | N/A (Used market only) | ~$55 USD |
Hardware Spec Sheet & Exact Pin Mapping
The code and debugging steps in this guide explicitly target the ESP32-S3-BOX-3 equipped with the ESP32-S3-WROOM-1 module (16MB Quad Flash + 16MB Octal PSRAM). If you are using a bare ESP32-S3 DevKitC, the pin mappings below will not match your board.
Parts List
- MCU Board: Espressif ESP32-S3-BOX-3 (SKU: ESP32-S3-BOX-3)
- Power: 5V/2A USB-C PD power supply (The AXP2101 will throttle charging if the source cannot negotiate sufficient current)
- Battery: 3.7V LiPo with JST-PH 2.0 connector (Optional, 500mAh to 2000mAh supported by the onboard PMIC)
Internal Pin Mapping Table
Unlike bare dev boards, the Box-3 hardwires specific GPIOs to internal peripherals. You cannot reassign these without physically cutting traces on the PCB.
| Peripheral | Bus / Protocol | GPIO Pin(s) | Notes / Constraints |
|---|---|---|---|
| AXP2101 PMIC & IMU | I2C | SDA: 8, SCL: 18 | 4.7k external pull-ups present. Do not use internal pull-ups. |
| GT911 Touch Controller | I2C | SDA: 8, SCL: 18, INT: 3 | Shares I2C bus with PMIC. Address: 0x5D or 0x14. |
| ILI9342C LCD (2.4") | SPI | MOSI: 7, SCK: 15, CS: 4, DC: 5, RST: 6, BL: 47 | BL (Backlight) requires PWM via LEDC to dim. |
| ES8311 Audio Codec | I2C / I2S | I2C: 8/18. I2S: BCLK: 17, WS: 45, DOUT: 16, DIN: 21 | Mic and Speaker share the codec but use different I2S data lines. |
Step-by-Step Build: PMIC Proof-of-Life Dashboard
Before loading heavy voice-recognition frameworks like ESP-SR, you must verify the I2C bus and the AXP2101 Power Management IC. A common mistake is uploading generic ESP32 I2C scanner code, which defaults to GPIO 21/22 and immediately fails on the Box-3.
Step 1: IDE Configuration
- Open Arduino IDE (2.x or newer) and install the esp32 board package by Espressif (version 3.0.0 or higher).
- Select Board:
ESP32S3 Dev Module. - Set PSRAM to
OPI PSRAM. (Setting this to QSPI will cause a boot loop on the Box-3). - Set Flash Size to
16MB (128Mb). - Set USB CDC On Boot to
Enabledto routeSerialoutput over the USB-C port.
Step 2: Compile and Upload the Verification Code
This sketch initializes the correct I2C pins, pings the AXP2101, reads its Chip ID register to confirm communication, and checks the battery charging status. It includes robust error handling to catch I2C bus lockups.
#include
// ESP32-S3-BOX-3 Internal I2C Pin Definitions
#define I2C_SDA 8
#define I2C_SCL 18
#define I2C_FREQ 400000 // 400kHz Fast Mode
// AXP2101 I2C Address and Registers
#define AXP2101_ADDR 0x34
#define REG_CHIP_ID 0x03
#define REG_CHG_STAT 0x01
bool pmic_online = false;
void setup() {
Serial.begin(115200);
delay(1000); // Allow USB CDC to connect
Serial.println("\n--- ESP32-S3-BOX-3 AXP2101 Initialization ---");
// Initialize I2C with explicit Box-3 pins
if (!Wire.begin(I2C_SDA, I2C_SCL, I2C_FREQ)) {
Serial.println("[FATAL] Wire.begin() failed. Check GPIO definitions.");
while (1) { delay(1000); }
}
// Ping the PMIC
Wire.beginTransmission(AXP2101_ADDR);
uint8_t error = Wire.endTransmission();
if (error != 0) {
Serial.printf("[ERROR] AXP2101 Init Failed: I2C Timeout on Addr 0x%02X. Code: %d\n", AXP2101_ADDR, error);
Serial.println("Halting. See debugging section below.");
while (1) { delay(1000); }
}
// Read Chip ID (Should be 0x4A for AXP2101)
Wire.beginTransmission(AXP2101_ADDR);
Wire.write(REG_CHIP_ID);
if (Wire.endTransmission(false) == 0 && Wire.requestFrom(AXP2101_ADDR, 1) == 1) {
uint8_t chip_id = Wire.read();
Serial.printf("[SUCCESS] PMIC Online. Chip ID: 0x%02X\n", chip_id);
if (chip_id == 0x4A) {
pmic_online = true;
} else {
Serial.println("[WARNING] Unexpected Chip ID. Is this a Box-Lite or original Box?");
}
}
}
void loop() {
if (!pmic_online) return;
// Read Charge Status Register (0x01)
Wire.beginTransmission(AXP2101_ADDR);
Wire.write(REG_CHG_STAT);
if (Wire.endTransmission(false) == 0 && Wire.requestFrom(AXP2101_ADDR, 1) == 1) {
uint8_t status = Wire.read();
uint8_t chg_state = (status >> 4) & 0x03;
Serial.print("Battery Status: ");
switch (chg_state) {
case 0: Serial.println("Idle / Not Charging"); break;
case 1: Serial.println("Pre-charge"); break;
case 2: Serial.println("Constant Current (CC) Charging"); break;
case 3: Serial.println("Constant Voltage (CV) Charging"); break;
}
}
delay(2000);
}
Debugging: "AXP2101 Init Failed: I2C Timeout on Addr 0x34"
If your serial monitor outputs [ERROR] AXP2101 Init Failed: I2C Timeout on Addr 0x34 or the underlying ESP-IDF throws E (145) i2c: i2c driver install error, the microcontroller cannot see the power management chip. Because the Box-3 routes critical power paths through this chip, an I2C failure often means your sensors and display will also fail to initialize.
- Verify GPIO Pins in Code: Generic ESP32 tutorials use GPIO 21 (SDA) and GPIO 22 (SCL). The Box-3 strictly uses GPIO 8 and GPIO 18. If your code uses the defaults, the I2C bus is physically disconnected.
- Check for "Ship Mode" Lockout: If the Box-3 was stored without a battery and unplugged for months, the AXP2101 may have entered a deep sleep "ship mode" to prevent battery drain. Fix: Plug the device into a high-current (2A+) USB-C wall charger (not a PC USB port) and hold the physical Boot button for 3 seconds to wake the PMIC.
- Disable Internal Pull-Ups: The Box-3 PCB already includes 4.7kΩ physical pull-up resistors on the I2C lines. If your library initializes the pins as
INPUT_PULLUP, the internal ~45kΩ resistors can sometimes interfere with the I2C rise times at 400kHz. Stick to standardWire.begin()which defaults to standard high-impedance inputs on the ESP32-S3.
Ranked Causes for Persistent I2C Timeouts
| Probability | Cause | Diagnostic / Fix |
|---|---|---|
| High (70%) | Wrong I2C Pins defined in software | Change SDA to 8, SCL to 18. Recompile. |
| Medium (20%) | PSRAM Configuration Mismatch | If IDE is set to QSPI PSRAM instead of OPI, the ESP32-S3 memory bus crashes, causing peripheral watchdog timeouts that manifest as I2C errors. Set to OPI. |
| Low (10%) | Hardware I2C Bus Lockup | The GT911 touch controller is holding SDA low due to a static discharge event. Unplug USB, hold the physical RESET button for 10 seconds, and reconnect. |
Extending and Simplifying the Build
Once the PMIC is verified, you have a stable foundation. Here is how to scale the project based on your end goal.
How to Extend: Adding Offline Voice Recognition
The primary advantage of the Box-3 is its dual-mic array and ESP32-S3 vector instructions. To add wake-word detection ("Hi, ESP"), do not write your own FFT audio pipeline. Use Espressif's official ESP-SR library.
Implementation Note: ESP-SR requires massive memory allocation. You must enable the ESP Speech Recognition menu in the ESP-IDF menuconfig and allocate at least 2MB of the Octal PSRAM specifically for the MultiNet command recognition model. If you attempt to run ESP-SR on the Box-Lite (which only has 8MB Quad PSRAM), you will hit out-of-memory (OOM) panics during the acoustic model loading phase.
How to Simplify: Stripping the Display for a Headless Sensor Node
If you are deploying the Box-3 as a hidden environmental sensor (reading the onboard ICM-42688-P IMU and SHT40 temperature/humidity sensor via the same I2C bus), the 2.4" LCD is a massive power drain.
Implementation Note: Do not just turn the backlight off via GPIO 47. The ILI9342C controller will still draw ~15mA. You must send the software sleep command (0x10) over SPI to the display controller, and then use the AXP2101 to physically cut power to the display's VCC rail (ALDO2) to drop the idle current from ~80mA down to ~12mA.
Final Recommendation & Next Steps
The Espressif ESP32-S3-BOX-3 is currently the most capable out-of-the-box development kit for makers building voice-assisted IoT devices, provided you respect its specific hardware routing.
Your immediate next step: Upload the AXP2101 verification sketch provided above. If the serial monitor returns [SUCCESS] PMIC Online. Chip ID: 0x4A, your hardware is healthy, and you can safely proceed to integrate TFT_eSPI for the display and ESP-SR for voice commands. If it fails, follow the 3-step debugging checklist to clear the I2C bus lockout before attempting to load heavier frameworks.
For deeper register-level configuration of the power management chip, refer to the ESP32-S3 Technical Reference Manual and the official ESP-BOX GitHub repository for factory test code examples.






