Hardware Reference

Freenove ESP32-S3
Dev Kit FNK0086

Dual-core 240 MHz microcontroller with touchscreen, stereo audio, heart rate sensor, camera, SD card, and WiFi+BLE — all on one board.

ESP32-S3 · dual-core 240 MHz
8 MB Flash · 8 MB PSRAM
WiFi 802.11 b/g/n · BLE 5.0
2.8" ST7789 240×320 touch LCD
Freenove ESP32-S3 FNK0086 development kit — front view showing the 2.8 inch touchscreen LCD, speaker grille, and component layout
Freenove ESP32-S3 Dev Kit FNK0086 · front view
ESP32-S3 SoC
CPU
Xtensa LX7 × 2
Dual-core, up to 240 MHz. Arduino sketches run on Core 1 by default; FreeRTOS tasks can be pinned to Core 0. Used in the sketches via xTaskCreatePinnedToCore() for I2S audio.
💾
Memory
8 MB Flash · 8 MB PSRAM
OPI PSRAM for large buffers. Sprite-based rendering in the heartbeat_viz sketch uses PSRAM for the 240×264 px waveform sprite. Flash holds the full firmware binary.
📡
Wireless
WiFi + BLE 5.0
802.11 b/g/n 2.4 GHz. Used directly in wifi_scanner via the built-in WiFi.h library — no extra hardware needed. BLE available but not used in the current sketches.
🔌
USB
USB-C · full-speed OTG
Hardware USB-CDC via the WCH CH343 USB-serial chip. The board appears as /dev/cu.wchusbserial* (macOS) or /dev/ttyUSB* (Linux) after installing the WCH driver. Used by esptool.py for flashing.
All the Hardware on the Board
📺
2.8" TFT LCD
ST7789 · 240×320 · 16-bit color

Driven via HSPI. The TFT_eSPI library handles all drawing — filled rects, rounded rects, text, lines, and sprites. The User_Setup.h file configures pin assignments for this board.

MOSI=20 SCLK=21 DC=0 CS=GND

Used in every sketch. The TFT_eSprite class creates off-screen buffers that push to the display in one DMA write — critical for the heartbeat ECG waveform (zero flicker).

👆
Capacitive Touchscreen
FT6336U · I2C · up to 2 simultaneous touches

Shares the I2C bus with the MAX30102 heart rate sensor. Returns touch point coordinates via FT6336U_TouchPointType. The library is a custom Freenove build, not in the official Arduino registry — the flash scripts download it directly from their GitHub.

SDA=2 SCL=1

Used in beep_button (tap to toggle), heartbeat_viz (tap to freeze), pixel_canvas (draw + toolbar), lie_detector (YES/NO buttons).

🔊
Stereo I2S Speakers
I2S DAC · 22050 Hz · 16-bit PCM

Uses the ESP-IDF driver/i2s_std.h API (v5.x). The legacy driver/i2s.h is deprecated in Arduino core 3.x. Audio is generated in software — sine waves for the beep, exponentially-decaying sine for the bell, and pulsed square waves for the buzzer.

BCLK=42 LRC=14 DOUT=41

Audio tasks are pinned to Core 0 via FreeRTOS to prevent the UI loop from starving the audio DMA buffer.

❤️
Heart Rate Sensor
MAX30102 · I2C addr 0x57

Red + IR LED pulse oximeter. Shares the I2C bus with the FT6336U touch controller. Uses SparkFun MAX3010x library. IR readings above 50,000 ADC counts indicate a finger is present.

SDA=2 SCL=1

AC-coupled via exponential moving average baseline removal. Beat detection via the library's checkForBeat(). BPM averaged over 8 beats. Used in heartbeat_viz and lie_detector.

💾
MicroSD Card Slot
SDMMC · 1-bit mode · SPI-compatible

Hardware SDMMC peripheral (not bit-banged SPI). Uses ESP32's built-in SD_MMC library. Operates in 1-bit mode to avoid pin conflicts. FAT32 formatted cards up to 32 GB work reliably.

CMD=38 CLK=39 D0=40

Used in pixel_canvas to save 30×30 pixel paintings as 24-bit BMP files. Files auto-numbered canvas_001.bmpcanvas_999.bmp.

📷
Camera Module
OV2640 · 2 MP · JPEG / YUV422

2-megapixel CMOS image sensor with onboard JPEG compression. Supports up to 1600×1200 (UXGA) resolution in JPEG mode, or lower resolutions at higher frame rates.

Connected via the ESP32-S3's parallel camera interface (DVP). Uses the ESP32 Camera library from Espressif.

Not yet used in the current sketches — future project: stream JPEG frames over WiFi to a browser.

Complete Pinout Used in the Sketches
ESP32-S3 FNK0086 full GPIO pinout diagram showing all pin numbers and their functions
ESP32-S3 FNK0086 full pinout · courtesy Freenove
I2C bus sharing: The FT6336U touch controller and MAX30102 heart rate sensor share a single I2C bus at SDA=2, SCL=1. Both operate fine at I2C_SPEED_FAST (400 kHz). Always call Wire.begin(2, 1) once in setup().
GPIO Peripheral Signal Used in sketches
0ST7789 LCDDC (data/command)all TFT sketches
1I2C busSCLheartbeat_viz, lie_detector, beep_button, pixel_canvas
2I2C busSDAheartbeat_viz, lie_detector, beep_button, pixel_canvas
14I2S amplifierLRC (word select)beep_button, lie_detector
20ST7789 LCDMOSI (SPI data)all TFT sketches
21ST7789 LCDSCLK (SPI clock)all TFT sketches
38SDMMCCMDpixel_canvas
39SDMMCCLKpixel_canvas
40SDMMCD0 (data)pixel_canvas
41I2S amplifierDOUT (audio data)beep_button, lie_detector
42I2S amplifierBCLK (bit clock)beep_button, lie_detector
GNDST7789 LCDCS (chip select)all TFT sketches — CS tied to GND (always selected)
Arduino FQBN and Build Flags
FQBN: esp32:esp32:esp32s3:USBMode=hwcdc,CDCOnBoot=cdc,FlashSize=8M,PSRAM=opi

Key options: USBMode=hwcdc — enables the hardware USB-CDC port (the WCH chip). CDCOnBoot=cdc — Serial output appears on USB immediately at boot. FlashSize=8M — uses the full 8 MB flash partition table. PSRAM=opi — enables OPI PSRAM (required for TFT_eSprite with large buffers).
All Sketches and Their Hardware Dependencies
Sketch → Peripheral Mapping
Sketch Peripherals used Libraries
beep_button
LCD FT6336U I2S audio
TFT_eSPI, FT6336U, driver/i2s_std.h
lie_detector
LCD FT6336U MAX30102 I2S audio
TFT_eSPI, FT6336U, MAX30105, heartRate, i2s_std
dvd_screensaver
LCD
TFT_eSPI only
heartbeat_viz
LCD FT6336U MAX30102
TFT_eSPI, TFT_eSprite, FT6336U, MAX30105, heartRate
pixel_canvas
LCD FT6336U SD card
TFT_eSPI, FT6336U, SD_MMC
wifi_scanner
LCD WiFi
TFT_eSPI, WiFi.h (built-in)