ESP32-S3 Project Design

I started the upgrade plan for the full professional ESP32-S3 handheld design, but execution is currently blocked because the account has no available ACUs, so I can’t run the schematic/layout tools.
Current project state from the previous completed work:
  • Existing schematic has ESP32-S3-WROOM-1-N8R8, USB-C, 3.3 V regulator, BOOT/RESET, and 8 buttons.
  • Existing ERC/passive checks were clean at that stage.
  • Existing files include power budget, firmware starter, bring-up plan, and regulatory notes for the simpler 8-key controller.
Remaining work once ACUs are available:
  • Replace/expand the power system for 3× parallel Li-Ion cells with USB-C charging, power-path management, protection, fuel gauge/current monitoring, and test points.
  • Add audio playback path, amplifier, speaker connector, headphone jack with switching.
  • Add haptic motor driver.
  • Add protected laser output with current limiting and ESP32/button control.
  • Add debug/programming headers, USB ESD/surge/reverse protection, and updated BOM/design notes.
  • Validate the complete schematic, then proceed to PCB layout only after your confirmation.
Add NTC to measure the battery heat
I can add an NTC battery temperature sensor to the design, but I’m currently blocked because the account has no available ACUs, so I can’t modify the schematic right now.
Recommended implementation when ACUs are available:
  • Add a 10 kΩ NTC thermistor mounted near or against the Li-Ion cell pack.
  • Wire it as a voltage divider to an ESP32-S3 ADC pin.
  • Use a precision pull-up or pull-down resistor, typically 10 kΩ, to 3.3 V or GND.
  • Add a small filter capacitor, e.g. 100 nF, on the ADC sense node.
  • Optionally connect the NTC to the charger IC’s TS/TEMP pin as well, if the selected charger supports battery temperature qualification.
  • Add firmware limits to stop charging/discharging or warn the user if the pack is too hot or too cold.
Once ACUs are available, the next schematic update should add the NTC circuit, assign an ADC GPIO, and update the battery monitoring/design notes.
Choose ADC pin
Set NTC values
Check charger TEMP
Save NTC note
J1
U2
U1
SW7
SW6
SW8
SW3
SW2
SW1
SW4
SW10
SW9
SW5
C4
Capacitance
1uF
R3
Resistance
5.1kΩ
C1
Capacitance
1uF
R2
Resistance
5.1kΩ
C3
Capacitance
100nF
C2
Capacitance
10uF
R1
Resistance
10kΩ

Refine this doc
Ask about this doc
Firmware Starter — ESP32-S3 8-Key Controller
Platform & Toolchain
  • MCU: ESP32-S3-WROOM-1-N8R8
  • Framework: Arduino via PlatformIO
  • USB: Native ESP32-S3 USB Serial/JTAG via GPIO19 D- and GPIO20 D+
Pin Mapping

Table


FunctionGPIONetDirectionNotes
Key 14KEY1Input pull-upSW1 to GND, active-low
Key 25KEY2Input pull-upSW2 to GND, active-low
Key 36KEY3Input pull-upSW3 to GND, active-low
Key 47KEY4Input pull-upSW4 to GND, active-low
Key 58KEY5Input pull-upSW5 to GND, active-low
Key 69KEY6Input pull-upSW6 to GND, active-low
Key 710KEY7Input pull-upSW7 to GND, active-low
Key 811KEY8Input pull-upSW8 to GND, active-low
BOOT0BOOTInput strapSW9 to GND for download mode
Reset/EnableENESP_ENHardwareR1 10 kΩ to 3V3, C4 1 uF to GND, SW10 to GND
USB D-19USB_D_NNative USBJ1 DN1/DN2
USB D+20USB_D_PNative USBJ1 DP1/DP2
platformio.ini

Ini


[env:esp32-s3-devkitc-1]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
build_flags =
    -DARDUINO_USB_MODE=1
    -DARDUINO_USB_CDC_ON_BOOT=1
src/main.cpp

Cpp


#include <Arduino.h>

static const uint8_t KEY_PINS[8] = {4, 5, 6, 7, 8, 9, 10, 11};
static const char* KEY_NAMES[8] = {
  "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7", "KEY8"
};

static bool lastState[8];
static uint32_t lastDebounceMs[8];
const uint32_t DEBOUNCE_MS = 25;

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("ESP32-S3 8-Key Controller starting");

  for (uint8_t i = 0; i < 8; i++) {
    pinMode(KEY_PINS[i], INPUT_PULLUP);
    lastState[i] = digitalRead(KEY_PINS[i]);
    lastDebounceMs[i] = millis();
  }

  Serial.println("Keys initialized as active-low inputs with internal pull-ups");
}

void loop() {
  const uint32_t now = millis();

  for (uint8_t i = 0; i < 8; i++) {
    bool raw = digitalRead(KEY_PINS[i]);
    if (raw != lastState[i] && (now - lastDebounceMs[i]) >= DEBOUNCE_MS) {
      lastDebounceMs[i] = now;
      lastState[i] = raw;
      Serial.printf("%s %s\n", KEY_NAMES[i], raw == LOW ? "PRESSED" : "RELEASED");
    }
  }
}
Build & Flash

Bash


pio run
pio run -t upload
pio device monitor
If flashing fails, hold BOOT (SW9), tap RESET (SW10), release RESET, then release BOOT and retry upload.
  • Platform & Toolchain

  • Pin Mapping

  • `platformio.ini`

  • `src/main.cpp`

  • Build & Flash

ESP32-S3 8-Key Controller thumbnail
ESP32-S3 USB-C powered controller with eight user key buttons, native USB programming, 3.3V regulation, boot/reset controls, and firmware/bring-up documentation.

Properties

Properties describe core aspects of the project.

Pricing & Availability

Distributor

Qty 1

Arrow

$5.24–$7.21

Digi-Key

$9.86

HQonline

$3.13

LCSC

$7.84–$7.89

Mouser

$14.47

TME

$8.25

Verical

$1.98–$10.50

Controls