-
-
Notifications
You must be signed in to change notification settings - Fork 371
LCD Boards with Audio
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.
- 2.4" ESP32 Arduino LVGL WIFI&Bluetooth Development Board LCD TFT Module
- 2.8" ESP32-S3 Display
- 4.3" Guition ESP32-S3 480x272 Capacitive Touch Display
- 4.3" Guition ESP32-P4 480x800 MIPI-DSI Touch Display
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!
| 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.
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(); }| 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.
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(); }| 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.
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(); }| 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.