Waveshare ESP32-S3-ETH

ESP32-S3R8 board with W5500 wired Ethernet, an optional PoE module, a DVP camera connector, TF card slot and a Pico-compatible 40-pin header.

Our pick USB-C Native USB
Waveshare ESP32-S3-ETH board
72.8 × 21 mm
ESP32-S3
MCU
240MHz
clock
16MB
flash
512KB
SRAM
25· 7 ADC
GPIO
BLE 5.0+ WiFi
radio
On this page

Waveshare ESP32-S3-ETH Pinout

40 pins · 2.54 mm pitch
Waveshare ESP32-S3-ETH pinout diagram, high resolution: all 40 pins, with GPIO numbers, ADC channels and strapping pins
Waveshare ESP32-S3-ETH pinout, drawn by ESPboards from the ESP32-S3 Series Datasheet v2.2.
PinGPIOLabelsStatusCapabilitiesNotes
1-VBUSpower-USB bus 5V (Pico VBUS position)
2-VSYSpower-5V system supply pin (Pico VSYS position)
3-GNDground-Ground
4-3V3_ENcontrol-3.3V regulator enable (Pico 3V3_EN position)
5-3V3power-3.3V output from the onboard regulator
621IO21GPIO21safepwmDrives the onboard WS2812 RGB LED
717IO17GPIO17safeadc · pwmADC2 - not usable while Wi-Fi is active
8-GNDground-Ground
916IO16GPIO16safeadc · pwmADC2 - not usable while Wi-Fi is active
1018IO18GPIO18safeadc · pwmADC2; camera D7 when a camera is fitted
11-RUNCHIP_UPENcontrol-Chip enable / reset input (Pico RUN position)
1215IO15GPIO15safeadc · pwmADC2; camera D6 when a camera is fitted
13-GNDground-Ground
143IO3GPIO3strappingadc · touch · pwmADC1, touch; camera XCLK when a camera is fitted
152IO2GPIO2safeadc · touch · pwmADC1, touch; camera HREF when a camera is fitted
161IO1GPIO1safeadc · touch · pwmADC1, touch; camera VSYNC when a camera is fitted
170IO0GPIO0strappingpwmWired to the BOOT button
18-GNDground-Ground
1944IO44GPIO44UART0 RXuartuart · pwmUART0 RX
2043IO43GPIO43UART0 TXuartuart · pwmUART0 TX
2120IO20GPIO20D_Pusb-Native USB D+, wired to the USB-C port
2219IO19GPIO19D_Nusb-Native USB D-, wired to the USB-C port
23-GNDground-Ground
2448IO48GPIO48strappingpwmCamera SIOD (SCCB data) when a camera is fitted
2547IO47GPIO47strappingpwmCamera SIOC (SCCB clock) when a camera is fitted
2646IO46GPIO46strappingpwmCamera D2 when a camera is fitted
2745IO45GPIO45strappingpwmCamera D1 when a camera is fitted
28-GNDground-Ground
2942IO42GPIO42strappingpwmCamera D3 when a camera is fitted; JTAG MTMS
3041IO41GPIO41strappingpwmCamera D0 when a camera is fitted; JTAG MTDI
3140IO40GPIO40strappingpwmCamera D4 when a camera is fitted; JTAG MTDO
3239IO39GPIO39strappingpwmCamera PCLK when a camera is fitted; JTAG MTCK
33-GNDground-Ground
3438IO38GPIO38safepwmCamera D5 when a camera is fitted
3537IO37GPIO37strapping-Reserved by the octal PSRAM - not usable as GPIO
3636IO36GPIO36strapping-Reserved by the octal PSRAM - not usable as GPIO
3735IO35GPIO35strapping-Reserved by the octal PSRAM - not usable as GPIO
38-GNDground-Ground
3934IO34GPIO34strapping-Reserved by the octal PSRAM - not usable as GPIO
4033IO33GPIO33strapping-Reserved by the octal PSRAM - not usable as GPIO
Download the Waveshare ESP32-S3-ETH pinout Free to use and share for non-commercial work, as long as you credit espboards.dev. License.
27 GPIOs broken out 8 free · 12 need care · 7 to avoid

Start with these

8 pins with no boot or system involvement
IO21IO17IO16IO18IO15IO2IO1IO38

Freely assignable - no strapping, flash, USB or JTAG duties. Ideal first picks for buttons, sensors and LEDs.

Fine - with a little care

12 pins · 11 things to know
IO3 Bootstrapping pin (controls JTAG signal source) Strapping

Sampled at reset to select JTAG interface (USB Serial/JTAG controller vs. external pins). Improper use can disable external JTAG or alter debug interface.

IO0 Bootstrapping pin (Chip boot mode selection) Strapping

Must be pulled high (default) or low (to enter UART download mode) at reset. Using it for other functions can interfere with boot mode configuration.

IO44 UART0 receive pin (U0RXD), default serial console RX UART

Used for bootloader input (download mode via serial). If repurposed, you cannot use the default UART0 download mode for programming the chip.

IO43 UART0 transmit pin (U0TXD), default serial console TX UART

Used for bootloader output and UART console logs. If repurposed, you will lose the default serial output (and programming via UART0).

IO48IO47 Octal SPI differential clock legs (SPICLK_P/N_DIFF), used only by the 1.8 V octal flash/PSRAM variants Other

Only the 1.8 V octal parts (ESP32-S3R8V, ESP32-S3R16V) run the differential memory clock here, and on those the pin works at 1.8 V instead of 3.3 V. On the common 3.3 V modules it is a normal GPIO - several devkits drive their RGB LED from GPIO48.

  • IO48Octal SPI differential clock negative leg (SPICLK_N_DIFF), used only by the 1.8 V octal flash/PSRAM variants
  • IO47Octal SPI differential clock positive leg (SPICLK_P_DIFF), used only by the 1.8 V octal flash/PSRAM variants
IO46 Bootstrapping pin (used with GPIO0 for boot mode; controls ROM log output) Strapping

Must be at a defined level during reset (with GPIO0) to select normal or download boot and UART/USB print mode. This pin is input-only (no output drive), so it should be left for its intended strapping function.

IO45 Bootstrapping pin (selects VDD_SPI flash voltage) Strapping

Determines flash/PSRAM power voltage (3.3 V vs 1.8 V) at boot. Must match hardware configuration; using as GPIO can upset flash supply setting.

IO42 JTAG test mode select pin (MTMS) JTAG

Default JTAG TMS signal for debugging. Using this pin for other purposes will disable the JTAG interface (unless JTAG is rerouted to USB).

IO41 JTAG test data in pin (MTDI) JTAG

Default JTAG TDI input for debugging. Should be reserved for JTAG or left unused if JTAG is to remain available.

IO40 JTAG test data out pin (MTDO) JTAG

Default JTAG TDO output for debugging. Using it as GPIO will interfere with JTAG debugging functionality.

IO39 JTAG test clock (MTCK); IO MUX alternates CLK_OUT3 and SUBSPICS1 (chip select on the alternative SUBSPI memory bus, unused on standard modules) JTAG

Default JTAG TCK - keep it free if you debug over JTAG. It is not a flash or PSRAM line on standard modules: those sit on GPIO26-37.

Only if you know the tricks

7 pins · 2 things to know
IO20IO19 USB OTG differential data pair (D- and D+) USB

By default connected to the on-chip USB Serial/JTAG controller. Using it as general GPIO without reconfiguring IO MUX will interfere with USB functionality.

  • IO20USB OTG positive differential data line (USB_D+)
  • IO19USB OTG negative differential data line (USB_D-)
IO37IO36IO35IO34IO33 Octal (8-line) flash/PSRAM data and strobe lines on R8/R16V modules; free on quad-PSRAM and PSRAM-less parts Flash

The datasheet keeps GPIO33-37 for "the higher 4 bits data line interface and DQS interface for the SPI0/1 interface in 8-line SPI mode", so octal-PSRAM modules (N16R8 and friends) consume it and do not break it out. On quad-PSRAM or PSRAM-less parts it is an ordinary GPIO - check which variant your module carries.

  • IO37Octal (8-line) flash/PSRAM data strobe DQS/DM on R8/R16V modules; free on quad-PSRAM and PSRAM-less parts
  • IO36Octal (8-line) flash/PSRAM data line DQ7 on R8/R16V modules; free on quad-PSRAM and PSRAM-less parts
  • IO35Octal (8-line) flash/PSRAM data line DQ6 on R8/R16V modules; free on quad-PSRAM and PSRAM-less parts
  • IO34Octal (8-line) flash/PSRAM data line DQ5 on R8/R16V modules; free on quad-PSRAM and PSRAM-less parts
  • IO33Octal (8-line) flash/PSRAM data line DQ4 on R8/R16V modules; free on quad-PSRAM and PSRAM-less parts
These are recommendations, not hard rules - with the right pull-ups, timing and boot-state awareness most pins can be made to work. When in doubt, start green.

The Waveshare ESP32-S3-ETH pinout brings out 40 pins at a 2.54 mm pitch - 25 usable GPIO alongside the VBUS, VSYS, GND and 3V3 power rails.

Beyond plain digital I/O you get 7 ADC-capable pins for sensors and battery monitoring, PWM on 20 pins and 3 capacitive-touch inputs.

12 of the exposed pins carry boot-time or system duties on the ESP32-S3 (IO3, IO0, IO44 and 9 more) - check the guidance above before wiring anything to them. IO21, IO17, IO16, IO18 and 4 more are free of any such role - the safest first picks.

Pinout notes The 40-pin header copies the Raspberry Pi Pico layout: VBUS, VSYS, 3V3_EN and RUN sit where the Pico puts them, and a ground pin falls at every fifth position.…

The 40-pin header copies the Raspberry Pi Pico layout: VBUS, VSYS, 3V3_EN and RUN sit where the Pico puts them, and a ground pin falls at every fifth position. The I/O positions carry ESP32-S3 GPIO numbers rather than Pico GP numbers, so a Pico HAT may fit but firmware written for the RP2040 numbering needs remapping.

On the left side, IO21 drives the WS2812 LED, IO15 to IO18 are ADC2 inputs that cannot be read while Wi-Fi is active, IO1 to IO3 are ADC1 and touch pins, IO0 is the BOOT button, and IO43/IO44 are UART0. On the right, IO19/IO20 are the native USB data lines already wired to the USB-C port, IO39 to IO42 double as JTAG, and IO33 to IO37 are taken by the octal PSRAM - they are on the header but cannot be used as GPIO, which leaves 20 free I/O pins rather than 25.

Three peripherals live on pins that never reach the header: the W5500 on IO9 to IO14 (SCLK 13, MOSI 11, MISO 12, CS 14, INT 10, RST 9), the TF card on IO4 to IO7 (CS 4, MISO 5, MOSI 6, SCLK 7) and the camera power gate on IO8. The camera data path, however, shares 14 header pins - VSYNC 1, HREF 2, XCLK 3, PCLK 39, SIOD 48, SIOC 47 and D7-D0 on 18, 15, 38, 40, 42, 46, 45, 41 - so with a camera plugged in those pins are no longer free.

Getting started

flash your first firmware in ~2 minutes
Tool:
1
Connect over USB
Native USB - shows up as a port right away, no driver needed. Not detected? Hold BOOT while plugging in.
2
Match & flash
Set the Tools options shown, then click Upload.
3
Verify it runs
GPIO21 toggles - wire an LED and resistor to it, or change the pin to your board's own LED.
Set these in Tools · leave everything else at default
Arduino IDE 2.x - Tools Copy
Board: "ESP32S3 Dev Module"▸
USB CDC On Boot: "Enabled"▸
Flash Size: "16MB (128Mb)"▸
Flash Mode: "QIO"▸
PSRAM: "OPI PSRAM"▸
Partition Scheme: "Huge APP (3MB No OTA/1MB SPIFFS)" (default)▸
Upload Speed: "921600"▸
▸ every other Tools option - leave at default
Board: ESP32S3 Dev Module
USB CDC On Boot: Enabled
Flash Size: 16MB (128Mb)
Flash Mode: QIO
PSRAM: OPI PSRAM
Partition Scheme: Huge APP (3MB No OTA/1MB SPIFFS)
Upload Speed: 921600
Find it: Tools ▸ Board ▸ ESP32 Arduino ▸ ESP32S3 Dev Module
blink.ino Copy
// toggle GPIO21 - wire an LED and resistor to it
void setup() {
  pinMode(21, OUTPUT);
}
void loop() {
  digitalWrite(21, HIGH); delay(500);
  digitalWrite(21, LOW);  delay(500);
}
board to selectesp32-s3-devkitc-1⧉ copy
platformio.ini Copy
[env:waveshare-esp32-s3-eth]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
upload_speed = 921600
board_build.arduino.memory_type = qio_opi
build_flags = -DBOARD_HAS_PSRAM
Find it: PlatformIO Home ▸ Boards, search esp32-s3-devkitc-1 - or type it after board =.
board to selectesp32-s3-devkitc-1⧉ copy
device.yaml Copy
esp32:
  board: esp32-s3-devkitc-1
  variant: esp32s3
  framework:
    type: esp-idf
psram:
  mode: octal
  speed: 80MHz

# blink - GPIO21
output:
  - platform: gpio
    pin: 21
    id: led_out
light:
  - platform: binary
    name: "LED"
    output: led_out
Find it: search ESPHome's board list for esp32-s3-devkitc-1 (same ids as PlatformIO).
esptool doesn't pick board settings - a prebuilt .bin already has them baked in. This is just the raw flash command.
terminal Copy
esptool.py --chip esp32s3 --port /dev/ttyACM0 \
  --baud 921600 write_flash 0x0 firmware.bin
--port = your /dev/tty* (macOS/Linux) or COMx (Windows).

Good to know

board-specific quirks worth 60 seconds

The u.FL socket does nothing until you move a resistor. Out of the box the RF path goes to the ceramic antenna, selected by a 0 ohm resistor that is mounted vertically. To use an external antenna on the IPEX Gen 1 (u.FL) socket, re-solder that resistor horizontally so it routes the signal to the connector. Plugging an antenna in without the change has no effect.

Camera power is gated by GPIO8, which is not on the header. Until GPIO8 is driven low before the camera driver starts, the sensor stays undetected and the driver returns ESP_ERR_NOT_FOUND (0x105). In Arduino assign GPIO8 as the PWDN pin; in ESPHome add a gpio switch on GPIO8 with a higher setup priority so it is set before the camera initialises.

Downloads

Free for non-commercial use, credit espboards.dev · License
Waveshare ESP32-S3-ETH board illustration, front

Board illustration

The bare Waveshare ESP32-S3-ETH board drawn to scale at 72.8 × 21 mm, with no pin labels on it. Made for slide decks, wiring diagrams and project write-ups where a photo is too busy. Take the scalable SVG for print or editing, the high-resolution PNG to drop straight in, or the transparent PNG when you need it with no background behind it.

Waveshare ESP32-S3-ETH pinout diagram

Pinout diagram

Every pin on both sides of the board with its functions, drawn by ESPboards from the ESP32-S3 Series Datasheet v2.2 - the same sheet shown at the top of this page. The PNG is a high-resolution image for screens, the SVG is vector so it stays sharp at any size, and the PDF is laid out to print on A4 or Letter.

Free for non-commercial use, with the credit line kept.

Embed the Waveshare ESP32-S3-ETH pinout

Paste this where you want the diagram. Keep the credit line - it is what the licence asks for, and it is the only thing we want in return.

<figure>
  <img src="https://cdn.espboards.net/boards/waveshare-esp32-s3-eth/diagram-1600.png"
       alt="Waveshare ESP32-S3-ETH pinout diagram" width="1600" loading="lazy">
  <figcaption>
    Waveshare ESP32-S3-ETH pinout by
    <a href="https://www.espboards.dev/esp32/waveshare-esp32-s3-eth/">ESPboards</a>,
    <a href="https://creativecommons.org/licenses/by-nc/4.0/">CC BY-NC 4.0</a>
  </figcaption>
</figure>

Using it commercially? Ask us first - it takes one email.

Yours to use, share and adapt for non-commercial work, as long as you credit espboards.dev - the full terms and ready-made credit lines are here.

Specifications

ESP32-S3 · 72.8 × 21 mm · vs other ESP32 chips →
Compute
MCU
ESP32-S3
Clock
240 MHz
SRAM · Flash
512 KB · 16MB · 8MB (OPI) PSRAM
Radio
Wi-Fi
802.11 b/g/n
Bluetooth
5.0 LE
Antenna
Ceramic + u.FL
I/O
GPIO · ADC
25 · 7
UART · I²C · SPI
3 · 2 · 2
PWM
8 channels
Power
USB
USB-C
Serial
Native (CDC)
Boot address
0x0
Electrical
Input
5V USB-C or 5V header pin - 44-57V PoE with the optional module
Consumption
-
Regulator
JW5060
Flashing
Upload · OTA
esptool_py · esp_ota
Flash · Boot mode
QIO · QIO
Sketch · Data
- · -

Dimensions

Waveshare ESP32-S3-ETH board, drawn to scale
21 mm72.8 mm
72.8 × 21 mm · pin pitch 2.54 mm
The Waveshare ESP32-S3-ETH uses esptool_py for firmware uploads, esp_ota for over-the-air (OTA) updates. Flash mode is QIO with QIO boot mode.

About this board

Inside sits the ESP32-S3 - a dual-core Xtensa with vector extensions suited to AI workloads.

At $16.99 it's cheaper than most ESP32-S3 boards, which usually run around $29.

Around the module: 8MB (OPI) PSRAM, a microSD slot, an addressable RGB LED (GPIO21), wired Ethernet (W5500), status LEDs (ACT, LINK) and Boot/Reset buttons.

It flashes over native USB - no serial-converter driver needed, which isn't a given among ESP32-S3 boards.


The Waveshare ESP32-S3-ETH is an ESP32-S3R8 board built around wired networking. A W5500 Ethernet controller with an H1102NLT transformer sits on the board, and a header takes Waveshare's optional IEEE 802.3af PoE module, which comes fitted on the -POE- SKUs. The chip brings 8 MB of octal PSRAM, a W25Q128 provides 16 MB of flash, and the S3's own radio uses a ceramic antenna with a u.FL socket beside it.

Beyond the Ethernet jack the board carries a DVP camera connector (OV5640-compatible, camera sold separately or bundled in the CAM-KIT SKUs), a TF card slot, a WS2812 RGB LED on GPIO21, Boot and Reset buttons, and ACT and LINK Ethernet LEDs. The single USB-C port goes straight to the S3's native USB, so there is no separate serial bridge. Power comes from 5V over USB-C or the header, or from 44-57V PoE with the module.

The 40-pin header follows the Raspberry Pi Pico footprint, so some Pico expansion boards fit mechanically, and the board is sold bare or with headers pre-soldered (ESP32-S3-ETH-M). At 21 x 72.8 mm it is a long, narrow board. It suits wired or PoE-powered nodes - a camera, a sensor gateway, an ESPHome or Tasmota device - where a Wi-Fi link is not wanted. The trade-off is pin budget: the TF card and the W5500 take GPIO4-7 and GPIO9-14 internally, a fitted camera consumes 14 header pins, and GPIO33-37 on the header are reserved by the PSRAM, so plan the I/O before buying.

  • Pico-compatible 40-pin header - some Raspberry Pi Pico expansion boards fit
  • DVP camera connector (OV5640-compatible), camera sold separately or in the CAM-KIT SKUs
  • PoE expansion header - IEEE 802.3af module fitted on the -POE- SKUs
  • H1102NLT Ethernet transformer and W25Q128 16MB flash
  • Sold bare (ESP32-S3-ETH) or with pre-soldered headers (ESP32-S3-ETH-M)

FAQ

6 common questions
Which pins does the W5500 Ethernet controller use?›
The W5500 sits on GPIO9 to GPIO14, none of which reach the header: SCLK on 13, MOSI on 11, MISO on 12, CS on 14, INT on 10 and RST on 9. ESPHome wants an ethernet block of type W5500 with exactly these pins, and Tasmota uses EthType 8 with ETH MDC on 14 and ETH MDIO on 10. With any other assignment the board quietly falls back to Wi-Fi.
Can I use GPIO33 to GPIO37 on the right-hand header?›
No. They are broken out, but the octal PSRAM of the ESP32-S3R8 uses them, and Waveshare's FAQ says they cannot serve as general-purpose GPIO. That leaves 20 free I/O pins on the 40-pin header, not 25.
Can I power the board over PoE and USB at the same time?›
Better not. A community report on the Let's Control It forum notes that the PoE module is not galvanically isolated from the Ethernet supply, so powering over PoE while the board is plugged into a PC over USB carries the same risk Olimex warns about on its non-isolated ESP32-POE. Use one supply at a time.
Which camera sensor comes with the CAM-KIT?›
It changed. At launch in October 2024, and on the Amazon listings, the kit shipped a 2MP OV2640; Waveshare's product page now lists a 5MP OV5640. Check which sensor you are buying before setting camera pins and resolutions, and remember the camera stays undetected until GPIO8 is pulled low.
How do I set the board up in the Arduino IDE?›
It is not in the board list. Waveshare's guide uses ESP32S3 Dev Module with USB CDC On Boot enabled, PSRAM set to OPI PSRAM, Flash Size 16MB and the Huge APP (3MB No OTA/1MB SPIFFS) partition scheme. If an upload fails, hold BOOT, tap RESET, release BOOT and reselect the port.
Where is the TF card slot wired?›
To GPIO4 to GPIO7 (CS 4, MISO 5, MOSI 6, SCLK 7), which are not on the header. SDIO mode works but only as 1-line SD, and the pins have to be set in menuconfig.

Where to buy

prices are typical street prices
Waveshare ESP32-S3-ETH
Waveshare ESP32-S3-ETH
$16.99per unit, typical
As an Amazon Associate, ESPboards earns from qualifying purchases.
The Waveshare store link is an affiliate link - ESPboards may earn a commission on purchases, at no extra cost to you.

Resources

Similar boards