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
| Symptom | Likely cause |
|---|---|
| No serial port appears | Try the BOOT + RESET sequence above; check the cable carries data, not just power |
| Matrix stays dark | GPIO47 not driven LOW |
| Board won't run your program after reset | Something is holding GPIO0 (BOOT) low at reset |
| Odd characters on serial at startup | Normal — the ESP32-S3 prints its boot log on GPIO43 (UART0 TX) at every reset |
| Charge LED flickers with no battery | Normal with no battery attached |
