Elecrow CrowPanel 2.8 (ESP32)

Compact 2.8" 320x240 resistive-touch HMI on a classic ESP32 - the CYD alternative with proper Grove ports, a speaker output and an acrylic case, which we tested hands-on in our CrowPanel roundup.

USB-C
Elecrow CrowPanel 2.8 (ESP32) board
ESP32
MCU
240MHz
clock
4MB
flash
520KB
SRAM
21· 2 ADC
GPIO
BLE 4.2+ WiFi
radio
On this page

Pinout

21 pins
View:
Elecrow CrowPanel 2.8 (ESP32) pinout diagram
PinGPIOLabelsStatusCapabilitiesNotes
10IO0BOOTstrapping-BOOT button - hold at power-up for download mode
21IO1TXD0uartuartUART0 - CH340C USB-C flashing/logs, also on the UART0 port
32IO2TFT_DCstrapping-Internal - display data/command select
43IO3RXD0uartuartUART0 - CH340C USB-C flashing/logs, also on the UART0 port
55IO5SD_CSstrappingspimicroSD slot - chip select
612IO12TFT_MISOstrappingspiInternal - display/touch SPI MISO
713IO13TFT_MOSIstrappingspiInternal - display/touch SPI MOSI
814IO14TFT_SCLKstrappingspiInternal - display/touch SPI clock
915IO15TFT_CSstrappingspiInternal - display chip select
1016IO16UART1_RXstrappinguartUART1 Crowtail port
1117IO17UART1_TXstrappinguartUART1 Crowtail port
1218IO18SD_CLKsafespimicroSD slot - clock
1319IO19SD_MISOsafespimicroSD slot - MISO
1421IO21SCLsafei2cI2C Crowtail port - note the swap: SCL is IO21, SDA is IO22 on this board
1522IO22SDAsafei2cI2C Crowtail port
1623IO23SD_MOSIsafespimicroSD slot - MOSI
1725IO25GPIO_Dsafeadc · dacFree GPIO on the GPIO_D port - ADC and DAC capable
1826IO26SPKsafedacSpeaker output - DAC through the onboard amplifier to the PH2.0 connector
1927IO27TFT_BLsafepwmDisplay backlight - plain GPIO/PWM, HIGH is on
2032IO32GPIO_DsafeadcFree GPIO on the GPIO_D port - ADC capable
2133IO33TOUCH_CSsafespiInternal - XPT2046 touch controller chip select

Start with these

10 pins with no boot or system involvement
IO18SD_CLKIO19SD_MISOIO21SCLIO22SDAIO23SD_MOSIIO25GPIO_DIO26SPKIO27TFT_BLIO32GPIO_DIO33TOUCH_CS

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 HIGH during boot for normal startup; if held LOW on reset, forces flash programming mode.Strapping
IO2GPIO2If driven HIGH on reset (while IO0 is LOW), selects an unsupported SDIO boot mode, causing boot failure.Strapping
IO5GPIO5Must be HIGH during boot; if pulled LOW at reset, alters SDIO slave timing and may prevent normal boot.Strapping
IO12MTDI (GPIO12)Keep LOW during boot (internal PD); pulling HIGH at reset selects 1.8V flash mode, causing flash brownout if 3.3V flash is used.Strapping
IO13MTCK (GPIO13)Used for JTAG debugging (TCK); avoid using as GPIO if JTAG is needed.Other
IO14MTMS (GPIO14)Used for JTAG debugging (TMS); driving it as GPIO may interfere with JTAG or produce spurious signals at boot.Other
IO15MTDO (GPIO15)Keep HIGH during boot (internal PU); if LOW on reset, bootloader log is silenced and boot mode may change.Strapping

Only if you know the tricks

wired to flash or USB - expect a fight
PinLabelWhat to knowRole
IO1U0TXD (GPIO1)Connected to on-board USB-UART for uploading and logs; drives serial output at boot, so using as GPIO can disrupt programming or console.USB
IO3U0RXD (GPIO3)Used for receiving data from USB-UART (programming); also pulled HIGH at boot for console communication, so using as GPIO can disrupt uploads.USB
IO16GPIO16Connected to internal PSRAM on PSRAM-enabled modules; not usable as GPIO on those modules.Flash
IO17GPIO17Connected to internal PSRAM on PSRAM-enabled modules; not usable as GPIO on those modules.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 All 21 pins on the Elecrow CrowPanel 2.8 (ESP32) are usable GPIO. Peripheral wiring is straightforward: I²C is mapped to SDA on GPIO22 and SCL on GPIO21.…

All 21 pins on the Elecrow CrowPanel 2.8 (ESP32) are usable GPIO.

Peripheral wiring is straightforward: I²C is mapped to SDA on GPIO22 and SCL on GPIO21.

Beyond plain digital I/O you get 2 ADC-capable pins for sensors and battery monitoring, PWM on 1 pins and 2 true DAC outputs.

7 of the exposed pins carry boot-time or system duties on the ESP32 (IO0, IO2, IO5 and 4 more) - check the guidance above before wiring anything to them. IO18, IO19, IO21, IO22 and 6 more are free of any such role - the safest first picks.


The display runs on one SPI bus - IO14 (SCLK), IO13 (MOSI), IO12 (MISO), IO15 (CS), IO2 (DC) - with the XPT2046 touch controller sharing it on its own chip select (IO33). The backlight is a plain GPIO on IO27. The microSD slot gets the other hardware SPI: IO18 (CLK), IO19 (MISO), IO23 (MOSI), IO5 (CS), so display and SD never fight over a bus.

User I/O comes out of the four HY2.0-4P ports on the back: UART0 (the CH340C flashing UART, plus 5V input), UART1 on IO16/IO17, I2C on IO22 (SDA) / IO21 (SCL), and GPIO_D with IO25 and IO32 - both ADC-capable, and IO25 doubles as the second DAC. The speaker connector is driven from DAC IO26 through a small amplifier.

IO0 is the BOOT button. Since nearly every free pin is committed to a port or the SD slot, plan peripherals around the Crowtail connectors rather than expecting a pin header - there isn't one.

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 GPIO18 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: "ESP32 Dev Module"
Flash Size: "4MB (32Mb)"
Partition Scheme: "Default 4MB with spiffs (1.2MB APP / 1.5MB SPIFFS)" (default)
Upload Speed: "921600"
▸ every other Tools option — leave at default
Board: ESP32 Dev Module
Flash Size: 4MB (32Mb)
Partition Scheme: Default 4MB with spiffs (1.2MB APP / 1.5MB SPIFFS)
Upload Speed: 921600
Find it: Tools ▸ Board ▸ ESP32 Arduino ▸ ESP32 Dev Module
blink.ino Copy
// blink the onboard LED
void setup() {
  pinMode(18, OUTPUT);
}
void loop() {
  digitalWrite(18, HIGH); delay(500);
  digitalWrite(18, LOW);  delay(500);
}
board to selectesp32dev⧉ copy
platformio.ini Copy
[env:elecrow-crowpanel-2-8-esp32]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
upload_speed = 921600
Find it: PlatformIO Home ▸ Boards, search esp32dev — or type it after board =.
board to selectesp32dev⧉ copy
device.yaml Copy
esp32:
  board: esp32dev
  variant: 
  framework:
    type: esp-idf

# blink - GPIO18
output:
  - platform: gpio
    pin: 18
    id: led_out
light:
  - platform: binary
    name: "LED"
    output: led_out
Find it: search ESPHome's board list for esp32dev (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 esp32 --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
Resistive touch - budget for the stylus illustration
Resistive touch - budget for the stylus
The XPT2046 touch layer responds to pressure, not skin - light capacitive-style taps do nothing. Elecrow includes a stylus for a reason, and UI buttons should be sized generously. On the plus side, resistive touch works with gloves and in the rain, which capacitive panels hate. Calibrate once in firmware and store the values - an uncalibrated XPT2046 is the usual cause of "touch is offset" complaints on this…

The XPT2046 touch layer responds to pressure, not skin - light capacitive-style taps do nothing. Elecrow includes a stylus for a reason, and UI buttons should be sized generously. On the plus side, resistive touch works with gloves and in the rain, which capacitive panels hate.

Calibrate once in firmware and store the values - an uncalibrated XPT2046 is the usual cause of "touch is offset" complaints on this class of board.

The safe choice for ESPHome dashboards illustration
The safe choice for ESPHome dashboards
ILI9341 + XPT2046 is the most battle-tested display combo in the ESP32 world - ESPHome, TFT_eSPI and LVGL all support it natively, no exotic drivers or forks. In our review we had TFT_eSPI examples running within minutes, and the same tft_setup.h we published there still applies. In Arduino IDE, pick the "ESP32-WROOM-DA Module" board and keep TFT SPI at 27MHz - faster clocks corrupt the ILI9341 on long ribbon…

ILI9341 + XPT2046 is the most battle-tested display combo in the ESP32 world - ESPHome, TFT_eSPI and LVGL all support it natively, no exotic drivers or forks. In our review we had TFT_eSPI examples running within minutes, and the same tft_setup.h we published there still applies.

In Arduino IDE, pick the "ESP32-WROOM-DA Module" board and keep TFT SPI at 27MHz - faster clocks corrupt the ILI9341 on long ribbon runs.

Ports instead of pin headers illustration
Ports instead of pin headers
Expansion happens through the four HY2.0-4P Crowtail ports - UART0, UART1, I2C and GPIO_D ( IO25 / IO32 ) - all reachable through the acrylic case cutouts, plus the speaker and battery connectors. There is no bare pin header, so sensors connect Grove-style with the included cable. IO25 and IO32 on the GPIO_D port are your only free general-purpose pins - everything else is committed to the display, SD or…

Expansion happens through the four HY2.0-4P Crowtail ports - UART0, UART1, I2C and GPIO_D (IO25/IO32) - all reachable through the acrylic case cutouts, plus the speaker and battery connectors. There is no bare pin header, so sensors connect Grove-style with the included cable.

IO25 and IO32 on the GPIO_D port are your only free general-purpose pins - everything else is committed to the display, SD or ports. Plan I2C-based sensor chains for anything bigger.

Specifications

ESP32
Compute
MCU
ESP32
Clock
240 MHz
SRAM · Flash
520 KB · 4MB
Radio
Wi-Fi
802.11 b/g/n
Bluetooth
4.2 LE
Antenna
PCB
I/O
GPIO · ADC
21 · 2
UART · I²C · SPI
3 · 2 · 4
PWM
16 channels
Power
USB
USB-C
Serial
CH340C
Boot address
0x1000
Display
Screen
TFT LCD · 2.8" · 320x240
Driver
ILI9341V
Touch
XPT2046 (resistive)
Flashing
Upload · OTA
esptool_py · esp_ota
Flash · Boot mode
- · -
Sketch · Data
- · -
The Elecrow CrowPanel 2.8 (ESP32) uses esptool_py for firmware uploads, esp_ota for over-the-air (OTA) updates.

About this board

Inside sits the ESP32 - a dual-core Xtensa with both Bluetooth Classic and BLE.

At $24.90 it's on the expensive side for an ESP32 board - most land around $20.

Around the module: a TFT LCD 2.8" 320x240 display with touch, a microSD slot, a speaker, a speaker connector (PH2.0-2P), battery charging via PH2.0-2P and Boot/Reset buttons.


The Elecrow CrowPanel 2.8 is the small classic of the CrowPanel line - a 2.8-inch 320x240 ILI9341 touchscreen on a plain ESP32-WROOM-32 (4 MB flash, no PSRAM). We tested it hands-on in our CrowPanel 2.8" vs 7.0" review, where it earned the role of the sensible "cheap yellow display, but tidier" option: same display class as a CYD, but with a proper acrylic case, labeled Crowtail ports and consistent documentation.


Know what you're getting on the input side: the touch layer is resistive (XPT2046), so it wants a firm fingertip or the included stylus rather than light capacitive taps. In exchange, the display stack is about as well-supported as ESP32 screens get - ILI9341 plus XPT2046 works out of the box in ESPHome, TFT_eSPI and LVGL, and our review walks through the exact tft_setup.h for TFT_eSPI.


Around the back you get the Crowtail-style ports (UART0, UART1 on IO16/IO17, I2C on IO21/IO22, and a GPIO port with IO25/IO32), a microSD slot on its own SPI bus, a speaker connector fed by the ESP32's DAC on IO26, and a battery connector with charging - a lot of expansion for a display this size.


The honest limits: no PSRAM means LVGL projects should stay modest (the 320x240 frame fits, but don't plan image-heavy UIs), and the classic ESP32 is the oldest silicon in the CrowPanel family. For a sensor dashboard, thermostat panel or ESPHome wall controller, that's usually all you need - and it's exactly the class of project we'd use it for.

  • 2.8" 320x240 ILI9341V TFT with XPT2046 resistive touch (stylus included)
  • Classic ESP32-WROOM-32 - 4 MB flash, no PSRAM, Wi-Fi + Bluetooth Classic/BLE
  • Display and microSD on separate hardware SPI buses
  • Crowtail ports on the back - UART0, UART1 (IO16/IO17), I2C (IO21/IO22), GPIO_D (IO25/IO32)
  • Speaker output from the ESP32 DAC (IO26) through an onboard amplifier, PH2.0 connector
  • PH2.0 battery connector with onboard charging circuit
  • Laser-cut acrylic case and USB-C cable included; CH340C for flashing
  • First-class ESPHome, TFT_eSPI and LVGL support - the ILI9341 + XPT2046 combo is a known quantity

FAQ

5 common questions
Does the CrowPanel 2.8 work with ESPHome?
Yes, cleanly - the ILI9341 display and XPT2046 touchscreen are both long-supported ESPHome components, and Elecrow publishes a working example config. SPI runs on IO14/IO13/IO12 with display CS on IO15, DC on IO2, touch CS on IO33 and backlight on IO27. It's one of the least fussy ESP32 displays to bring into Home Assistant.
How does it compare to a "cheap yellow display" (CYD)?
Same idea, executed more carefully. You pay a bit more than a bare CYD, but get labeled Crowtail ports instead of unpopulated headers, an SD slot on its own SPI bus, a speaker output, battery charging, an acrylic case and real documentation with per-platform tutorials. If you've been burned by CYD variant roulette, this is the calmer option.
Is the touchscreen capacitive?
No - it's resistive (XPT2046), which is the main compromise at this price and generation. It needs a firm press or the included stylus, and multi-touch gestures are out. The capacitive options in the CrowPanel family start with the larger 5.0/7.0 panels and the newer Advance series.
Can it run LVGL?
Yes, within reason. A 320x240 UI with widgets, charts and a few icons runs fine (our review includes TFT_eSPI and LVGL examples), but there's no PSRAM, so image-heavy or animation-heavy interfaces will squeeze the ESP32's 520 KB of RAM. For bigger UI ambitions, step up to an Advance-series panel with PSRAM.
How do I flash it?
Over USB-C via the CH340C at UART0 - Arduino IDE (select ESP32-WROOM-DA or ESP32 Dev Module), PlatformIO, ESPHome and MicroPython all work. If uploads fail with flash-connection errors, drop the upload speed to 115200 - we hit exactly that in our review, and it's almost always the fix (or a charge-only USB cable).

Where to buy

prices are typical street prices
Elecrow CrowPanel 2.8 (ESP32)
Elecrow CrowPanel 2.8 (ESP32)
$24.90per unit, typical
As an Amazon Associate, ESPboards earns from qualifying purchases.

Resources

Similar boards