eInk API for Raspberry Pi Pico
This firmware drives a Waveshare 4.2" e-Paper display from a Raspberry Pi Pico / Pico W. It launches the e-paper driver on core 1 while core 0 acts as a simple serial command processor, giving you an interactive API for drawing primitives, text, and editor-mode logs over USB.
Features
- Lightweight C implementation built on the official Pico SDK and Waveshare e-Paper drivers.
- Core 1 renders directly to a framebuffer and updates the display with both full and partial refreshes.
- Serial command queue exposes operations such as clearing, drawing geometry, writing text, and entering an editor mode.
- Automatic display shutdown after 30 seconds of inactivity to preserve the panel.
Requirements
- Raspberry Pi Pico or Pico W (project sets
PICO_BOARDtopico_w). - Waveshare 4.2" e-Paper V2 display, wired to SPI + compatible GPIOs defined in
DEV_Config.h. - Pico SDK (2.2.0) installed and available via
PICO_SDK_PATH. cmake,ninja, andpicotool(or the Pico toolchain) for flashing.
Building
# configure the build
cmake -S . -B build
# build the UF2 image
cmake --build build
After building, flash the firmware to your Pico (e.g. by copying build/eink_api.uf2 to the Pico's mass storage device or using picotool load build/eink_api.uf2).
Build/Flash Helper Script
Run scripts/flash_and_connect.sh [/dev/ttyACM0] to configure CMake, compile the firmware, optionally flash it with picotool, and open a serial session (defaults to screen at 115200 baud). Set PICO_SERIAL to override the port, PICO_BAUD for a different baud rate, and SERIAL_CLIENT if you prefer picocom or minicom. If picotool is missing, the script will remind you to copy the UF2 to the board manually.
Usage
- Open a serial terminal (115200 baud) over the Pico's USB CDC interface.
- Type commands followed by
Enter. The firmware echoes the command buffer and executes the operation on core 1. - Most commands require the display to be initialized (
init). The device automatically turns off the screen after ~30 seconds of inactivity, so send another command to revive it. - If
editormode is enabled, keystrokes are batched and rendered directly on the display until inactivity ends the mode.
Supported Commands
| Command | Description |
|---|---|
init |
Initializes the e-Paper panel and allocates the framebuffer. |
clear |
Clears the current framebuffer to white (requires display on). |
display |
Pushes the framebuffer to the panel (requires display on). |
draw_test |
Draws a hard-coded Waveshare demo pattern. |
draw_text x y text |
Writes text at (x,y) using the current font. |
draw_text_white x y text |
Writes inverted white text at (x,y) with a black background. |
draw_point x y |
Draws a black point at the given coordinates. |
draw_line x1 y1 x2 y2 |
Draws a black line between two points. |
draw_sine x y length amplitude frequency |
Draws a sine-wave curve of length pixels starting at (x,y), oscillating by amplitude, with the given number of cycles. |
draw_rectangle x1 y1 x2 y2 |
Draws an empty rectangle. |
draw_rectangle_fill x1 y1 x2 y2 |
Draws a filled rectangle. |
draw_circle x y r |
Draws an empty circle with radius r. |
draw_circle_fill x y r |
Draws a filled circle with radius r. |
draw_num x y num |
Draws num using the default numeric font. |
set_pixel x y color |
Sets a single pixel to color (0=white, 1=black). |
close |
Sends the panel to deep sleep and frees the framebuffer. |
| `editor [0 | 1]` |
Notes
- The project imports the Waveshare e-Paper libraries from
Pico_ePaper_Code/c/lib/*for configuration, fonts, GUI primitives, and the panel driver. - USB serial I/O is enabled (
pico_enable_stdio_usb), while UART stdio is disabled to avoid conflicts (pico_enable_stdio_uartset to0). - The firmware allocates the framebuffer via
mallocand frees it when the display goes to sleep; avoid running out of heap on severely constrained Pico builds. - Editor-mode inactivity is 10 seconds before automatically exiting back to command mode.