Lightweight, NumPy-free driver for Pimoroni Display HAT Mini
Project description
displayhatmini-lite
A lightweight, NumPy-free Python driver for the Pimoroni Display HAT Mini — works out-of-the-box on Raspberry Pi Zero 2 W and other resource-constrained devices.
Why This Exists
The official displayhatmini-python library depends on NumPy, which:
- Has no prebuilt wheels for Python 3.13 on ARM
- Falls back to source compilation that takes hours on Pi Zero
- Often fails entirely due to memory constraints
This library provides a drop-in replacement using luma.lcd — a mature, lightweight display driver that works cleanly without NumPy.
Features
- ST7789 display (320×240) via
luma.lcd - RGB LED control with PWM brightness
- Backlight control (on/off or PWM dimming)
- Four buttons with callback support
- API-compatible with the original
displayhatminilibrary - Python 3.9+ including 3.13
Hardware
| Function | GPIO (BCM) |
|---|---|
| SPI MOSI | 10 |
| SPI SCLK | 11 |
| SPI CE1 (CS) | 7 |
| DC | 9 |
| Backlight | 13 |
| LED Red | 17 |
| LED Green | 27 |
| LED Blue | 22 |
| Button A | 5 |
| Button B | 6 |
| Button X | 16 |
| Button Y | 24 |
Please check official Pimoroni Display HAT Mini pinout for more information.
Installation
Prerequisites
Enable SPI on your Raspberry Pi:
sudo raspi-config nonint do_spi 0
Or add to /boot/firmware/config.txt:
dtparam=spi=on
Optional: Flicker-Free Backlight Dimming
For smooth, flicker-free backlight dimming, enable kernel PWM by adding this line to /boot/firmware/config.txt:
dtoverlay=pwm-2chan,pin2=13,func2=4
Then reboot. The library will automatically use kernel PWM when available, falling back to software PWM otherwise.
Hardware fix for completely flicker-free operation: Add a 0.1µF ceramic capacitor between GPIO 13 and GND. This eliminates all brightness spikes and dips, especially noticeable at mid-range brightness levels.
System Dependencies
sudo apt update
sudo apt install -y \
python3-pil \
python3-spidev \
python3-rpi.gpio \
fonts-dejavu-core \
libfreetype6 \
libjpeg62-turbo \
zlib1g
Important: Install fonts and freetype before creating your virtual environment, otherwise TrueType fonts won't work in Pillow.
Install the Package
pip install displayhatmini-lite
Or for development:
git clone https://github.com/FireHawken/pimoroni-display-hat-mini-examples.git
cd pimoroni-display-hat-mini-examples
pip install -e .
Virtual Environment Notes
GPIO access requires system packages. Create your venv with:
python3 -m venv --system-site-packages .venv
source .venv/bin/activate
Quick Start
from displayhatmini_lite import DisplayHATMini
from PIL import Image, ImageDraw, ImageFont
# Create display instance
display = DisplayHATMini()
# Turn on backlight
display.set_backlight(1.0)
# Set RGB LED to purple
display.set_led(1.0, 0.0, 1.0)
# Draw something
image = Image.new("RGB", (320, 240), "black")
draw = ImageDraw.Draw(image)
draw.text((10, 100), "Hello World!", fill="white")
# Send to display
display.display(image)
# Button handling
def button_callback(pin):
if not display.read_button(pin): # Button released
return
if pin == DisplayHATMini.BUTTON_A:
print("Button A pressed!")
display.on_button_pressed(button_callback)
API Reference
DisplayHATMini
Constants
# Buttons
DisplayHATMini.BUTTON_A # GPIO 5
DisplayHATMini.BUTTON_B # GPIO 6
DisplayHATMini.BUTTON_X # GPIO 16
DisplayHATMini.BUTTON_Y # GPIO 24
# Display dimensions
DisplayHATMini.WIDTH # 320
DisplayHATMini.HEIGHT # 240
Methods
| Method | Description |
|---|---|
__init__(backlight_pwm=False, spi_speed_hz=None) |
Initialize display. Set backlight_pwm=True for dimmable backlight. Default SPI speed is 80 MHz. |
set_led(r, g, b) |
Set RGB LED color (0.0–1.0 per channel) |
set_backlight(value) |
Set backlight brightness (0.0–1.0) |
display(image) |
Send PIL Image to the display |
on_button_pressed(callback) |
Register button event callback |
read_button(pin) |
Read button state (True = pressed) |
using_hardware_pwm |
Property: True if using kernel PWM for backlight |
Examples
See the examples/ directory:
hello.py— Basic display and LED testpong.py— Classic Pong game using the buttonsbacklight_pwm.py— Backlight dimming demo
Technical Notes
Backlight PWM
When backlight_pwm=True, the library uses a 2 kHz PWM signal for smooth dimming:
- Kernel PWM (preferred): Uses
/sys/class/pwminterface — rock-solid timing, no CPU jitter - Software PWM (fallback): Uses
RPi.GPIO.PWM— may have occasional brightness fluctuations
The library automatically detects and uses kernel PWM when the overlay is enabled.
Why 2 kHz? Higher frequencies (5–10 kHz) cause the backlight to appear black at low brightness levels (below 20%). At 2 kHz, all brightness levels work correctly from 0% to 100%.
Performance
The display runs at 80 MHz SPI by default, achieving ~17 FPS for full-screen updates. If you experience display artifacts, try lowering the speed:
display = DisplayHATMini(spi_speed_hz=52_000_000) # 52 MHz
Migrating from displayhatmini
Replace:
from displayhatmini import DisplayHATMini
With:
from displayhatmini_lite import DisplayHATMini
The main API difference: this library doesn't use a numpy buffer. Instead, pass a PIL Image directly to display().
License
MIT License — see LICENSE for details.
Acknowledgments
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file displayhatmini_lite-0.1.4.tar.gz.
File metadata
- Download URL: displayhatmini_lite-0.1.4.tar.gz
- Upload date:
- Size: 10.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa2ce232e677281837c24b5824f11645a7c86c229b66b1686bdc7b63e25d186d
|
|
| MD5 |
27211f9e9580cad9272e87dc9f7ff532
|
|
| BLAKE2b-256 |
d3a40c241476a3680329a472a78ed3fccd3ff99cecb7fdb3796470a82bf6027c
|
File details
Details for the file displayhatmini_lite-0.1.4-py3-none-any.whl.
File metadata
- Download URL: displayhatmini_lite-0.1.4-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
905533adb202b5b2fdf8a33126513df7ac1c0c7aebf5a004a125452d480758ba
|
|
| MD5 |
8719d8c453f2e8011f7a7bbb70f0ce3a
|
|
| BLAKE2b-256 |
c7ef4e2c7d1604bbbda0b80637c439c7f3431b5caa3088b9a8abc4b2c9135e78
|