Quick Start

1. Plug It In

Connect the board to your computer with a USB-C cable. The ESP32-S3 has native USB, so there is no driver chip and no drivers to install — the board appears as a serial port on its own.

USB also powers the board and charges a connected battery.

2. Set Up Arduino IDE

Install the ESP32 board support package (Espressif Systems) from the Boards Manager, then select:

  • Board: ESP32S3 Dev Module
  • Port: whichever port appears when you plug the board in

The module is an ESP32-S3-WROOM-1-N8R2: 8 MB flash, 2 MB PSRAM. If your board settings expose flash and PSRAM options, match them to those values.

3. Turn On The Matrix

The matrix has a power switch on GPIO47 that must be driven LOW before the LEDs will light. This catches people out — the data line can be perfect and the matrix will stay dark if its power is off.

#include <Adafruit_NeoPixel.h>
 
#define MATRIX_PIN    3    // 5x5 matrix data
#define MATRIX_POWER  47   // LOW = LEDs powered
#define NUM_PIXELS    25
 
Adafruit_NeoPixel matrix(NUM_PIXELS, MATRIX_PIN, NEO_GRB + NEO_KHZ800);
 
void setup() {
  pinMode(MATRIX_POWER, OUTPUT);
  digitalWrite(MATRIX_POWER, LOW);   // power the matrix
 
  matrix.begin();
  matrix.setBrightness(40);          // keep it modest
  matrix.show();
}
 
void loop() {
  for (int i = 0; i < NUM_PIXELS; i++) {
    matrix.clear();
    matrix.setPixelColor(i, matrix.Color(0, 40, 80));
    matrix.show();
    delay(60);
  }
}

Keep brightness moderate. The matrix shares the 600 mA 3.3 V regulator with the ESP32-S3, so full white at full brightness is a lot to ask of it.

4. Make A Sound

The buzzer sits on GPIO48 and is loudest around 4 kHz.

#define BUZZER 48
 
void beep(int freq, int ms) {
  tone(BUZZER, freq, ms);
  delay(ms);
  noTone(BUZZER);
  digitalWrite(BUZZER, LOW);   // always leave it LOW
}
 
void setup() {
  pinMode(BUZZER, OUTPUT);
  beep(4000, 120);
}
 
void loop() {}

Always leave GPIO48 LOW after a tone. Holding it HIGH pushes DC through the buzzer coil — silent, but it heats the buzzer and drains the battery.

The Two Buttons

RESET

Restarts the ESP32-S3, exactly like pulling the RST pin low. The sensors and regulator stay powered; only the ESP32-S3 restarts.

BOOT

Connected to GPIO0 with a 10 kΩ pull-up, and it does two jobs.

Upload mode. Uploads over USB normally start by themselves. If one fails, or the board doesn't show up as a port, hold BOOT, press and release RESET, then release BOOT. The board waits in download mode until the upload finishes — press RESET afterwards to run your program.

As a normal button. Once your program is running, read GPIO0 like any button:

void setup() {
  pinMode(0, INPUT_PULLUP);
}
 
void loop() {
  if (digitalRead(0) == LOW) {
    // BOOT button is pressed
  }
}

Don't hold BOOT while the board resets or powers up unless you want download mode — your program won't start. GPIO0 is a strapping pin, so anything else holding it low at reset has the same effect.

Troubleshooting First Uploads

SymptomLikely cause
No serial port appearsTry the BOOT + RESET sequence above; check the cable carries data, not just power
Matrix stays darkGPIO47 not driven LOW
Board won't run your program after resetSomething is holding GPIO0 (BOOT) low at reset
Odd characters on serial at startupNormal — the ESP32-S3 prints its boot log on GPIO43 (UART0 TX) at every reset
Charge LED flickers with no batteryNormal with no battery attached