CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-luma--led-matrix

A Python library to drive MAX7219 LED matrices, WS2812 NeoPixels, and APA102 DotStar LEDs on Raspberry Pi

Pending
Overview
Eval results
Files

sevensegment.mddocs/

Seven-Segment Display

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.

Capabilities

Device Initialization

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
        """

Text Display and Color Control

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
    """

Segment Mapping

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
    """

Usage Examples

Basic Seven-Segment Display

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"

Colored Display

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
]

Custom Undefined Character

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 ?

Clock Display

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)

Counter with Custom Device

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)

Temperature Display

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)

Supported Characters

The seven-segment display supports a limited character set including:

Numbers

  • 0-9: Standard digits

Letters

  • A, B, C, D, E, F: Hexadecimal letters
  • H, L, P, U: Additional displayable letters
  • r, n, o: Lowercase letters with reasonable representation

Symbols

  • -: 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: "_").

Hardware Requirements

  • Underlying Device: NeoPixel/WS2812 LEDs arranged in seven-segment pattern
  • LED Count: 7 LEDs per digit × number of digits
  • Wiring: LEDs must be wired in seven-segment pattern:
    AAA
    F   B
    F   B
     GGG
    E   C  
    E   C
     DDD
  • Power: Same requirements as underlying NeoPixel device

Error Handling

The 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 errors
  • AssertionError: Invalid width or parameter values

Integration with Segment Mappers

The 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 character

Install with Tessl CLI

npx tessl i tessl/pypi-luma--led-matrix

docs

apa102.md

constants.md

index.md

max7219.md

neopixel.md

sevensegment.md

unicornhathd.md

tile.json