Waveshare ESP32-S3 GEEK
WS-S3-Geek
The Waveshare S3 Geek is a development board featuring the ESP32-S3 module. It includes a small display, a button, a TF card slot, a USB-A Plug, and several expansion plugs.
The espp::WsS3Geek component provides a singleton hardware abstraction for initializing the display, button, and tf card subsystems.
API Reference
Header File
Classes
-
class WsS3Geek : public espp::BaseComponent
The WsS3Geek class provides an interface to the Waveshare ESP32-S3-GEEK development board.
The class provides access to the following features:
The class is a singleton and can be accessed using the get() method.
Example
espp::WsS3Geek &board = espp::WsS3Geek::get(); board.set_log_level(espp::Logger::Verbosity::INFO); // initialize the LCD if (!board.initialize_lcd()) { logger.error("Failed to initialize LCD!"); return; } // set the pixel buffer to be 50 lines high static constexpr size_t pixel_buffer_size = board.lcd_width() * 50; // initialize the LVGL display for the WsS3Geek if (!board.initialize_display(pixel_buffer_size)) { logger.error("Failed to initialize display!"); return; } // initialize the uSD card using SdCardConfig = espp::WsS3Geek::SdCardConfig; SdCardConfig sdcard_config{}; if (!board.initialize_sdcard(sdcard_config)) { logger.warn("Failed to initialize SD card, continuing without it."); } // create the GUI: builds the UI (label, circle layer) and starts the task // which updates LVGL. All of its public methods are thread-safe, so the // button callback and the main loop below can call them directly. static Gui gui({.log_level = espp::Logger::Verbosity::INFO}); gui.set_label_text("Drawing circles\nto the screen."); // initialize the button, which we'll use to cycle the rotation of the display logger.info("Initializing the button"); auto on_button_pressed = [&](const auto &event) { if (event.active) { logger.info("Button pressed, rotating the display"); gui.next_rotation(); } }; board.initialize_button(on_button_pressed); // set the display brightness to be 75% board.brightness(75.0f); while (true) { auto start = esp_timer_get_time(); // if the maximum number of circles are on the screen, clear them if (gui.circle_count() >= Gui::MAX_CIRCLES) { gui.clear_circles(); } else { // draw a circle of circles on the screen (just draw the next circle) int middle_x = board.rotated_display_width() / 2; int middle_y = board.rotated_display_height() / 2; static constexpr int radius = 30; float angle = gui.circle_count() * 2.0f * std::numbers::pi_v<float> / Gui::MAX_CIRCLES; int x = middle_x + radius * std::cos(angle); int y = middle_y + radius * std::sin(angle); gui.draw_circle(x, y, 5); } auto end = esp_timer_get_time(); auto elapsed = end - start; std::this_thread::sleep_for(100ms - std::chrono::microseconds(elapsed)); }
Public Types
-
using button_callback_t = espp::Interrupt::event_callback_fn
Alias for the button callback function.
-
using Pixel = lv_color16_t
Alias for the pixel type used by the display.
Public Functions
-
espp::Interrupt &interrupts()
Get a reference to the interrupts
- Returns:
A reference to the interrupts
-
bool initialize_button(const button_callback_t &callback = nullptr)
Initialize the button
- Parameters:
callback – The callback function to call when the button is pressed
- Returns:
true if the button was successfully initialized, false otherwise
-
bool button_state() const
Get the button state
- Returns:
The button state (true = button pressed, false = button released)
-
bool initialize_lcd()
Initialize the LCD (low level display driver)
- Returns:
true if the LCD was successfully initialized, false otherwise
-
bool initialize_display(size_t pixel_buffer_size)
Initialize the display (lvgl display driver)
Note
This will also allocate two full frame buffers in the SPIRAM
- Parameters:
pixel_buffer_size – The size of the pixel buffer
- Returns:
true if the display was successfully initialized, false otherwise
-
size_t rotated_display_width() const
Get the display width in pixels, according to the current orientation
- Returns:
The display width in pixels, according to the current orientation
-
size_t rotated_display_height() const
Get the display height in pixels, according to the current orientation
- Returns:
The display height in pixels, according to the current orientation
-
std::shared_ptr<Display<Pixel>> display() const
Get a shared pointer to the display
- Returns:
A shared pointer to the display
-
inline const std::shared_ptr<DisplayDriver> &display_driver() const
Get a shared pointer to the low-level display driver
- Returns:
A shared pointer to the display driver
-
void brightness(float brightness)
Set the brightness of the backlight
Note
This function will only work after initialize_lcd() has been called
- Parameters:
brightness – The brightness of the backlight as a percentage (0 - 100)
-
float brightness() const
Get the brightness of the backlight
Note
This function will only work after initialize_lcd() has been called
- Returns:
The brightness of the backlight as a percentage (0 - 100)
-
Pixel *vram0() const
Get the VRAM 0 pointer (DMA memory used by LVGL)
Note
This is the memory used by LVGL for rendering
Note
This is null unless initialize_display() has been called
- Returns:
The VRAM 0 pointer
-
Pixel *vram1() const
Get the VRAM 1 pointer (DMA memory used by LVGL)
Note
This is the memory used by LVGL for rendering
Note
This is null unless initialize_display() has been called
- Returns:
The VRAM 1 pointer
-
void write_lcd_frame(const uint16_t x, const uint16_t y, const uint16_t width, const uint16_t height, uint8_t *data)
Write a frame to the LCD
Note
This method queues the data to be written to the LCD, only blocking if there is an ongoing SPI transaction
- Parameters:
x – The x coordinate
y – The y coordinate
width – The width of the frame, in pixels
height – The height of the frame, in pixels
data – The data to write
-
void write_lcd_lines(int xs, int ys, int xe, int ye, const uint8_t *data, uint32_t user_data)
Write lines to the LCD
Note
This method queues the panel transfer asynchronously and may return before the write has completed.
- Parameters:
xs – The x start coordinate
ys – The y start coordinate
xe – The x end coordinate
ye – The y end coordinate
data – The data to write
user_data – User data to pass to the SPI transaction callback
-
bool initialize_sdcard(const SdCardConfig &config)
Initialize the uSD card
- Parameters:
config – The configuration for the uSD card
- Returns:
True if the uSD card was initialized properly.
-
inline sdmmc_card_t *sdcard() const
Get the uSD card
Note
The uSD card is only available if it was successfully initialized and the mount point is valid
- Returns:
A pointer to the uSD card
-
inline const std::string &get_name() const
Get the name of the component
Note
This is the tag of the logger
- Returns:
A const reference to the name of the component
-
inline void set_log_tag(const std::string_view &tag)
Set the tag for the logger
- Parameters:
tag – The tag to use for the logger
-
inline espp::Logger::Verbosity get_log_level() const
Get the log level for the logger
See also
See also
- Returns:
The verbosity level of the logger
-
inline void set_log_level(espp::Logger::Verbosity level)
Set the log level for the logger
See also
See also
- Parameters:
level – The verbosity level to use for the logger
-
inline void set_log_verbosity(espp::Logger::Verbosity level)
Set the log verbosity for the logger
See also
See also
See also
Note
This is a convenience method that calls set_log_level
- Parameters:
level – The verbosity level to use for the logger
-
inline espp::Logger::Verbosity get_log_verbosity() const
Get the log verbosity for the logger
See also
See also
See also
Note
This is a convenience method that calls get_log_level
- Returns:
The verbosity level of the logger
-
inline void set_log_rate_limit(std::chrono::duration<float> rate_limit)
Set the rate limit for the logger
See also
Note
Only calls to the logger that have _rate_limit suffix will be rate limited
- Parameters:
rate_limit – The rate limit to use for the logger
Public Static Functions
-
static inline WsS3Geek &get()
Access the singleton instance of the WsS3Geek class.
- Returns:
Reference to the singleton instance of the WsS3Geek class
-
static inline constexpr size_t lcd_width()
Get the width of the LCD in pixels
- Returns:
The width of the LCD in pixels
-
static inline constexpr size_t lcd_height()
Get the height of the LCD in pixels
- Returns:
The height of the LCD in pixels
-
static inline constexpr auto get_lcd_dc_gpio()
Get the GPIO pin for the LCD data/command signal
- Returns:
The GPIO pin for the LCD data/command signal
Public Static Attributes
-
static constexpr size_t SPI_MAX_TRANSFER_BYTES = SPI_LL_DMA_MAX_BIT_LEN / 8
Maximum number of bytes that can be transferred in a single SPI transaction to the Display. 32k on the ESP32-S3.
-
static constexpr char mount_point[] = "/sdcard"
Mount point for the uSD card.
-
struct SdCardConfig
Configuration for the uSD card.
-
using button_callback_t = espp::Interrupt::event_callback_fn