Very basic primer to get your 7" Sunton ESP32S3 8048S070 display up and running on Circuit Python with displayio.
Installation
Since this board only comes with a .bin from CircuitPython.org the easiest way to install Circuit Python is to have a full Python/PIP/ESPTool environment on your PC. Then you can run esptool.py. I have a section in my personal repository on the steps to flash an ESP device on a Windows PC once you have Python and PIP installed. The other method is to use the web installer on CircuitPython.org with a Google Chrome browser.
WCH (CH340) USB Serial
Unlike most Circuit Python boards the 8048S070 does not have native usb... there is no USB drive. It's more like a classic ESP32 where you have to communicate with it via serial only. If you miss the good old days of FTDI cables and serial (no one misses those days) then you'll feel right at home.
Device Manager CH340 Driver
After installing Circuit Python and getting the board recognized in device manager it should automatically install the CH340 driver. It's a good idea to double check the serial communication speed.
Serial Communication Speed
By default the Bits per second is 9600. The ESP32-S3 can communicate much faster than that. 128000 works well but if you start seeing communication errors you can drop the speed down for better reliability. 9600 is typically only used for hardware debugging with slower timings.
Thonny IDE
I found Thonny works very well as a workflow replacement for Mu. Mu will not work here or at least I couldn't get it to work. You'll need something like Thonny.
ESP32-S3 N16R8 Module
16MB (NOR Flash) 8MB (RAM) means this particular module has plenty of storage and ram for big displayio projects. Even though the Sunton 8048S070 has an SD Card reader built in, 16MB is plenty for storing pictures, icons, fonts, spritesheets, etc... on the module itself. The most important aspect of this module for a dotclock display is the 8MB of RAM. When it comes to buffers the more RAM the better. The speed of the RAM is also a factor but without getting into a technical whitepaper let's just say for such a large dimension display the more RAM the better.
8048S070 PCB
There are a wide variety of plugs for different peripherals including an SD Card slot and Stemma QT port which is directly compatible with Adafruit Stemma QT cables and modules. There is a lot you can do with this board but I'm only covering the basics here. This note is primarily aimed at just getting the board up and running with basic features and displayio.
Dot Clock Display
This board has a dot clock display meaning it has to be constantly refreshed (preferably about 60 times a second). The ESP32-S3 module is well capable of driving this display upwards of 120FPS in a very bare bones state. The more you throw at it the slower it will refresh.
The way the display is setup is more like setting up an RGB Matrix Panel than a TFT because all data is constantly streaming through a buffer. The developers of Circuit Python have created a driver method specifically for these types of displays called the dotclockframebuffer.
fb = dotclockframebuffer.DotClockFramebuffer(**board.TFT_PINS, **board.TFT_TIMINGS) display = FramebufferDisplay(fb, auto_refresh=True)
Once displayio associates it as a dotclock display you can use it the same as you would any TFT including the use of text labels, groups, layers, vectorio objects, images, and of course sensor data from peripherals.
Very Basic Script
There are no bells and whistles here. Just a blank slate to get you up and running. I have not included the wallpaper image or fonts for download. This is just a basic example.
# SPDX-FileCopyrightText: 2025 DJDevon3
# SPDX-License-Identifier: MIT
# Coded for Circuit Python 9.2.3
# Sunton ESP32S3 8048S070 Example
import board
import time
import terminalio
import displayio
import dotclockframebuffer
from framebufferio import FramebufferDisplay
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
displayio.release_displays()
fb = dotclockframebuffer.DotClockFramebuffer(**board.TFT_PINS, **board.TFT_TIMINGS)
display = FramebufferDisplay(fb, auto_refresh=True)
# print(f"TFT Timings: {board.TFT_TIMINGS}")
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
# Quick Colors for Labels
TEXT_BLACK = 0x000000
TEXT_BLUE = 0x0000FF
TEXT_CYAN = 0x00FFFF
TEXT_GRAY = 0x8B8B8B
TEXT_GREEN = 0x00FF00
TEXT_LIGHTBLUE = 0x90C7FF
TEXT_MAGENTA = 0xFF00FF
TEXT_ORANGE = 0xFFA500
TEXT_PINK = 0xFF007F
TEXT_PURPLE = 0x800080
TEXT_RED = 0xFF0000
TEXT_WHITE = 0xFFFFFF
TEXT_YELLOW = 0xFFFF00
Arial_16 = bitmap_font.load_font("/fonts/Arial-16.bdf")
GoodTimes_60 = bitmap_font.load_font("/fonts/GoodTimesRg-Regular-60.bdf")
# Load Bitmap to tile grid first (Background layer)
DiskBMP = displayio.OnDiskBitmap("/images/Astral_Fruit_800x480-24bit.bmp")
wallpaper = displayio.TileGrid(
DiskBMP,
pixel_shader=DiskBMP.pixel_shader,
tile_width=DISPLAY_WIDTH,
tile_height=DISPLAY_HEIGHT,
)
header_label = label.Label(Arial_16)
header_label.anchor_point = (0.5, 1.0)
header_label.anchored_position = (DISPLAY_WIDTH/2, 30)
header_label.scale = (1)
header_label.color = TEXT_WHITE
footer_label = label.Label(terminalio.FONT)
footer_label.anchor_point = (1.0, 1.0)
footer_label.anchored_position = (DISPLAY_WIDTH, DISPLAY_HEIGHT-20)
footer_label.scale = (1)
footer_label.color = TEXT_WHITE
temp_label = label.Label(GoodTimes_60)
temp_label.anchor_point = (0.5, 1.0)
temp_label.anchored_position = (DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2)
temp_label.scale = (1)
temp_label.color = TEXT_ORANGE
main_group = displayio.Group()
wallpaper_group = displayio.Group()
text_group = displayio.Group()
wallpaper_group.append(wallpaper)
text_group.append(header_label)
text_group.append(footer_label)
text_group.append(temp_label)
main_group.append(wallpaper_group)
main_group.append(text_group)
display.root_group = main_group
header_label.text = "Sunton ESP32-S3 8048S070 Dotclock Display"
temp_label.text = "CIRCUITPYTHON"
footer_label.text = "7\" 800x480 TFT Display"
print(f"Board Uptime in Seconds: {time.monotonic()}") # example for board uptime
This page (7" Sunton ESP32S3 8048S070 Circuit Python) was last updated on January 27, 2025.