A Python library to drive MAX7219 LED matrices, WS2812 NeoPixels, and APA102 DotStar LEDs on Raspberry Pi
—
Virtual seven-segment display device built on top of NeoPixel hardware for displaying text and numbers. This creates a classic seven-segment display appearance using RGB LEDs arranged in the traditional segment pattern.
Creates a virtual seven-segment display using NeoPixel LEDs as the underlying hardware.
class neosegment:
def __init__(
self,
width,
undefined="_",
device=None,
**kwargs
):
"""
Initialize NeoSegment seven-segment display.
Parameters:
- width: Number of 7-segment elements (digits) cascaded horizontally
- undefined: Default character for unrenderable characters (default: "_")
- device: Underlying device instance (optional, defaults to ws2812/neopixel)
- **kwargs: Additional parameters passed to parent classes
"""Controls text display and individual character coloring on the seven-segment display.
@property
def text(self):
"""
Get the currently displayed text.
Returns:
- str: Current text content on the display
"""
@text.setter
def text(self, value):
"""
Set text to display on the seven-segment display.
Parameters:
- value: Text string to display (characters not in mapping show as undefined char)
"""
@property
def color(self):
"""
Get the color array for individual characters.
Returns:
- list: RGB color values for each character position
"""
@color.setter
def color(self, value):
"""
Set color for individual characters or all characters.
Parameters:
- value: Single RGB tuple for all chars, or list of RGB tuples for individual chars
RGB values should be (red, green, blue) with 0-255 range
"""Handles character-to-segment pattern conversion for display rendering.
def segment_mapper(self, text, notfound):
"""
Map text characters to 7-segment display patterns.
Parameters:
- text: String to convert to segment patterns
- notfound: Character to use for unmappable characters
Returns:
- Generator yielding segment bit patterns as integers
"""from luma.led_matrix.device import neosegment
# Create 4-digit seven-segment display
display = neosegment(width=4)
# Display numbers
display.text = "1234"
# Display text (limited character set)
display.text = "HELP"
# Handle overflow (raises OverflowError)
try:
display.text = "TOOLONG" # More than 4 characters
except OverflowError:
display.text = "ERR"from luma.led_matrix.device import neosegment
display = neosegment(width=4)
# Set all digits to red
display.text = "8888"
display.color = (255, 0, 0)
# Set individual digit colors
display.text = "1234"
display.color = [
(255, 0, 0), # Digit 1: Red
(0, 255, 0), # Digit 2: Green
(0, 0, 255), # Digit 3: Blue
(255, 255, 0) # Digit 4: Yellow
]from luma.led_matrix.device import neosegment
# Use different character for unmappable chars
display = neosegment(width=4, undefined="?")
display.text = "A@B#" # @ and # will show as ?import time
from luma.led_matrix.device import neosegment
# Create 4-digit display for time
clock = neosegment(width=4)
while True:
# Get current time
current_time = time.strftime("%H%M")
clock.text = current_time
# Alternate colors for hours and minutes
clock.color = [
(255, 0, 0), # Hour tens: Red
(255, 0, 0), # Hour ones: Red
(0, 255, 0), # Minute tens: Green
(0, 255, 0) # Minute ones: Green
]
time.sleep(1)from luma.led_matrix.device import neosegment, neopixel
# Create custom underlying NeoPixel device
neopixel_device = neopixel(cascaded=28) # 7 segments × 4 digits
display = neosegment(width=4, device=neopixel_device)
# Count from 0 to 9999
for i in range(10000):
display.text = f"{i:04d}" # Zero-padded 4 digits
display.color = (0, 255, 255) # Cyan
time.sleep(0.1)import random
from luma.led_matrix.device import neosegment
temp_display = neosegment(width=4)
# Simulate temperature readings
for _ in range(100):
# Generate temperature (e.g., 72.5°F)
temp = random.uniform(65.0, 85.0)
# Format for display (remove decimal point)
temp_str = f"{temp:.1f}".replace(".", "")[:4]
temp_display.text = temp_str.ljust(4)
# Color based on temperature
if temp < 70:
color = (0, 0, 255) # Blue for cold
elif temp > 80:
color = (255, 0, 0) # Red for hot
else:
color = (0, 255, 0) # Green for comfortable
temp_display.color = color
time.sleep(2)The seven-segment display supports a limited character set including:
0-9: Standard digitsA, B, C, D, E, F: Hexadecimal lettersH, L, P, U: Additional displayable lettersr, n, o: Lowercase letters with reasonable representation-: Minus/dash (middle segment only)_: Underscore (bottom segment only)": Quotation marks (top segments)': Apostrophe (single top segment)°: Degree symbol (top segments)Characters not in the mapping will display as the undefined character (default: "_").
AAA
F B
F B
GGG
E C
E C
DDDThe device may raise the following exceptions:
OverflowError: Text length exceeds display width (number of digits)ValueError: Invalid color specification (not RGB tuple or incorrect format)RuntimeError: Underlying NeoPixel device errorsAssertionError: Invalid width or parameter valuesThe neosegment device integrates with character mapping functions:
from luma.led_matrix.segment_mapper import regular, dot_muncher
# The regular mapper is used by default
# dot_muncher handles decimal points by combining with previous characterInstall with Tessl CLI
npx tessl i tessl/pypi-luma--led-matrix