Elecrow CrowPanel Rotary 2.1 (ESP32-S3)

Round 2.1" 480x480 IPS knob display on an ESP32-S3 - rotary encoder plus capacitive touch, official ESPHome support, and the smart home knob we actually enjoy using.

USB-C
Elecrow CrowPanel Rotary 2.1 (ESP32-S3) board
79 × 79 mm
ESP32-S3
MCU
240MHz
clock
16MB
flash
512KB
SRAM
29· Two 12-bit, 20 Channels ADC
GPIO
BLE 5.0+ WiFi
radio
On this page

Pinout

29 pins
View:
PinGPIOLabelsStatusCapabilitiesNotes
10IO0BOOTstrapping-BOOT button - hold at power-up for download mode
23IO3LCD_Rstrapping-Internal - RGB panel data
34IO4ENC_Asafe-Rotary encoder phase A (pull-up) - swap with IO42 if direction is inverted
45IO5LCD_Bsafe-Internal - RGB panel data
56IO6LCD_BLsafepwmDisplay backlight - LEDC PWM (19.5kHz in the official config)
67IO7LCD_VSYNCsafe-Internal - RGB panel vertical sync
78IO8LCD_Rsafe-Internal - RGB panel data
89IO9LCD_Gstrapping-Internal - RGB panel data
910IO10LCD_Gstrapping-Internal - RGB panel data
1011IO11LCD_Gstrapping-Internal - RGB panel data
1112IO12LCD_Gstrapping-Internal - RGB panel data
1213IO13LCD_Gstrapping-Internal - RGB panel data
1314IO14LCD_Gstrapping-Internal - RGB panel data
1415IO15LCD_HSYNCsafe-Internal - RGB panel horizontal sync
1516IO16LCD_CSsafespiInternal - ST7701S 3-wire SPI init chip select
1617IO17LCD_Rsafe-Internal - RGB panel data
1718IO18LCD_Rsafe-Internal - RGB panel data
1821IO21LCD_Bsafe-Internal - RGB panel data
1938IO38SDAstrappingi2cI2C bus - CST816 touch (0x15) and PCF8574 expander (0x21); also on the I2C expansion connector
2039IO39SCLstrappingi2cI2C bus - same shared bus as IO38
2140IO40LCD_DEstrapping-Internal - RGB panel data enable
2241IO41LCD_PCLKstrapping-Internal - RGB panel pixel clock (18MHz)
2342IO42ENC_Bstrapping-Rotary encoder phase B (pull-up)
2443IO43TXD0strappinguartUART0 - USB-C flashing/logs and the UART expansion connector
2544IO44RXD0strappinguartUART0 - USB-C flashing/logs and the UART expansion connector
2645IO45LCD_Bstrapping-Internal - RGB panel data
2746IO46LCD_Rstrapping-Internal - RGB panel data
2847IO47LCD_Bstrapping-Internal - RGB panel data
2948IO48LCD_Bstrapping-Internal - RGB panel data

Start with these

10 pins with no boot or system involvement
IO4ENC_AIO5LCD_BIO6LCD_BLIO7LCD_VSYNCIO8LCD_RIO15LCD_HSYNCIO16LCD_CSIO17LCD_RIO18LCD_RIO21LCD_B

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

Fine - with a little care

sampled at boot or shared with debug/serial
PinLabelWhat to knowRole
IO0GPIO0Must be pulled high (default) or low (to enter UART download mode) at reset. Using it for other functions can interfere with boot mode configuration.Strapping
IO3GPIO3Sampled at reset to select JTAG interface (USB Serial/JTAG controller vs. external pins). Improper use can disable external JTAG or alter debug interface.Strapping
IO39MTCK (GPIO39)Default JTAG debugging TCK pin. If JTAG is needed, this pin must be free; it may also be used internally for PSRAM chip select on certain modules, so avoid repurposing it.Other
IO40MTDO (GPIO40)Default JTAG TDO output for debugging. Using it as GPIO will interfere with JTAG debugging functionality.Other
IO41MTDI (GPIO41)Default JTAG TDI input for debugging. Should be reserved for JTAG or left unused if JTAG is to remain available.Other
IO42MTMS (GPIO42)Default JTAG TMS signal for debugging. Using this pin for other purposes will disable the JTAG interface (unless JTAG is rerouted to USB).Other
IO43U0TXD (GPIO43)Used for bootloader output and UART console logs. If repurposed, you will lose the default serial output (and programming via UART0).Other
IO44U0RXD (GPIO44)Used for bootloader input (download mode via serial). If repurposed, you cannot use the default UART0 download mode for programming the chip.Other
IO45GPIO45Determines 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.Strapping
IO46GPIO46Must 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.Strapping

Only if you know the tricks

wired to flash or USB - expect a fight
PinLabelWhat to knowRole
IO9FSPIHDConnected to external flash (data/hold signal) on most modules. Not recommended for use as GPIO, since it must remain dedicated to flash communication.Flash
IO10FSPICS0Used to select the external flash chip. It is required for flash access and cannot be repurposed without losing flash connectivityFlash
IO11FSPIDUsed as a data line for flash (and in-package PSRAM). It should not be used as GPIO when the flash/PSRAM is in use.Flash
IO12FSPICLKDrives the flash (and PSRAM) clock. This critical signal must be reserved for memory and not used as general GPIO.Flash
IO13FSPIQUsed as a data line for flash/PSRAM transfers. Not available for other uses when flash/PSRAM is connected.Flash
IO14FSPIWPConnected to external flash (data/write-protect signal). Not recommended as GPIO because it’s reserved for flash operations.Flash
IO38FSPIWPOn flash-equipped chips, this pin is tied to the flash’s WP# (or D3) line. It should be avoided for other use, as it’s needed for flash operations.Flash
IO47SPICLK_PUsed only on variants with Octal SPI interface (e.g. ESP32-S3R16V) as part of the differential clock pair. On such chips it operates at 1.8 V and is reserved for the high-speed octal SPI clock, not for general GPIO use.Flash
IO48SPICLK_NUsed only on variants with Octal SPI interface, as the negative leg of the differential clock&. On such chips it operates at 1.8 V; it should be avoided for GPIO to prevent conflicts with the octal flash/PSRAM clock.Flash
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.
Pinout notes The Elecrow CrowPanel Rotary 2.1 (ESP32-S3) pinout brings out 29 GPIO pins - every one of them usable in your project. For peripherals, I²C is mapped to SDA on…

The Elecrow CrowPanel Rotary 2.1 (ESP32-S3) pinout brings out 29 GPIO pins - every one of them usable in your project.

For peripherals, I²C is mapped to SDA on GPIO38 and SCL on GPIO39.

On the analog side there are PWM on 1 pins.

If you want zero surprises, IO4, IO5, IO6, IO7 and 6 more are free of any such role - the safest first picks. 10 of the exposed pins carry boot-time or system duties on the ESP32-S3 (IO0, IO3, IO39 and 7 more).


Most pins drive the 480x480 panel: an RGB bus with red on IO46/IO3/IO8/IO18/IO17, green on IO14/IO13/IO12/IO11/IO10/IO9, blue on IO5/IO45/IO48/IO47/IO21, plus CS on IO16 (3-wire SPI init), DE on IO40, HSYNC/VSYNC on IO15/IO7 and PCLK on IO41 at 18MHz. The backlight is LEDC PWM on IO6.

The rotary encoder is on IO4 (A) and IO42 (B) with pull-ups - swap them if your knob direction is inverted. I2C runs on IO38 (SDA) / IO39 (SCL) and hosts the CST816 touch controller (0x15) and a PCF8574 expander at 0x21 that owns the housekeeping lines: touch reset (P0), touch interrupt (P2), LCD power (P3), LCD reset (P4) and - importantly - the encoder push button on P5.

Expansion is through the UART and I2C connectors and a 12-pin FPC rather than a pin header. Firmware must walk the PCF8574 power-on sequence (LCD power, then resets) before the panel or touch respond - Elecrow's ESPHome example and our review config both handle it on boot.

Getting started

flash your first firmware in ~2 minutes
Tool:
1
Connect over USB
Install your USB-serial driver (CH340 / CP210x) if no port appears. Not detected? Hold BOOT while plugging in.
2
Match & flash
Set the Tools options shown, then click Upload.
3
Verify it runs
The onboard LED on GPIO4 blinks - swap the pin if your board's LED differs.
Set these in Tools · leave everything else at default
Arduino IDE 2.x — Tools Copy
Board: "ESP32S3 Dev Module"
Flash Size: "16MB (128Mb)"
PSRAM: "QSPI PSRAM"
Partition Scheme: "16M Flash (3MB APP / 9.9MB FATFS)" (default)
Upload Speed: "921600"
▸ every other Tools option — leave at default
Board: ESP32S3 Dev Module
Flash Size: 16MB (128Mb)
PSRAM: QSPI PSRAM
Partition Scheme: 16M Flash (3MB APP / 9.9MB FATFS)
Upload Speed: 921600
Find it: Tools ▸ Board ▸ ESP32 Arduino ▸ ESP32S3 Dev Module
blink.ino Copy
// blink the onboard LED
void setup() {
  pinMode(4, OUTPUT);
}
void loop() {
  digitalWrite(4, HIGH); delay(500);
  digitalWrite(4, LOW);  delay(500);
}
board to selectesp32-s3-devkitc-1⧉ copy
platformio.ini Copy
[env:elecrow-crowpanel-rotary-2-1]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
upload_speed = 921600
board_build.arduino.memory_type = qio_qspi
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: 
  framework:
    type: esp-idf
psram:
  mode: quad
  speed: 80MHz

# blink - GPIO4
output:
  - platform: gpio
    pin: 4
    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
ESPHome support went official in 2026 illustration
ESPHome support went official in 2026

Round RGB displays used to mean raw C, custom drivers and init-sequence archaeology. Since January 2026 Elecrow ships official ESPHome examples for this panel - and we designed our review UI visually in the ESPHome LVGL Designer instead of hand-coding coordinates.

Copy the ST7701S init_sequence from Elecrow's official YAML verbatim - one wrong byte gives you garbage or a black screen.

Not every "pin" is a GPIO here illustration
Not every "pin" is a GPIO here

A PCF8574 expander at I2C 0x21 owns the housekeeping: LCD power and reset, touch reset and interrupt, and the encoder's push button (P5). Rotation is on real GPIOs (IO4/IO42), but the click comes over I2C - firmware expecting a button GPIO will wait forever.

If the knob direction feels inverted, swap pin A and B (IO4/IO42) in your config - it's the most common mix-up on this board.

The stock case is the weak point - print a better one illustration
The stock case is the weak point - print a better one
The screen and knob feel premium; the stock aluminum-and-plastic shell doesn't quite match them. We 3D-printed a replacement case (files linked in the review) and the whole device jumped a quality tier - it's an easy weekend upgrade if you have a printer. For a smaller or cheaper build, Elecrow's 1.28" 240x240 rotary sibling uses the same interaction model - but the 2.1" panel is the one worth the extra few…

The screen and knob feel premium; the stock aluminum-and-plastic shell doesn't quite match them. We 3D-printed a replacement case (files linked in the review) and the whole device jumped a quality tier - it's an easy weekend upgrade if you have a printer.

For a smaller or cheaper build, Elecrow's 1.28" 240x240 rotary sibling uses the same interaction model - but the 2.1" panel is the one worth the extra few dollars.

Specifications

ESP32-S3 · 79 × 79 mm
Compute
MCU
ESP32-S3
Clock
240 MHz
SRAM · Flash
512 KB · 16MB · 8MB PSRAM
Radio
Wi-Fi
802.11 b/g/n
Bluetooth
5.0 LE
Antenna
PCB
I/O
GPIO · ADC
29 · Two 12-bit, 20 Channels
UART · I²C · SPI
3 · 2 · 4
PWM
8 channels
Power
USB
USB-C
Serial
-
Boot address
0x0
Display
Screen
IPS LCD (round) · 2.1" · 480x480
Driver
ST7701S
Touch
CST816
Flashing
Upload · OTA
esptool_py · esp_ota
Flash · Boot mode
- · -
Sketch · Data
- · -
79 mm79 mm
79 × 79 mm
The Elecrow CrowPanel Rotary 2.1 (ESP32-S3) uses esptool_py for firmware uploads, esp_ota for over-the-air (OTA) updates.

About this board

At its core is the ESP32-S3 - a dual-core Xtensa with vector extensions suited to AI workloads.

Expect to pay about $35.70 - above the ~$30 typical for ESP32-S3 boards.

29 GPIO are broken out - more than most ESP32-S3 boards, so the pin budget is rarely the constraint.

Onboard you'll find 8MB PSRAM, an IPS LCD (round) 2.1" 480x480 display with touch, a rotary encoder, status LEDs (Power, ambient ring) and Boot/Reset/encoder press buttons.


The Elecrow CrowPanel Rotary 2.1 is a round 480x480 IPS display with a physical rotary knob wrapped around it, built on an ESP32-S3R8 (16 MB flash, 8 MB PSRAM). We reviewed it in early 2026 and it became the rare review unit that stayed on the desk afterwards - a rotary display is an interaction device that happens to have a screen, and that makes it genuinely different from another rectangle.


The screen is the standout: 480x480 on 2.1 inches is dense enough that pixels disappear, and it's a proper IPS panel driven by an ST7701S over an RGB parallel bus. Input is triple-redundant in the best way - twist the knob (CW/CCW), press it to confirm, or just touch the screen (CST816 capacitive controller). Brightness, volume, temperature, timers: anything that's fundamentally "one value" feels better on this than on any touchscreen slider.


The software story matured recently: Elecrow ships official ESPHome examples since January 2026, including the fiddly ST7701S init sequence that historically made round RGB displays painful. Our review builds a two-way brightness controller on it - physical knob plus LVGL touch arc - designed in our own ESPHome LVGL Designer.


Honest cons from our time with it: the stock aluminum-plus-plastic shell looks better in renders than in hand (we ended up 3D-printing a case, files linked in the review), and several control signals route through a PCF8574 I/O expander rather than real GPIOs, which you must understand before writing your own firmware. Neither changed the verdict - as a smart home knob it's the most fun ESP32 display we've tested.

  • Round 2.1" 480x480 IPS panel (ST7701S, RGB parallel bus) - high enough density that pixels disappear
  • Physical rotary knob (CW/CCW + press) around the screen, plus CST816 capacitive touch
  • ESP32-S3R8 - 16 MB flash, 8 MB PSRAM
  • Official ESPHome example configs from Elecrow (since January 2026), full init sequence included
  • PCF8574 I/O expander (I2C 0x21) manages LCD power/reset, touch reset/interrupt and the encoder button
  • Backlight on LEDC PWM (IO6) - smooth dimming at 19.5kHz, no whine
  • UART and I2C expansion connectors plus a 12-pin FPC
  • Ambient LED ring and power LED; Boot and Reset buttons
  • 79 x 79 x 30 mm, 80 g; a 1.28" 240x240 sibling exists for smaller builds

FAQ

5 common questions
Does the CrowPanel Rotary 2.1 work with ESPHome?
Yes - officially. Elecrow publishes example ESPHome configs including the complete ST7701S init sequence (about 30 lines of hex you should copy, not type). Our review extends that into a working brightness-controller config with the knob and LVGL touch arc controlling the same value. Home Assistant integration works out of the box once the API is enabled.
Why doesn't my display or touch respond with custom firmware?
The power-on sequence lives on the PCF8574 expander at I2C 0x21 - LCD power (P3), LCD reset (P4) and touch reset (P0) must be toggled in the right order before either chip answers. Firmware that talks straight to the ST7701S or CST816 without walking the expander first gets a dead panel. Copy the boot sequence from Elecrow's example.
Where is the encoder's push button?
Not on a GPIO - it's on P5 of the PCF8574 expander, so you read it over I2C rather than with a pin interrupt. The rotation itself uses real GPIOs (IO4 and IO42). In ESPHome this all maps cleanly; in Arduino you'll want a PCF8574 library.
Is the knob any good compared to cheaper round displays?
The rotation is smooth with enough resistance to avoid accidental bumps, and press-to-confirm works reliably. Compared to 240x240 rounds, the 480x480 panel is the bigger difference - there's enough resolution for a real UI, not just a big number. Our main gripe was the stock shell's plasticky feel, which a 3D-printed case (files in our review) fixes completely.
What would we actually use it for?
Single-value controls - a brightness knob, thermostat dial, volume control, kitchen timer. The combination of muscle-memory physical input plus a glanceable display is exactly right for those. For multi-page dashboards, a rectangular CrowPanel makes more sense.

Where to buy

prices are typical street prices
Elecrow CrowPanel Rotary 2.1 (ESP32-S3)
Elecrow CrowPanel Rotary 2.1 (ESP32-S3)
$35.70per unit, typical

Resources

Similar boards