Skip to content

LCD Boards with Audio

pschatzmann edited this page Aug 25, 2026 · 16 revisions

Overview

All the boards mentioned here provide an LCD screen, can output audio to a speaker and have a SD drive for storing plenty of audio files. So this is perfect platform for implementing some audio or video players.

All the boards which are based on an ESP32 also provide WiFi support, so you can also easily implement a streaming radio with just a few lines of code.

Table of Contents

2.4" ESP32 Arduino LVGL WIFI&Bluetooth Development Board LCD TFT Module

ESP32

Also sold under the name ESP32-2432S028R / "ESP32 Cheap Yellow Display" (CYD). This is a cool ESP32 based board that comes with

  • a 2.4", 240x320 ILI9341 SPI TFT with CST816S capacitive touch (I2C)
  • a built in mono amplifier driven from the ESP32's internal DAC (analog output, not I2S)
  • a SD drive, wired over its own dedicated SPI bus
  • a multicolor (discrete R/G/B) LED

Just connect a speaker to the SPEAK pins and select the AnalogAudioStream as output device - this board has no I2S bus at all, audio comes straight off the ESP32's internal DAC pins (GPIO25/26):

#include "AudioTools.h"

AudioInfo info(44100, 1, 16);
SineWaveGenerator<int16_t> sineWave;
GeneratedSoundStream<int16_t> sound(sineWave);
AnalogAudioStream out;
StreamCopy copier(out, sound);

void setup(void) {
  Serial.begin(115200);
  auto config = out.defaultConfig(TX_MODE);
  config.copyFrom(info);
  out.begin(config);

  sineWave.begin(info, N_B4);
}

void loop() { copier.copy(); }

The biggest drawback however is that there is no PSRAM!

Pins

Func Pins
LCD SPI (ILI9341) CS=15, DC=2, SCK=14, MOSI=13, MISO=12, RST=not wired, BL=27
Touch I2C (CST816S) SDA=33, SCL=32, IRQ=36 (no RST pin wired)
SD (SPI, separate bus) SCK=18, MISO=19, MOSI=23, CS=5
RGB LED (discrete) R=4, G=16, B=17, active low
Audio (internal DAC) no I2S bus on this board - use AnalogAudioStream, GPIO25/26

Its ILI9341 display and CST816S touch controller are supported in TinyGPU via TinyGPU/Boards/LCDBoardsESP32.h as LCDBoardGuitionESP32_LVGL_2_4Display (aliases ESP32_2432S028R, ESP32CheapYellowDisplay) - this is the same pinout TinyGPU's own examples (e.g. examples/color-test) are tested against.

Example set (screen, led, sd) is at examples/examples-custom-boards/esp32-240x320-smart-display.

2.8" ESP32-S3 Display

2.8inch ESP32-S3 Display 2.8inch ESP32-S3 Display

A cheap ESP32-S3 board (sold under several brand names, e.g. Hosyond, Ozobot - see this reference) that combines audio and a display on one PCB:

  • 2.8", 240x320 ILI9341 SPI display with FT6336G capacitive touch
  • ES8311 I2S audio codec + FM8002E speaker amp + on-board MEMS microphone
  • microSD card slot, wired as 4-bit SDIO (SD_MMC), not SPI
  • WS2812 RGB LED, battery voltage ADC, boot button, spare GPIO header
  • 8MB PSRAM

Its pins are already defined as ESP32S3HosyondDisplay in arduino-audio-driver, so audio just works with I2SCodecStream:

#include "AudioTools.h"
#include "AudioTools/AudioLibs/I2SCodecStream.h"

AudioInfo info(44100, 2, 16);
SineWaveGenerator<int16_t> sineWave;
GeneratedSoundStream<int16_t> sound(sineWave);
I2SCodecStream out(ESP32S3HosyondDisplay);
StreamCopy copier(out, sound);

void setup(void) {
  Serial.begin(115200);
  auto config = out.defaultConfig(TX_MODE);
  config.copyFrom(info);
  out.begin(config);
  out.setVolume(0.5f);
  sineWave.begin(info, N_B4);
}

void loop() { copier.copy(); }

Pins

Func Pins
LCD SPI CS=10, DC=46, SCK=12, MOSI=11, MISO=13, RST=shared with EN, BL=45
Touch I2C (FT6336G) SDA=16, SCL=15, RST=18, IRQ=17
Codec I2C (ES8311) SDA=16, SCL=15 (same bus as touch)
Codec I2S MCLK=4, BCK=5, WS=7, DOUT=8, DIN=6
PA enable (FM8002E) IO1, active low
SD (4-bit SDIO) SCK=38, CMD=40, D0=39, D1=41, D2=48, D3=47
RGB LED IO42 (WS2812-compatible)

Full example set (audio-out, audio-in, sd-test, player-sdmmc, lcd-test, led-test), all confirmed on real hardware, is at examples/examples-custom-boards/esp32-s3-240x320-lcd-display - see that directory's README for board-specific gotchas (e.g. this board needs CDCOnBoot=cdc for Serial output to show up, and the ILI9341 panel needs display inversion enabled for correct colors).

Its ILI9341 display and FT6336G touch controller are also supported in TinyGPU via TinyGPU/Boards/LCDBoardsESP32.h as LCDBoardESP32S3_2_8Display (aliases FBBA0125_002, ESP32S3HosyondDisplay) - note that TinyGPU's ESP32S3HosyondDisplay alias (tinygpu namespace, display+touch only) shares its name with arduino-audio-driver's ESP32S3HosyondDisplay board struct (audio_driver namespace, codec+I2S only) but the two are unrelated types that must be combined by hand if you want both display and codec initialized via TinyGPU. TinyGPU also leaves the touch IRQ pin unused (register polling instead) since its idle polarity wasn't confirmed on real hardware.

4.3" Guition ESP32-S3 480x272 Capacitive Touch Display

Guition JC4827W543C

Sold under several names (Guition JC4827W543, Sunton ESP32-8048S043, and similar) - a 4.3" board that combines audio and a display on one PCB:

  • 4.3", 480x272, New Vision NV3041A display over QSPI (1 clock, 1 CS, 4 data lines, no HSYNC/VSYNC/DE - not the RGB-parallel interface other 480x272 boards in this family use)
  • GT911 capacitive touch, I2C
  • NS4168 I2S speaker amp only - no codec, no onboard mic
  • microSD card, wired as SD_MMC (1-bit) - also accessible over plain SPI on the same physical pins
  • 8MB PSRAM

There's no codec, so audio is using a plain I2SStream:

#include "AudioTools.h"

AudioInfo info(44100, 2, 16);
SineWaveGenerator<int16_t> sineWave;
GeneratedSoundStream<int16_t> sound(sineWave);
I2SStream out;
StreamCopy copier(out, sound);

void setup(void) {
  Serial.begin(115200);
  auto config = out.defaultConfig(TX_MODE);
  config.copyFrom(info);
  config.pin_bck = 42;
  config.pin_ws = 2;
  config.pin_data = 41;
  out.begin(config);

  sineWave.begin(info, N_B4);
  sineWave.setAmplitude(4000);  // I2SStream has no setVolume()
}

void loop() { copier.copy(); }

Pins

Func Pins
QSPI LCD (NV3041A) CS=45, SCLK=47, D0=21, D1=48, D2=40, D3=39, Backlight=1, clock 32MHz
Touch I2C (GT911) SDA=8, SCL=4, INT=3, RST=38, address 0x5D
Audio I2S (NS4168) BCK=42, WS=2, DATA=41
SD (SD_MMC, 1-bit) CLK=12, CMD=11, D0=13 (DAT3/GPIO10 wired but unused in code)
SD (SPI, alternative) CS=10, MOSI=11, CLK=12, MISO=13 - same physical pins as SD_MMC

This board needs PSRAM=opi and CDCOnBoot=cdc (e.g. FQBN esp32:esp32:esp32s3:CDCOnBoot=cdc,PSRAM=opi) - the default FQBN has PSRAM disabled, and without CDCOnBoot=cdc, Serial routes to the UART0 pins instead of the native USB port.

Its QSPI display and GT911 touch controller are supported in TinyGPU via TinyGPU/DisplayDriverQSPI.h (DisplayDriverQSPI, a base class for the family of QSPI TFT/AMOLED controllers - NV3041A, ST77916, CO5300, SH8601, AXS15231B, ...; NV3041ADriver is the concrete NV3041A driver) and TinyGPU/TouchDriver.h (TouchDriverGT911). The complete board class combining both is LCDBoardGuitionESP32S3_4_3Display (alias JC4827W543C_I) in TinyGPU/Boards/LCDBoardsESP32.h.

Full example set (lcd-test, lcd-test-gfx, audio-out, sdmmc-test, sd-test, player-sdmmc) is at examples/examples-custom-boards/esp32-s3-480x272-guition-capacitive-touch-lcd-display - see that directory's README for full pin/build details. lcd-test-gfx uses Arduino_GFX and TAMC_GT911 instead of TinyGPU.

4.3" Guition ESP32-P4 480x800 MIPI-DSI Touch Display

Guition JC4880P443C_I_W

Guition JC4880P443C_I_W - Status: TESTED, confirmed working on real hardware. A 4.3" board that combines audio and a display on one PCB:

  • 4.3", 480x800, ST7701S display over MIPI-DSI (2-lane)
  • GT911 capacitive touch, I2C (shared bus with the codec)
  • ES8311 I2S audio codec + NS4150 speaker amp
  • ESP32-P4 (dual-core RISC-V) + ESP32-C6 Wi-Fi/BT co-processor over SDIO (ESP-Hosted)
  • microSD card via SDMMC (4-bit), separate bus from the C6's Wi-Fi SDIO
  • 32MB QSPI PSRAM, 16MB QIO flash

There's no specific board entry for this one, so audio uses the generic ES8311 board (GenericES8311) from arduino-audio-driver, with I2S pins and the codec's Wire bus set up manually:

#include "AudioTools.h"
#include "AudioTools/AudioLibs/I2SCodecStream.h"

AudioInfo info(44100, 2, 16);
SineWaveGenerator<int16_t> sineWave;
GeneratedSoundStream<int16_t> sound(sineWave);
I2SCodecStream out(GenericES8311);
StreamCopy copier(out, sound);

void setup(void) {
  Serial.begin(115200);
  Wire.begin(7, 8);  // SDA, SCL - shared with touch

  auto config = out.defaultConfig(TX_MODE);
  config.copyFrom(info);
  config.pin_bck = 12;
  config.pin_ws = 10;
  config.pin_data = 9;
  config.pin_mck = 13;
  out.begin(config);
  out.setVolume(0.5f);

  pinMode(11, OUTPUT);   // NS4150 amp enable
  digitalWrite(11, HIGH);

  sineWave.begin(info, N_B4);
}

void loop() { copier.copy(); }

Pins

Func Pins
Display (ST7701S MIPI-DSI) RST=5, Backlight=23 (LEDC PWM); DSI is 2 PHY lanes @ 500Mbps, not GPIOs
Touch I2C (GT911) SDA=7, SCL=8 (shared with codec I2C), RST=3, address 0x5D
Audio I2S (ES8311) MCLK=13, BCK=12, WS=10, DOUT=9, DIN=48
Codec I2C (ES8311) SDA=7, SCL=8 (same bus as touch)
Amp enable (NS4150) GPIO11, active-high
SD (SDMMC, 4-bit) CLK=43, CMD=44, D0=39, D1=40, D2=41, D3=42
Wi-Fi/BT (ESP32-C6 over ESP-Hosted SDIO) CLK=18, CMD=19, D0=14, D1=15, D2=16, D3=17, C6 reset=54

Its ST7701S MIPI-DSI panel is supported in TinyGPU via a new DisplayDriverDSI/ST7701Driver (DBI command-channel + DPI video-channel), and touch uses TinyGPU's existing, MCU-agnostic TouchDriverGT911. The complete board class, combining display, touch, Wi-Fi SDIO and SD_MMC pin setup in one begin(), is LCDBoardGuitionESP32H4_4_3Display (alias JC4880P443C_I_W) in TinyGPU/Boards/LCDBoardsESP32.h - the "H4" in the class name is historical/for API compatibility, the actual chip is the ESP32-P4. It also exposes a battery() helper (ADC2 channel 4, calibrated, returns 0-100%) and a setAmplifierActive(bool) call to enable the NS4150 amp explicitly. Note: the TF card socket's power LDO (TF_VCC, a separate power-LDO channel recorded from the board's BSP, unrelated to the battery ADC channel) is not yet switched on by begin() - if SD_MMC.begin() fails on your unit, try driving that LDO on first.

Full example set (lcd-test, audio-out, audio-in, sdmmc-test, player-sdmmc, wifi-test, web-radio) is at examples/examples-custom-boards/esp32-p4-480x800-guition-mipi-dsi-touch-display - see that directory's README for full pin/build details.

Clone this wiki locally