In order to test the USB functionality of the ESP32-S3, I bought the following camera/microphone board:

Before testing the USB I implemented and executed the following test cases for each hardware component:

Here is a summary of the limitations/issues that I have found:

  • I could not make the 4 pin SDMMC to work.
  • The microphone just provides noise
  • The board has no Boot button, so you can not set the board easily into upload mode. Here is the work around:
    • connect GND with Pin 0
    • press and release the SWT2 (Reset/EN button)
    • disconnect Pin 0

My first USB tests with TinyUSB for Video and Audio were failing, so I need to look into this in more detail.

Categories: Arduino

1 Comment

galank · 3. January 2026 at 11:15

/**
* ESP32-S3 WORKING FEATURES ONLY
* Menggunakan hanya fungsi yang terbukti berhasil
*/
#include
#include
#include “driver/i2s.h”

#define I2S_WS 2
#define I2S_SD 41
#define I2S_SCK 42
#define LED_PIN 21

WebServer server(80);

void setupWiFiAP();
void setupI2SMicrophone();
void setupWebServer();

void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);

Serial.println(“\n=== ESP32-S3 WORKING MODULE ===”);
Serial.println(“Fitur yang berhasil:”);
Serial.println(“1. WiFi ✓”);
Serial.println(“2. GPIO/LED ✓”);
Serial.println(“3. I2S (microphone) ✓”);
Serial.println(“4. Web Server ✓”);

// 1. Setup WiFi Access Point
setupWiFiAP();

// 2. Setup I2S Microphone
setupI2SMicrophone();

// 3. Setup Web Server
setupWebServer();

Serial.println(“\nModule ready!”);
Serial.print(“Connect to WiFi: “);
Serial.println(WiFi.softAPIP());
}

void setupWiFiAP() {
const char* ssid = “ESP32-S3-Module”;
const char* password = “12345678”;

WiFi.softAP(ssid, password);

Serial.print(“AP IP address: “);
Serial.println(WiFi.softAPIP());
}

void setupI2SMicrophone() {
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = 16000,
.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = I2S_COMM_FORMAT_I2S,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 4,
.dma_buf_len = 1024,
.use_apll = false,
.tx_desc_auto_clear = false
};

i2s_pin_config_t pin_config = {
.bck_io_num = I2S_SCK,
.ws_io_num = I2S_WS,
.data_out_num = -1,
.data_in_num = I2S_SD
};

i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
i2s_set_pin(I2S_NUM_0, &pin_config);

Serial.println(“I2S Microphone initialized”);
}

void setupWebServer() {
server.on(“/”, []() {
String html = “”;
html += “ESP32-S3 Module Control”;
html += “WiFi: Connected”;
html += “LED ON “;
html += “LED OFF”;
html += “setInterval(()=>fetch(‘/audio’).then(r=>r.text()).then(t=>document.getElementById(‘audio’).innerText=’Audio Level: ‘+t),500)”;
html += “”;
html += “”;
server.send(200, “text/html”, html);
});

server.on(“/led/on”, []() {
digitalWrite(LED_PIN, HIGH);
server.send(200, “text/plain”, “LED ON”);
});

server.on(“/led/off”, []() {
digitalWrite(LED_PIN, LOW);
server.send(200, “text/plain”, “LED OFF”);
});

server.on(“/audio”, []() {
int16_t buffer[128];
size_t bytes_read;
i2s_read(I2S_NUM_0, buffer, sizeof(buffer), &bytes_read, 0);

int maxAmplitude = 0;
for(int i = 0; i > 16);
if(val > maxAmplitude) maxAmplitude = val;
}

server.send(200, “text/plain”, String(maxAmplitude));
});

server.begin();
Serial.println(“HTTP server started”);
}

void loop() {
server.handleClient();
delay(2);
}

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *