This guide walks through your first Arduino project on the ESP32-S3-Touch-LCD-4.3, from installing the board package to running each demo example. The Arduino framework provides a familiar entry point for developers coming from the broader maker ecosystem, with Waveshare’s helper libraries abstracting most of the hardware complexity around the RGB display interface, IO expander, and peripheral initialization.
Three libraries form the foundation of every Arduino project on this board. Install them through the Arduino Library Manager or by cloning from GitHub into your libraries folder.
The ESP32-S3-Touch-LCD-4.3 requires specific Arduino IDE settings to enable its hardware features. Getting these wrong produces symptoms that range from a blank display to a crash loop with no serial output, so it is worth double-checking each value before your first upload.
Setting
Value
Board
ESP32S3 Dev Module
Flash Size
16MB (128Mb)
PSRAM
OPI PSRAM
USB CDC On Boot
Enabled
Upload Speed
921600
Partition Scheme
16M Flash (3MB APP/9.9MB FATFS)
Upload Mode
UART0 / Hardware CDC
The PSRAM setting is the most critical. Without OPI PSRAM enabled, the display driver cannot allocate its frame buffers and the board will either show nothing or enter a boot loop. The USB CDC On Boot setting routes Serial.print() output through the native USB port so that the serial monitor works without needing the CH343P UART bridge.
Waveshare provides nine Arduino demo projects that exercise each subsystem on the board. They serve both as verification tools and as reference implementations for your own firmware. The recommended order progresses from simple peripheral tests to the full LVGL graphical interface.
01_I2C_Test — Scans the I2C bus and reports connected devices with their addresses. On a properly functioning board, you should see the CH422G (0x24), GT911 touch controller (0x14 or 0x5D), and PCF85063A RTC (0x51). This is the recommended first test because it verifies basic board-level communication without depending on any complex subsystem.
02_RS485_Test — Echo test for RS-485 communication. The sketch receives data on Serial1 (GPIO15 RX, GPIO16 TX) and echoes it back through the SP3485 transceiver. To test, connect another RS-485 device or a USB-to-RS485 adapter to the screw terminals, send a string, and verify the echo arrives intact.
03_SD_Test — Initializes the CH422G IO expander (required because the SD card chip select pin routes through the expander), mounts the SD card via SPI, and performs a sequence of file operations: create, write, read, rename, and delete. Prints the card type and total capacity on success. An SD card must be inserted for this test to pass.
04_Sensor_AD — Reads the onboard ADC sensor input and prints raw and converted values over serial. Useful for verifying analog sensor connections through the board’s ADC input header.
05_UART_Test — Basic UART echo test using the default serial port. Receives data and sends it back. This tests the CH343P USB-UART bridge path independently of the RS-485 transceiver.
06_TWAItransmit — CAN bus transmitter using the ESP32-S3’s native TWAI peripheral. Sends CAN frames with ID 0x0F6 at 50 kbit/s. The sketch uses TWAI_MODE_NO_ACK so it can transmit without a receiver on the bus, which is useful for oscilloscope or logic analyzer verification.
07_TWAIreceive — CAN bus receiver. Listens for incoming CAN frames and prints the message ID, data length code, and data bytes to the serial monitor. Pair this with the transmitter demo on a second board, or connect to any CAN 2.0 device.
08_DrawColorBar — Initializes the RGB LCD panel and draws horizontal color bars across the full 800x480 display. This verifies the display hardware, PSRAM allocation, and RGB timing without requiring LVGL or the touch controller. If you see clean color bars with no distortion or flickering, the display subsystem is healthy.
09_lvgl_Porting — Full LVGL integration with touch input. Displays a “Hello World” label and LVGL version information, then runs the LVGL widget demo showcasing buttons, sliders, charts, and other controls with touch interaction. This is the most comprehensive example and serves as the starting point for custom UI development.
With the board configuration set and a demo sketch open in the Arduino IDE, the upload process follows the standard ESP32-S3 workflow.
Connect the board to your computer using the USB-C port labeled USB (the programming port, not the USB Host/OTG port). The CH343P UART bridge should enumerate as a serial device.
Select the correct serial port under Tools > Port. On Linux this is typically /dev/ttyACM0 or /dev/ttyUSB0, on macOS /dev/cu.usbmodem*, and on Windows COM3 or similar.
Click Upload. The IDE compiles the sketch and flashes it over UART at 921600 baud. The board resets automatically after flashing.
Open the Serial Monitor at 115200 baud to see debug output.
If the port does not appear, the CH343 USB-UART driver may not be installed on your system. Waveshare provides driver downloads for Windows, macOS, and Linux on their wiki page. Linux users running kernel 6.2 or later typically have the ch341 module loaded automatically, but the CH343P uses a different driver — check with dmesg | grep ch34 after plugging in the board.
A handful of problems appear repeatedly in forum posts and GitHub issues. Most of them trace back to configuration rather than hardware faults.
No serial port detected
Install the CH343 USB-UART driver for your operating system. The CH343P chip used on this board is distinct from the older CH340/CH341 and requires its own driver on Windows and macOS. Linux kernel 6.x usually handles it, but verify with lsusb and dmesg.
Display blank after flash
Verify that PSRAM is set to OPI PSRAM in the Arduino IDE Tools menu. Without PSRAM, the frame buffer allocation fails silently and the display remains black. Also confirm the Flash Size is set to 16MB — the default 4MB setting will cause the firmware to not fit.
lv_conf.h not found
LVGL requires a configuration header file at the library root level. Copy lv_conf_template.h from the LVGL library folder to the Arduino libraries directory (one level above the lvgl folder itself), rename it to lv_conf.h, and change the #if 0 guard on line 15 to #if 1 to enable the configuration.
Compilation error with non-ASCII paths
The ESP32 Arduino toolchain does not handle non-ASCII characters in file paths. If your Arduino libraries folder, sketch folder, or any parent directory contains Chinese characters, accented letters, or other non-ASCII text, move your Arduino installation to a path using only ASCII characters.
Once the demo sketches are running, the natural progression is to build your own LVGL interface. The LVGL UI Development guide covers buffer configuration, anti-tearing modes, display rotation, and performance optimization specific to this board. For projects requiring CAN bus or RS-485 communication alongside the display, the CAN Bus and RS-485 interface pages provide register-level detail and wiring guidance that goes beyond the demo sketches.