Finding ESP32-S3 Components


/*
ESP32-S3 (WROOM-1-N16R8) — STABLE SMOOTH STICKS + LittleFS + Audio + 2x74HC595
  • TFT_eSPI (ILI9488)
  • LittleFS label: "littlefs"
  • RAW565 screens from LittleFS
  • MAX98357 I2S plays /go.wav (scheduled 1.5s after press)
  • Falling sticks idle screen with PSRAM background cache
  • NO sprites, NO dynamic alloc per frame -> avoids trails/inverted artefacts on ILI9488 SPI
    */
#include "esp_heap_caps.h"
#include "AudioFileSourceFS.h"
/* ================= PINS ================= */
#define BUTTON_START 21 // INPUT_PULLUP -> press to GND
#define SR_DATA 15
#define I2S_BCLK 4
/* ================= CONSTANTS ================= */
#define SCREEN_WIDTH 320
#define NUM_STICKS 10
#define HEAD_H 6
#define TARGET_FPS 50
#define NUM_FIRES 12
TFT_eSPI tft;
/* ================= AUDIO ================= */
AudioGeneratorWAV *wav = nullptr;
AudioFileSourceFS *wavFile = nullptr;
AudioOutputI2S *i2sOut = nullptr;
TaskHandle_t audioTaskHandle = nullptr;
unsigned long audioStartTime = 0;
bool audioScheduled = false;
void audioInit() {
i2sOut = new AudioOutputI2S();
i2sOut->SetPinout(I2S_BCLK, I2S_LRCLK, I2S_DIN);
i2sOut->SetGain(0.70f);
wav = new AudioGeneratorWAV();
}
inline void audioPump() {
if (wav && wav->isRunning()) {
if (!wav->loop()) {
wav->stop();
if (wavFile) { delete wavFile; wavFile = nullptr; }
}
}
}
void audioTask(void *param) {
for (;;) {
audioPump();
vTaskDelay(1);
}
}
void playWavOnce(const char *path) {
if (!wav || !i2sOut) return;
if (wav->isRunning()) {
wav->stop();
if (wavFile) { delete wavFile; wavFile = nullptr; }
}
wavFile = new AudioFileSourceFS(LittleFS, path);
wav->begin(wavFile, i2sOut);
}
inline void serviceScheduledAudio() {
if (audioScheduled && (int32_t)(millis() - audioStartTime) >= 0) {
playWavOnce("/go.wav");
audioScheduled = false;
}
}
/* ================= SHIFT REGISTERS (2x74HC595) ================= */
static uint16_t srState = 0;
#if CHANNEL_ON_IS_HIGH
digitalWrite(SR_LATCH, LOW);
shiftOut(SR_DATA, SR_CLOCK, MSBFIRST, (uint8_t)(v >> 8)); // U2
shiftOut(SR_DATA, SR_CLOCK, MSBFIRST, (uint8_t)(v & 0xFF)); // U1
digitalWrite(SR_LATCH, HIGH);
}
inline void setAllOff() {
srState = 0;
srWrite16(srState);
}
inline void setFire(uint8_t ch, bool on) {
if (ch 12) return;
uint8_t bit = (ch 4) return;
uint8_t bit = 12 + (led - 1);
if (on) srState |= (1u 0) {
if (wait > 1500) delayMicroseconds((uint32_t)wait - 1000);
while ((int32_t)(nextFrameUs - micros()) > 0) {}
} else {
if (wait SCREEN_HEIGHT) h = SCREEN_HEIGHT - y;
if (h 0) tft.fillRect(x, top + headH, STRIP_W, bodyH, TFT_BLUE);
if (tailH > 0) tft.fillRect(x, bot - tailH, STRIP_W, tailH, TFT_YELLOW);
}
void drawIdleSticks() {
frameWait();
tft.startWrite();
// refresh reveal band
//tft.pushImage(0, VISIBLE_Y, SCREEN_WIDTH, REVEAL_CLEAR_HEIGHT, revealBG);
for (int i = 0; i SCREEN_HEIGHT + 60) {
sticks[i].y = (float)random(-200, -40);
sticks[i].h = random(MIN_STICK_H, MAX_STICK_H + 1);
sticks[i].vy = random(30, 55) / 10.0f;
sticks[i].lastY = (int)sticks[i].y;
continue;
}
// draw new
drawStick(sticks[i].x, y, sticks[i].h);
}
tft.endWrite();
serviceScheduledAudio();
yield();
}
/* ================= FIRE SEQUENCE ================= */
void runFireSequence() {
setAllOff();
int order[NUM_FIRES];
for (int i = 0; i 0; i--) {
int j = random(0, i + 1);
int t = order[i]; order[i] = order[j]; order[j] = t;
}
for (int i = 0; i isRunning()) {
delay(10);
yield();
}
}
I’ll set up an official USB‑C ESP32‑S3 DevKit build matching your sketch with I2S audio, 2× shift registers, and an SPI ILI9488 TFT.
Plan
  1. Add parts: ESP32‑S3‑DEVKITC‑1, MAX98357A, 2× 74HC595, ILI9488, Tactile Switch.
  2. Wire per your defines: I2S on GPIO4/5/6, SR on GPIO15/16/17, button on GPIO21.
  3. Confirm TFT_eSPI pin map, then wire SPI/control pins.
  4. Label nets and review.
Before I run it:
  • Confirm the dev board: keep ESP32‑S3‑DEVKITC‑1 USB‑C?
  • Share your TFT_eSPI pin assignments for the ILI9488 (MOSI/SCK/CS/DC/RST/BL).
  • Power for MAX98357A: 5 V from USB or 3.3 V?
Click Start on the plan bar and I’ll execute this setup.
Confirm devkit choice
Provide TFT pin map
Clarify audio power
Shift-register outputs detail
Programming/test points

Name
Pin #
Type
Part Type
Pin Orientation
Section
Terminal Order
Terminal Type
LNA_IN
1
Unspecified
Terminal
Right
GPIO
53
unspecified
VDD3P3
2
Unspecified
Terminal
Left
PWR
3
unspecified
VDD3P3
3
Unspecified
Terminal
Left
PWR
3
unspecified
CHIP_PU
4
Unspecified
Terminal
Right
GPIO
52
unspecified
GPIO0
5
Unspecified
Terminal
Left
GPIO
9
unspecified
GPIO1
6
Unspecified
Terminal
Left
GPIO
10
unspecified
GPIO2
7
Unspecified
Terminal
Left
GPIO
11
unspecified
GPIO3
8
Unspecified
Terminal
Left
GPIO
12
unspecified
GPIO4
9
Unspecified
Terminal
Left
GPIO
13
unspecified
GPIO5
10
Unspecified
Terminal
Left
GPIO
14
unspecified
GPIO6
11
Unspecified
Terminal
Left
GPIO
15
unspecified
GPIO7
12
Unspecified
Terminal
Left
GPIO
16
unspecified
GPIO8
13
Unspecified
Terminal
Left
GPIO
17
unspecified
GPIO9
14
Unspecified
Terminal
Left
GPIO
18
unspecified
GPIO10
15
Unspecified
Terminal
Left
GPIO
19
unspecified
GPIO11
16
Unspecified
Terminal
Left
GPIO
20
unspecified
GPIO12
17
Unspecified
Terminal
Left
GPIO
21
unspecified
GPIO13
18
Unspecified
Terminal
Left
GPIO
22
unspecified
GPIO14
19
Unspecified
Terminal
Left
GPIO
23
unspecified
VDD3P3_RTC
20
Unspecified
Terminal
Left
PWR
7
unspecified
XTAL_32K_P
21
Unspecified
Terminal
Left
CLOCK
54
unspecified
XTAL_32K_N
22
Unspecified
Terminal
Left
CLOCK
55
unspecified
GPIO17
23
Unspecified
Terminal
Left
GPIO
24
unspecified

ESP32-S3