v.0.10.0 redesign prj structure, multi dev containers

This commit is contained in:
tiijay
2025-11-20 11:50:19 +00:00
parent 53b1b96fb3
commit 76a8203458
52 changed files with 63 additions and 83 deletions

View File

@@ -0,0 +1,4 @@
from .neopixel_64x64 import NeoPixel_64x64
__all__ = ["NeoPixel_64x64"]

View File

@@ -0,0 +1,5 @@
from .emoji_5x7 import emoji_5x7
from .emoji_8x8 import emoji_8x8
from .emoji_16x16 import emoji_16x16
__all__=["emoji_5x7","emoji_8x8","emoji_16x16"]

View File

@@ -0,0 +1,30 @@
emoji_16x16 = {
'☀️': [0x8001, 0x4002, 0x2004, 0x1188, 0xDB0, 0x7E0, 0x3C0, 0xFFFF, 0xFFFF, 0x3C0, 0x7E0, 0xDB0, 0x1188, 0x2004, 0x4002, 0x8001],
'☁️': [0x00, 0x00, 0xF0, 0x1F8, 0x3FC, 0x7FE, 0x7FE, 0xFFF, 0xFFF, 0xFFF, 0x7FE, 0x7FE, 0x3FC, 0x1F8, 0xF0, 0x00],
'': [0x3F0, 0xFFC, 0x1FFE, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x1FFE, 0xFFC, 0x3F0, 0x00],
'✈️': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'❤️': [0x00, 0x00, 0x618, 0xF3C, 0x1FFE, 0x3FFF, 0x3FFF, 0x7FFF, 0x7FFE, 0x3FFC, 0x3FF8, 0x1FF0, 0xFE0, 0x7C0, 0x380, 0x00],
'': [0x60, 0x60, 0xF0, 0xF0, 0x1F8, 0x3FC, 0x7FE, 0xFFF, 0xFFF, 0x7FE, 0x3FC, 0x1F8, 0xF0, 0xF0, 0x60, 0x60],
'🌙': [0x00, 0x3F0, 0x7F8, 0xFFC, 0x1FFE, 0x1FFF, 0x1FFF, 0x1FFE, 0x1FFC, 0x1FF8, 0x1FF0, 0x1FE0, 0x1FC0, 0x1F80, 0x1F00, 0x00],
'🍎': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'🍕': [0x3F0, 0xFFC, 0x1FFE, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x1FFE, 0xFFC, 0x3F0, 0x00],
'🎃': [0x3F0, 0xFFC, 0x1FFE, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x1FFE, 0xFFC, 0x3F0, 0x00],
'🎄': [0x60, 0xF0, 0xF0, 0x1F8, 0x1F8, 0x3FC, 0x3FC, 0x7FE, 0x7FE, 0xFFF, 0xFFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0],
'🏀': [0x3F0, 0xFFC, 0x1FFE, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x1FFE, 0xFFC, 0x3F0, 0x00],
'🐦': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'🐱': [0x3F0, 0xFFC, 0x1FFE, 0x3FFF, 0x3FFF, 0x37FB, 0x37FB, 0x37FB, 0x37FB, 0x37FB, 0x3FFF, 0x3FFF, 0x1FFE, 0xFFC, 0x3F0, 0x00],
'🐶': [0x3F0, 0xFFC, 0x1FFE, 0x3FFF, 0x3FFF, 0x37FB, 0x37FB, 0x37FB, 0x37FB, 0x37FB, 0x3FFF, 0x3FFF, 0x1FFE, 0xFFC, 0x3F0, 0x00],
'💙': [0x00, 0x00, 0x618, 0xF3C, 0x1FFE, 0x3FFF, 0x3FFF, 0x7FFF, 0x7FFE, 0x3FFC, 0x3FF8, 0x1FF0, 0xFE0, 0x7C0, 0x380, 0x00],
'💻': [0x00, 0x3FFF, 0x2001, 0x2001, 0x2001, 0x2001, 0x2001, 0x2001, 0x2001, 0x2001, 0x2001, 0x2001, 0x3FFF, 0x1FFE, 0xFFC, 0x00],
'📱': [0xFFFF, 0x8001, 0x8001, 0x9FF9, 0x9009, 0x9009, 0x9009, 0x9009, 0x9009, 0x9009, 0x9009, 0x9009, 0x9FF9, 0x8001, 0x8001, 0xFFFF],
'🔑': [0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
'🔒': [0xFC, 0x1FE, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF],
'😀': [0x7E0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x7E0, 0x00],
'😂': [0x7E0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7C3E, 0xF99F, 0xF3CF, 0xF3CF, 0xF3CF, 0xF3CF, 0xF99F, 0x7C3E, 0x7FFE, 0x3FFC, 0x1FF8, 0x7E0],
'😊': [0x7E0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7C3E, 0xF81F, 0xF00F, 0xF00F, 0xF00F, 0xF00F, 0xF81F, 0x7C3E, 0x7FFE, 0x3FFC, 0x1FF8, 0x7E0],
'😍': [0x7E0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7C3E, 0xF81F, 0xF3CF, 0xE7E7, 0xE7E7, 0xF3CF, 0xF81F, 0x7C3E, 0x7FFE, 0x3FFC, 0x1FF8, 0x7E0],
'😎': [0x7E0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xF00F, 0xF00F, 0xF00F, 0xF00F, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x7E0],
'😠': [0x7E0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7C3E, 0xF81F, 0xF3CF, 0xE667, 0xE667, 0xF3CF, 0xF81F, 0x7C3E, 0x7FFE, 0x3FFC, 0x1FF8, 0x7E0],
'😢': [0x7E0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7C3E, 0xF81F, 0xF00F, 0xF3CF, 0xF3CF, 0xF00F, 0xF99F, 0x7C3E, 0x7FFE, 0x3FFC, 0x1FF8, 0x7E0],
'🚗': [0x00, 0x00, 0xFC, 0x1FE, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x1FE, 0xFC, 0x00, 0x00],
}

View File

@@ -0,0 +1,81 @@
# Emoji symbols for LED matrix (5x7)
emoji_5x7 = {
# Basic Smileys
'😀': [0x0A, 0x00, 0x11, 0x11, 0x00, 0x11, 0x0E], # Grinning face
'😊': [0x0A, 0x00, 0x11, 0x11, 0x00, 0x0A, 0x04], # Smiling face
'😂': [0x0A, 0x00, 0x1F, 0x11, 0x00, 0x0A, 0x04], # Laughing with tears
'😍': [0x0A, 0x00, 0x15, 0x0E, 0x04, 0x0A, 0x11], # Heart eyes
'😎': [0x0A, 0x00, 0x11, 0x11, 0x0E, 0x1F, 0x00], # Cool sunglasses
'😢': [0x0A, 0x00, 0x11, 0x11, 0x00, 0x0A, 0x04], # Crying face
'😠': [0x0A, 0x00, 0x11, 0x11, 0x00, 0x15, 0x0A], # Angry face
'😴': [0x0A, 0x00, 0x11, 0x11, 0x00, 0x0E, 0x1F], # Sleeping face
# Hearts
'❤️': [0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00], # Red heart
'💙': [0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00], # Blue heart
'💚': [0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00], # Green heart
'💛': [0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00], # Yellow heart
'💜': [0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00], # Purple heart
# Hands & Gestures
'👍': [0x04, 0x04, 0x04, 0x04, 0x15, 0x0E, 0x04], # Thumbs up
'👎': [0x04, 0x0E, 0x15, 0x04, 0x04, 0x04, 0x04], # Thumbs down
'👏': [0x00, 0x15, 0x15, 0x15, 0x15, 0x0A, 0x0A], # Clapping hands
'🙌': [0x11, 0x0A, 0x04, 0x04, 0x04, 0x0A, 0x11], # Raising hands
# Common Symbols
'': [0x04, 0x04, 0x1F, 0x0E, 0x1F, 0x04, 0x04], # Star
'🌟': [0x04, 0x15, 0x0E, 0x1F, 0x0E, 0x15, 0x04], # Glowing star
'🎉': [0x04, 0x1F, 0x04, 0x1F, 0x04, 0x0A, 0x11], # Party popper
'🎂': [0x0E, 0x11, 0x1F, 0x1F, 0x1F, 0x0A, 0x1F], # Birthday cake
# Weather & Nature
'☀️': [0x11, 0x0A, 0x1F, 0x0E, 0x1F, 0x0A, 0x11], # Sun
'🌙': [0x0C, 0x12, 0x12, 0x0C, 0x00, 0x00, 0x00], # Crescent moon
'☁️': [0x00, 0x0E, 0x1F, 0x1F, 0x1F, 0x00, 0x00], # Cloud
'🌧️': [0x0E, 0x1F, 0x1F, 0x0A, 0x04, 0x0A, 0x04], # Cloud with rain
'': [0x04, 0x04, 0x06, 0x1C, 0x04, 0x04, 0x04], # Lightning
'❄️': [0x0A, 0x1F, 0x0A, 0x04, 0x0A, 0x1F, 0x0A], # Snowflake
# Objects
'📱': [0x1F, 0x11, 0x15, 0x15, 0x15, 0x11, 0x1F], # Mobile phone
'💻': [0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F], # Laptop
'': [0x0E, 0x11, 0x15, 0x15, 0x15, 0x11, 0x0E], # Watch
'🔑': [0x04, 0x0E, 0x04, 0x0E, 0x15, 0x15, 0x0E], # Key
# Arrows
'⬆️': [0x04, 0x0E, 0x15, 0x04, 0x04, 0x04, 0x04], # Up arrow
'⬇️': [0x04, 0x04, 0x04, 0x04, 0x15, 0x0E, 0x04], # Down arrow
'⬅️': [0x04, 0x08, 0x1F, 0x08, 0x04, 0x00, 0x00], # Left arrow
'➡️': [0x04, 0x02, 0x1F, 0x02, 0x04, 0x00, 0x00], # Right arrow
# Status Indicators
'': [0x00, 0x01, 0x02, 0x14, 0x08, 0x00, 0x00], # Check mark button
'': [0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00, 0x00], # Cross mark
'⚠️': [0x04, 0x04, 0x04, 0x15, 0x0E, 0x04, 0x04], # Warning
'🚨': [0x04, 0x0E, 0x1F, 0x04, 0x1F, 0x04, 0x04], # Alarm
# Food & Drink
'🍕': [0x0E, 0x1F, 0x1F, 0x15, 0x1F, 0x1F, 0x0E], # Pizza
'🍎': [0x04, 0x0A, 0x11, 0x1F, 0x1F, 0x0E, 0x04], # Apple
'': [0x0E, 0x11, 0x1F, 0x11, 0x0E, 0x04, 0x04], # Coffee
# Animals
'🐱': [0x0E, 0x0A, 0x0E, 0x1F, 0x15, 0x11, 0x0A], # Cat face
'🐶': [0x0E, 0x0A, 0x0E, 0x1F, 0x15, 0x15, 0x0A], # Dog face
'🐭': [0x0C, 0x12, 0x0C, 0x1E, 0x0B, 0x0B, 0x06], # Mouse face
# Holidays
'🎄': [0x04, 0x04, 0x0E, 0x0E, 0x1F, 0x04, 0x04], # Christmas tree
'🎃': [0x0E, 0x15, 0x1F, 0x1B, 0x1F, 0x15, 0x0E], # Jack-o-lantern
'🎅': [0x04, 0x0E, 0x04, 0x0E, 0x1F, 0x0A, 0x04], # Santa Claus
# Technology
'🔒': [0x0E, 0x11, 0x11, 0x1F, 0x1B, 0x1B, 0x1F], # Locked
'🔓': [0x0E, 0x10, 0x10, 0x1F, 0x1B, 0x1B, 0x1F], # Unlocked
'🔋': [0x1F, 0x11, 0x15, 0x15, 0x15, 0x11, 0x1F], # Battery
'🔍': [0x00, 0x0E, 0x01, 0x0D, 0x15, 0x15, 0x0D], # Magnifying glass
# Music
'🎵': [0x02, 0x03, 0x02, 0x0E, 0x1E, 0x0C, 0x00], # Music note
'🎶': [0x0A, 0x0A, 0x0A, 0x0A, 0x0E, 0x0E, 0x04], # Multiple music notes
# Sports
'': [0x0E, 0x11, 0x15, 0x15, 0x15, 0x11, 0x0E], # Soccer ball
'🏀': [0x0E, 0x11, 0x17, 0x15, 0x17, 0x11, 0x0E], # Basketball
# Time
'🕐': [0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E], # One o'clock
'🕒': [0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E], # Three o'clock
'🕔': [0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E], # Five o'clock
# Miscellaneous
'💡': [0x04, 0x0A, 0x0A, 0x0A, 0x1F, 0x0E, 0x04], # Light bulb
'💰': [0x00, 0x1F, 0x15, 0x1F, 0x15, 0x1F, 0x00], # Money bag
'🎁': [0x1F, 0x11, 0x1F, 0x1F, 0x0A, 0x0A, 0x0A], # Wrapped gift
}

View File

@@ -0,0 +1,52 @@
# Emoji symbols for LED matrix (8x8)
emoji_8x8 = {
# Basic Smileys
'😀': [0x3C, 0x42, 0xA5, 0x81, 0xA5, 0x99, 0x42, 0x3C], # Grinning face
'😊': [0x3C, 0x42, 0xA5, 0x81, 0x81, 0x99, 0x42, 0x3C], # Smiling face
'😂': [0x3C, 0x42, 0xA5, 0x89, 0x89, 0x95, 0x42, 0x3C], # Laughing with tears
'😍': [0x3C, 0x42, 0xA5, 0x81, 0x99, 0x66, 0x42, 0x3C], # Heart eyes
'😎': [0x3C, 0x42, 0xA5, 0x81, 0x81, 0xFF, 0x7E, 0x3C], # Cool sunglasses
'😢': [0x3C, 0x42, 0xA5, 0x81, 0x81, 0x99, 0x52, 0x3C], # Crying face
'😠': [0x3C, 0x42, 0xA5, 0x81, 0x81, 0x99, 0x5A, 0x3C], # Angry face
'😴': [0x3C, 0x42, 0xA5, 0x81, 0x81, 0x81, 0x7E, 0x3C], # Sleeping face
# Hearts
'💙': [0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x18], # Blue heart
'💚': [0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x18], # Green heart
'❤️': [0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x18], # Red heart !!! NOT WORKING !!!
'💛': [0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x18], # Yellow heart
# Hands & Gestures
'👍': [0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18], # Thumbs up
'👎': [0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18], # Thumbs down
'👏': [0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x3C, 0x18], # Clapping hands
# Common Symbols
'': [0x18, 0x18, 0x3C, 0xFF, 0xFF, 0x3C, 0x18, 0x18], # Star
'🌟': [0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x3C, 0x18], # Glowing star
'🎉': [0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18], # Party popper
# Weather & Nature
'☀️': [0x42, 0x81, 0x5A, 0x3C, 0x3C, 0x5A, 0x81, 0x42], # Sun with rays
'🌙': [0x3C, 0x42, 0x84, 0x84, 0x84, 0x84, 0x42, 0x3C], # Crescent moon
'☁️': [0x00, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x3C, 0x00], # Cloud
'🌧️': [0x3C, 0x7E, 0xFF, 0xFF, 0x24, 0x48, 0x24, 0x48], # Cloud with rain
'': [0x08, 0x0C, 0x0E, 0xFF, 0x0E, 0x0C, 0x08, 0x00], # Lightning
# Objects
'📱': [0xFF, 0x81, 0xBD, 0xA5, 0xA5, 0xBD, 0x81, 0xFF], # Mobile phone
'💻': [0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF], # Laptop
# Arrows
'⬆️': [0x18, 0x3C, 0x7E, 0xFF, 0x18, 0x18, 0x18, 0x18], # Up arrow
'⬇️': [0x18, 0x18, 0x18, 0x18, 0xFF, 0x7E, 0x3C, 0x18], # Down arrow
# Status Indicators
'': [0x00, 0x01, 0x03, 0x16, 0x6C, 0xD8, 0x70, 0x20], # Check mark
'': [0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81], # Cross mark
# Food & Drink
'🍕': [0x3C, 0x7E, 0xFF, 0xDB, 0xFF, 0x7E, 0x3C, 0x00], # Pizza
'🍎': [0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x3C, 0x18], # Apple
# Animals
'🐱': [0x3C, 0x42, 0x99, 0xA5, 0xA5, 0x99, 0x5A, 0x3C], # Cat face
'🐶': [0x3C, 0x42, 0x99, 0xA5, 0xA5, 0x99, 0x42, 0x3C], # Dog face
# Music
'🎵': [0x00, 0x03, 0x0F, 0x3F, 0x3F, 0x0F, 0x03, 0x00], # Music note
# Sports
'': [0x3C, 0x42, 0x81, 0x81, 0x81, 0x81, 0x42, 0x3C], # Soccer ball
# Miscellaneous
'💡': [0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x3C, 0x18], # Light bulb
}

View File

@@ -0,0 +1,9 @@
from .font_3x5 import font_3x5
from .font_5x7 import font_5x7
from .font_8x8 import font_8x8
from .font_16x16 import font_16x16
fonts_installed = [font_3x5, font_5x7, font_8x8, font_16x16]
__all__ = ['font_3x5', 'font_5x7', 'font_8x8', 'font_16x16', 'fonts_installed']

View File

@@ -0,0 +1,107 @@
font_16x16 = {
' ': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'!': [0x06, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x06, 0x00, 0x0F, 0x0F, 0x00, 0x00],
'"': [0x363, 0x363, 0x363, 0x363, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'#': [0x318, 0x318, 0x318, 0xFFF, 0xFFF, 0x318, 0x318, 0x318, 0x318, 0xFFF, 0xFFF, 0x318, 0x318, 0x318, 0x00, 0x00],
'$': [0x78, 0xFE, 0x1CF, 0x1C7, 0x1C0, 0xF8, 0x7C, 0x0F, 0x07, 0x1C7, 0x1CF, 0xFE, 0x78, 0x10, 0x00, 0x00],
'%': [0xE0E, 0x1B0E, 0x1B1C, 0xE38, 0x70, 0xE0, 0x1C0, 0x380, 0x70E, 0xE1B, 0x1C1B, 0x380E, 0x00, 0x00, 0x00, 0x00],
'&': [0x7C0, 0xEE0, 0x1C70, 0x1C70, 0xEE0, 0x7C0, 0xFC7, 0x1CE7, 0x387E, 0x383C, 0x387E, 0x1CFF, 0xFE7, 0x7C0, 0x00, 0x00],
"'": [0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'(': [0x07, 0x0E, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, 0x1C, 0x0E, 0x07, 0x00, 0x00],
')': [0x38, 0x1C, 0x0E, 0x0E, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0E, 0x0E, 0x1C, 0x38, 0x00, 0x00],
'*': [0x30, 0x1B3, 0xFC, 0x78, 0xFC, 0x1B3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'+': [0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x3FF, 0x3FF, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00],
',': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x03, 0x06, 0x00, 0x00],
'-': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3FF, 0x3FF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'.': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00],
'/': [0x03, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x1C0, 0x380, 0x700, 0xE00, 0xC00, 0x00, 0x00, 0x00, 0x00],
'0': [0x1F8, 0x3FC, 0x70E, 0x606, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0x606, 0x70E, 0x3FC, 0x1F8, 0x00, 0x00],
'1': [0x0C, 0x1C, 0x3C, 0x7C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x7F, 0x7F, 0x00, 0x00],
'2': [0xFC, 0x1FE, 0x387, 0x303, 0x03, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x1C0, 0x3FF, 0x3FF, 0x00, 0x00],
'3': [0xFC, 0x1FE, 0x387, 0x303, 0x03, 0x07, 0x7E, 0x7E, 0x07, 0x03, 0x303, 0x387, 0x1FE, 0xFC, 0x00, 0x00],
'4': [0x0E, 0x1E, 0x3E, 0x6E, 0xCE, 0x18E, 0x30E, 0x60E, 0x7FF, 0x7FF, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00],
'5': [0x3FF, 0x3FF, 0x300, 0x300, 0x300, 0x3FC, 0x3FE, 0x07, 0x03, 0x03, 0x303, 0x387, 0x1FE, 0xFC, 0x00, 0x00],
'6': [0xFC, 0x1FE, 0x387, 0x303, 0x300, 0x37C, 0x3FE, 0x387, 0x303, 0x303, 0x303, 0x387, 0x1FE, 0xFC, 0x00, 0x00],
'7': [0x3FF, 0x3FF, 0x03, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x00, 0x00],
'8': [0xFC, 0x1FE, 0x387, 0x303, 0x303, 0x387, 0x1FE, 0xFC, 0x1FE, 0x387, 0x303, 0x303, 0x387, 0x1FE, 0xFC, 0x00],
'9': [0xFC, 0x1FE, 0x387, 0x303, 0x303, 0x387, 0x1FF, 0xFF, 0x03, 0x03, 0x303, 0x387, 0x1FE, 0xFC, 0x00, 0x00],
':': [0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00],
';': [0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x03, 0x06, 0x00, 0x00],
'<': [0x03, 0x0F, 0x3C, 0xF0, 0x3C0, 0x700, 0x3C0, 0xF0, 0x3C, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00],
'=': [0x00, 0x00, 0x00, 0x00, 0x3FF, 0x3FF, 0x00, 0x00, 0x3FF, 0x3FF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'>': [0x600, 0x780, 0x1E0, 0x78, 0x1E, 0x07, 0x1E, 0x78, 0x1E0, 0x780, 0x600, 0x00, 0x00, 0x00, 0x00, 0x00],
'?': [0x7C, 0xFE, 0x1C7, 0x183, 0x03, 0x07, 0x0E, 0x1C, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00],
'@': [0x1F8, 0x3FC, 0x70E, 0x606, 0xE3F, 0xE7F, 0xE67, 0xE67, 0xE67, 0xE7F, 0xE3E, 0x600, 0x70E, 0x3FC, 0x1F8, 0x00],
'A': [0x70, 0xF8, 0xF8, 0x1DC, 0x1DC, 0x38E, 0x38E, 0x38E, 0x3FE, 0x7FF, 0x707, 0x707, 0x707, 0x707, 0x00, 0x00],
'B': [0x7F8, 0x7FC, 0x70E, 0x70E, 0x70E, 0x71C, 0x7F8, 0x7FC, 0x70E, 0x707, 0x707, 0x707, 0x70E, 0x7FE, 0x7FC, 0x00],
'C': [0x1FC, 0x3FE, 0x787, 0x703, 0xE00, 0xE00, 0xE00, 0xE00, 0xE00, 0xE00, 0x703, 0x787, 0x3FE, 0x1FC, 0x00, 0x00],
'D': [0xFF0, 0xFFC, 0xE1E, 0xE0E, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE0E, 0xE1E, 0xFFC, 0xFF0, 0x00, 0x00],
'E': [0x7FF, 0x7FF, 0x700, 0x700, 0x700, 0x700, 0x7FC, 0x7FC, 0x700, 0x700, 0x700, 0x700, 0x7FF, 0x7FF, 0x00, 0x00],
'F': [0x7FF, 0x7FF, 0x700, 0x700, 0x700, 0x700, 0x7FC, 0x7FC, 0x700, 0x700, 0x700, 0x700, 0x700, 0x700, 0x00, 0x00],
'G': [0x1FC, 0x3FE, 0x787, 0x703, 0xE00, 0xE00, 0xE3F, 0xE3F, 0xE07, 0xE07, 0x707, 0x787, 0x3FF, 0x1FF, 0x00, 0x00],
'H': [0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xFFF, 0xFFF, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0x00, 0x00],
'I': [0x7F, 0x7F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x7F, 0x7F, 0x00, 0x00],
'J': [0x7F, 0x7F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x71C, 0x71C, 0x738, 0x3F8, 0x1F0, 0x00, 0x00],
'K': [0xE0E, 0xE1C, 0xE38, 0xE70, 0xEE0, 0xFC0, 0xFC0, 0xFE0, 0xEF0, 0xE78, 0xE3C, 0xE1C, 0xE0E, 0xE07, 0x00, 0x00],
'L': [0x700, 0x700, 0x700, 0x700, 0x700, 0x700, 0x700, 0x700, 0x700, 0x700, 0x700, 0x700, 0x7FF, 0x7FF, 0x00, 0x00],
'M': [0x1C07, 0x1E0F, 0x1E0F, 0x1F1F, 0x1F1F, 0x1DB7, 0x1DB7, 0x1DB7, 0x1CE7, 0x1CE7, 0x1CE7, 0x1C07, 0x1C07, 0x1C07, 0x00, 0x00],
'N': [0xE07, 0xF07, 0xF07, 0xF87, 0xFC7, 0xEE7, 0xE77, 0xE77, 0xE3F, 0xE1F, 0xE1F, 0xE0F, 0xE07, 0xE07, 0x00, 0x00],
'O': [0x1F8, 0x3FC, 0x78E, 0x706, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0x706, 0x78E, 0x3FC, 0x1F8, 0x00, 0x00],
'P': [0x7F8, 0x7FC, 0x70E, 0x707, 0x707, 0x707, 0x70E, 0x7FC, 0x7F8, 0x700, 0x700, 0x700, 0x700, 0x700, 0x00, 0x00],
'Q': [0x1F8, 0x3FC, 0x78E, 0x706, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE67, 0x77E, 0x7BE, 0x3FC, 0x1F7, 0x00, 0x00],
'R': [0xFF0, 0xFF8, 0xE1C, 0xE0E, 0xE0E, 0xE0E, 0xE1C, 0xFF8, 0xFF0, 0xE78, 0xE3C, 0xE1E, 0xE0E, 0xE07, 0x00, 0x00],
'S': [0x1FC, 0x3FE, 0x787, 0x703, 0x700, 0x780, 0x3FC, 0xFE, 0x07, 0x03, 0x703, 0x787, 0x3FE, 0x1FC, 0x00, 0x00],
'T': [0x7FF, 0x7FF, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x00, 0x00],
'U': [0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0x70E, 0x7FE, 0x1F8, 0x00, 0x00],
'V': [0xE07, 0xE07, 0xE07, 0x70E, 0x70E, 0x70E, 0x39C, 0x39C, 0x39C, 0x1F8, 0x1F8, 0x1F8, 0xF0, 0xF0, 0x00, 0x00],
'W': [0xE0E, 0xE0E, 0xE0E, 0xE0E, 0xE0E, 0xE0E, 0x6B6, 0x6B6, 0x6B6, 0x7F7, 0x7F7, 0x7F7, 0x3E3, 0x3E3, 0x00, 0x00],
'X': [0xE07, 0x70E, 0x70E, 0x39C, 0x1F8, 0x1F8, 0xF0, 0xF0, 0x1F8, 0x1F8, 0x39C, 0x70E, 0x70E, 0xE07, 0x00, 0x00],
'Y': [0xE07, 0x70E, 0x70E, 0x39C, 0x39C, 0x1F8, 0x1F8, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00],
'Z': [0x7FF, 0x7FF, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x1C0, 0x380, 0x700, 0xE00, 0xE00, 0x7FF, 0x7FF, 0x00, 0x00],
'[': [0x3F, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x3F, 0x00],
'\\': [0x3000, 0x3800, 0x1C00, 0xE00, 0x700, 0x380, 0x1C0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x00, 0x00],
']': [0x3F, 0x3F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x3F, 0x3F, 0x00],
'^': [0x30, 0x78, 0xFC, 0x1CE, 0x387, 0x303, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'_': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFFFF, 0xFFFF],
'`': [0x0C, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'a': [0x00, 0x00, 0x00, 0x7C, 0xFE, 0x1C7, 0x07, 0x7F, 0xFF, 0x1C7, 0x387, 0x387, 0x1FF, 0xF7, 0x00, 0x00],
'b': [0x380, 0x380, 0x380, 0x3BC, 0x3FE, 0x3CF, 0x387, 0x387, 0x387, 0x387, 0x387, 0x3CF, 0x3FE, 0x3BC, 0x00, 0x00],
'c': [0x00, 0x00, 0x00, 0x7C, 0xFE, 0x1C7, 0x383, 0x380, 0x380, 0x380, 0x383, 0x1C7, 0xFE, 0x7C, 0x00, 0x00],
'd': [0x07, 0x07, 0x07, 0x77, 0xFF, 0x1CF, 0x387, 0x387, 0x387, 0x387, 0x387, 0x1CF, 0xFF, 0x77, 0x00, 0x00],
'e': [0x00, 0x00, 0x00, 0x7C, 0xFE, 0x1C7, 0x383, 0x3FF, 0x3FF, 0x380, 0x381, 0x1C3, 0xFF, 0x7C, 0x00, 0x00],
'f': [0x1F, 0x3F, 0x78, 0x70, 0x1FE, 0x1FE, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x00, 0x00],
'g': [0x00, 0x00, 0x00, 0x77, 0xFF, 0x1CF, 0x387, 0x387, 0x387, 0x387, 0x1CF, 0xFF, 0x77, 0x07, 0x1FE, 0x1FC],
'h': [0x380, 0x380, 0x380, 0x3BC, 0x3FE, 0x3CF, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x00, 0x00],
'i': [0x0C, 0x0C, 0x00, 0x3C, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x3F, 0x00, 0x00],
'j': [0x03, 0x03, 0x00, 0x0F, 0x0F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xE3, 0xE3, 0x7E, 0x3C],
'k': [0x700, 0x700, 0x700, 0x70E, 0x71C, 0x738, 0x770, 0x7E0, 0x7E0, 0x770, 0x738, 0x71C, 0x70E, 0x707, 0x00, 0x00],
'l': [0x3C, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x3F, 0x00, 0x00],
'm': [0x00, 0x00, 0x00, 0xEE7, 0xFFF, 0xF3B, 0xE3B, 0xE3B, 0xE3B, 0xE3B, 0xE3B, 0xE3B, 0xE3B, 0xE3B, 0x00, 0x00],
'n': [0x00, 0x00, 0x00, 0x3BC, 0x3FE, 0x3CF, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x00, 0x00],
'o': [0x00, 0x00, 0x00, 0x7C, 0xFE, 0x1C7, 0x383, 0x383, 0x383, 0x383, 0x383, 0x1C7, 0xFE, 0x7C, 0x00, 0x00],
'p': [0x00, 0x00, 0x00, 0x3BC, 0x3FE, 0x3CF, 0x387, 0x387, 0x387, 0x387, 0x3CF, 0x3FE, 0x3BC, 0x380, 0x380, 0x380],
'q': [0x00, 0x00, 0x00, 0x77, 0xFF, 0x1CF, 0x387, 0x387, 0x387, 0x387, 0x1CF, 0xFF, 0x77, 0x07, 0x07, 0x07],
'r': [0x00, 0x00, 0x00, 0x3BC, 0x3FE, 0x3CF, 0x387, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x00, 0x00],
's': [0x00, 0x00, 0x00, 0xFC, 0x1FE, 0x387, 0x380, 0x1F8, 0xFE, 0x07, 0x07, 0x387, 0x3FE, 0x1FC, 0x00, 0x00],
't': [0x38, 0x38, 0x38, 0xFF, 0xFF, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1F, 0x0F, 0x00, 0x00],
'u': [0x00, 0x00, 0x00, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x1CF, 0x1FF, 0x77, 0x00, 0x00],
'v': [0x00, 0x00, 0x00, 0x707, 0x707, 0x38E, 0x38E, 0x38E, 0x1DC, 0x1DC, 0xF8, 0xF8, 0x70, 0x70, 0x00, 0x00],
'w': [0x00, 0x00, 0x00, 0xE0E, 0xE0E, 0xE0E, 0x6B6, 0x6B6, 0x6B6, 0x7F7, 0x7F7, 0x3E3, 0x3E3, 0x1C1, 0x00, 0x00],
'x': [0x00, 0x00, 0x00, 0x707, 0x38E, 0x1DC, 0xF8, 0x70, 0x70, 0xF8, 0x1DC, 0x38E, 0x707, 0x707, 0x00, 0x00],
'y': [0x00, 0x00, 0x00, 0x707, 0x707, 0x38E, 0x38E, 0x1DC, 0x1DC, 0xF8, 0xF8, 0x70, 0x70, 0xE0, 0x1C0, 0x00],
'z': [0x00, 0x00, 0x00, 0x3FF, 0x3FF, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x1C0, 0x380, 0x3FF, 0x3FF, 0x00, 0x00],
'{': [0x0F, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x1E, 0x0F, 0x00],
'|': [0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00],
'}': [0x78, 0x3C, 0x1C, 0x1C, 0x1C, 0x1C, 0x0E, 0x07, 0x0E, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C, 0x78, 0x00],
'~': [0x00, 0x00, 0x00, 0x00, 0x00, 0x1C7, 0x3EF, 0x77E, 0x738, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'°': [0x0E, 0x1F, 0x1F, 0x1F, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'Ä': [0x18C, 0x18C, 0x00, 0xF8, 0x1FC, 0x38E, 0x38E, 0x38E, 0x3FE, 0x7FF, 0x707, 0x707, 0x707, 0x707, 0x00, 0x00],
'Ö': [0x318, 0x318, 0x00, 0x1F8, 0x3FC, 0x78E, 0x706, 0xE07, 0xE07, 0xE07, 0xE07, 0x706, 0x78E, 0x3FC, 0x1F8, 0x00],
'Ü': [0x318, 0x318, 0x00, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0xE07, 0x70E, 0x7FE, 0x1F8, 0x00],
'ß': [0x7C, 0xFE, 0x1C7, 0x1C7, 0x1C7, 0x1CE, 0x1FC, 0x1FE, 0x1CF, 0x1C7, 0x1C7, 0x1CF, 0x1FE, 0x1BC, 0x180, 0x180],
'ä': [0xC6, 0xC6, 0x00, 0x7C, 0xFE, 0x1C7, 0x07, 0x7F, 0xFF, 0x1C7, 0x387, 0x387, 0x1FF, 0xF7, 0x00, 0x00],
'ö': [0xC6, 0xC6, 0x00, 0x7C, 0xFE, 0x1C7, 0x383, 0x383, 0x383, 0x383, 0x383, 0x1C7, 0xFE, 0x7C, 0x00, 0x00],
'ü': [0xC6, 0xC6, 0x00, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x387, 0x1CF, 0x1FF, 0x77, 0x00, 0x00],
'': [0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00],
'': [0x1F8, 0x7FC, 0xF0E, 0x1C07, 0x1FC0, 0x1FC0, 0x3800, 0x1FC0, 0x1FC0, 0x3800, 0x1FC0, 0x1FC0, 0x1C07, 0xF0E, 0x7FC, 0x1F8],
}

View File

@@ -0,0 +1,115 @@
font_3x5 = {
# Jedes Zeichen ist genau 3 Pixel breit, 5 Pixel hoch
' ': [0x00, 0x00, 0x00, 0x00, 0x00],
'!': [0x01, 0x01, 0x01, 0x00, 0x01],
'"': [0x05, 0x05, 0x00, 0x00, 0x00],
'#': [0x05, 0x07, 0x05, 0x07, 0x05],
'$': [0x07, 0x05, 0x07, 0x05, 0x07],
'%': [0x05, 0x01, 0x02, 0x04, 0x05],
'&': [0x02, 0x05, 0x02, 0x05, 0x06],
"'": [0x01, 0x01, 0x00, 0x00, 0x00],
'(': [0x02, 0x04, 0x04, 0x04, 0x02],
')': [0x04, 0x02, 0x02, 0x02, 0x04],
'*': [0x00, 0x05, 0x02, 0x05, 0x00],
'+': [0x00, 0x02, 0x07, 0x02, 0x00],
',': [0x00, 0x00, 0x00, 0x02, 0x04],
'-': [0x00, 0x00, 0x07, 0x00, 0x00],
'.': [0x00, 0x00, 0x00, 0x00, 0x02],
'/': [0x01, 0x01, 0x02, 0x04, 0x04],
# Zahlen
'0': [0x07, 0x05, 0x05, 0x05, 0x07],
'1': [0x02, 0x06, 0x02, 0x02, 0x07],
'2': [0x07, 0x01, 0x07, 0x04, 0x07],
'3': [0x07, 0x01, 0x07, 0x01, 0x07],
'4': [0x05, 0x05, 0x07, 0x01, 0x01],
'5': [0x07, 0x04, 0x07, 0x01, 0x07],
'6': [0x07, 0x04, 0x07, 0x05, 0x07],
'7': [0x07, 0x01, 0x01, 0x01, 0x01],
'8': [0x07, 0x05, 0x07, 0x05, 0x07],
'9': [0x07, 0x05, 0x07, 0x01, 0x07],
# Großbuchstaben
'A': [0x02, 0x05, 0x07, 0x05, 0x05],
'B': [0x06, 0x05, 0x06, 0x05, 0x06],
'C': [0x07, 0x04, 0x04, 0x04, 0x07],
'D': [0x06, 0x05, 0x05, 0x05, 0x06],
'E': [0x07, 0x04, 0x07, 0x04, 0x07],
'F': [0x07, 0x04, 0x07, 0x04, 0x04],
'G': [0x07, 0x04, 0x05, 0x05, 0x07],
'H': [0x05, 0x05, 0x07, 0x05, 0x05],
'I': [0x07, 0x02, 0x02, 0x02, 0x07],
'J': [0x07, 0x02, 0x02, 0x02, 0x06],
'K': [0x05, 0x05, 0x06, 0x05, 0x05],
'L': [0x04, 0x04, 0x04, 0x04, 0x07],
'M': [0x05, 0x07, 0x07, 0x05, 0x05],
'N': [0x05, 0x07, 0x07, 0x07, 0x05],
'O': [0x07, 0x05, 0x05, 0x05, 0x07],
'P': [0x07, 0x05, 0x07, 0x04, 0x04],
'Q': [0x07, 0x05, 0x05, 0x07, 0x03],
'R': [0x07, 0x05, 0x06, 0x05, 0x05],
'S': [0x07, 0x04, 0x07, 0x01, 0x07],
'T': [0x07, 0x02, 0x02, 0x02, 0x02],
'U': [0x05, 0x05, 0x05, 0x05, 0x07],
'V': [0x05, 0x05, 0x05, 0x05, 0x02],
'W': [0x05, 0x05, 0x07, 0x07, 0x05],
'X': [0x05, 0x05, 0x02, 0x05, 0x05],
'Y': [0x05, 0x05, 0x07, 0x02, 0x02],
'Z': [0x07, 0x01, 0x02, 0x04, 0x07],
# Kleinbuchstaben
'a': [0x00, 0x07, 0x05, 0x05, 0x07],
'b': [0x04, 0x06, 0x05, 0x05, 0x06],
'c': [0x00, 0x07, 0x04, 0x04, 0x07],
'd': [0x01, 0x07, 0x05, 0x05, 0x07],
'e': [0x00, 0x07, 0x07, 0x04, 0x07],
'f': [0x03, 0x04, 0x06, 0x04, 0x04],
'g': [0x07, 0x05, 0x07, 0x01, 0x06],
'h': [0x04, 0x06, 0x05, 0x05, 0x05],
'i': [0x02, 0x00, 0x02, 0x02, 0x02],
'j': [0x02, 0x00, 0x02, 0x02, 0x06],
'k': [0x04, 0x05, 0x06, 0x05, 0x05],
'l': [0x06, 0x02, 0x02, 0x02, 0x02],
'm': [0x00, 0x07, 0x07, 0x05, 0x05],
'n': [0x00, 0x06, 0x05, 0x05, 0x05],
'o': [0x00, 0x07, 0x05, 0x05, 0x07],
'p': [0x00, 0x06, 0x05, 0x06, 0x04],
'q': [0x00, 0x07, 0x05, 0x07, 0x01],
'r': [0x00, 0x06, 0x05, 0x04, 0x04],
's': [0x00, 0x07, 0x06, 0x03, 0x07],
't': [0x02, 0x07, 0x02, 0x02, 0x03],
'u': [0x00, 0x05, 0x05, 0x05, 0x07],
'v': [0x00, 0x05, 0x05, 0x05, 0x02],
'w': [0x00, 0x05, 0x05, 0x07, 0x05],
'x': [0x00, 0x05, 0x02, 0x02, 0x05],
'y': [0x00, 0x05, 0x05, 0x07, 0x01],
'z': [0x00, 0x07, 0x02, 0x04, 0x07],
# Sonderzeichen
':': [0x00, 0x02, 0x00, 0x02, 0x00],
';': [0x00, 0x02, 0x00, 0x02, 0x04],
'<': [0x01, 0x02, 0x04, 0x02, 0x01],
'=': [0x00, 0x07, 0x00, 0x07, 0x00],
'>': [0x04, 0x02, 0x01, 0x02, 0x04],
'?': [0x07, 0x01, 0x02, 0x00, 0x02],
'@': [0x07, 0x05, 0x05, 0x04, 0x07],
'[': [0x07, 0x04, 0x04, 0x04, 0x07],
'\\': [0x04, 0x04, 0x02, 0x01, 0x01],
']': [0x07, 0x01, 0x01, 0x01, 0x07],
'^': [0x02, 0x05, 0x00, 0x00, 0x00],
'_': [0x00, 0x00, 0x00, 0x00, 0x07],
'`': [0x04, 0x02, 0x00, 0x00, 0x00],
'{': [0x03, 0x02, 0x06, 0x02, 0x03],
'|': [0x02, 0x02, 0x02, 0x02, 0x02],
'}': [0x06, 0x02, 0x03, 0x02, 0x06],
'~': [0x00, 0x05, 0x0A, 0x00, 0x00],
'°': [0x02, 0x05, 0x02, 0x00, 0x00],
# DEUTSCHE UMLAUTE - Großbuchstaben
'Ä': [0x05, 0x02, 0x05, 0x07, 0x05], # A mit Umlautpunkten
'Ö': [0x05, 0x07, 0x05, 0x05, 0x07], # O mit Umlautpunkten
'Ü': [0x05, 0x05, 0x05, 0x05, 0x07], # U mit Umlautpunkten
'': [0x07, 0x05, 0x07, 0x05, 0x05], # Scharfes S (Groß)
# DEUTSCHE UMLAUTE - Kleinbuchstaben
'ä': [0x05, 0x00, 0x07, 0x05, 0x07], # a mit Umlautpunkten
'ö': [0x05, 0x00, 0x07, 0x05, 0x07], # o mit Umlautpunkten
'ü': [0x05, 0x00, 0x05, 0x05, 0x07], # u mit Umlautpunkten
'ß': [0x06, 0x05, 0x06, 0x04, 0x04], # scharfes s (Klein)
}

View File

@@ -0,0 +1,127 @@
# fonts.py - Optimized fonts for LED matrix with character width adjustment
# 5x7 Font (Optimized Width)
font_5x7 = {
# Uppercase letters (A-Z) - Optimized for better spacing
'A': [0x0E, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11], # Width: 5
'B': [0x1E, 0x11, 0x11, 0x1E, 0x11, 0x11, 0x1E], # Width: 5
'C': [0x0E, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0E], # Width: 5
'D': [0x1E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1E], # Width: 5
'E': [0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x1F], # Width: 5
'F': [0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x10], # Width: 5
'G': [0x0E, 0x11, 0x10, 0x13, 0x11, 0x11, 0x0F], # Width: 5
'H': [0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11], # Width: 5
# 'I': [0x0E, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0E], # Width: 3
'I': [0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07], # Width: 3
'J': [0x07, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0C], # Width: 4
'K': [0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11], # Width: 5
'L': [0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F], # Width: 5
'M': [0x11, 0x1B, 0x15, 0x15, 0x11, 0x11, 0x11], # Width: 5
'N': [0x11, 0x19, 0x19, 0x15, 0x13, 0x13, 0x11], # Width: 5
'O': [0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E], # Width: 5
'P': [0x1E, 0x11, 0x11, 0x1E, 0x10, 0x10, 0x10], # Width: 5
'Q': [0x0E, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0D], # Width: 5
'R': [0x1E, 0x11, 0x11, 0x1E, 0x14, 0x12, 0x11], # Width: 5
'S': [0x0F, 0x10, 0x10, 0x0E, 0x01, 0x01, 0x1E], # Width: 5
'T': [0x1F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04], # Width: 5
'U': [0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E], # Width: 5
'V': [0x11, 0x11, 0x11, 0x11, 0x11, 0x0A, 0x04], # Width: 5
'W': [0x11, 0x11, 0x11, 0x15, 0x15, 0x15, 0x0A], # Width: 5
'X': [0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11], # Width: 5
'Y': [0x11, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x04], # Width: 5
'Z': [0x1F, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1F], # Width: 5
# German Uppercase Umlaute
'Ä': [0x0A, 0x00, 0x0E, 0x11, 0x1F, 0x11, 0x11], # Width: 5 (A Umlaut)
'Ö': [0x0A, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E], # Width: 5 (O Umlaut)
'Ü': [0x0A, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0E], # Width: 5 (U Umlaut)
'': [0x0E, 0x11, 0x11, 0x1E, 0x11, 0x11, 0x1E], # Width: 5 (Eszett - scharfes S)
# Lowercase letters (a-z) - Optimized for compact display
'a': [0x00, 0x00, 0x0E, 0x01, 0x0F, 0x11, 0x0F], # Width: 4
'b': [0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x1E], # Width: 5
'c': [0x00, 0x00, 0x0E, 0x11, 0x10, 0x11, 0x0E], # Width: 4
'd': [0x01, 0x01, 0x0D, 0x13, 0x11, 0x11, 0x0F], # Width: 5
'e': [0x00, 0x00, 0x0E, 0x11, 0x1F, 0x10, 0x0E], # Width: 4
'f': [0x06, 0x09, 0x08, 0x1C, 0x08, 0x08, 0x08], # Width: 4
'g': [0x00, 0x0F, 0x11, 0x11, 0x0F, 0x01, 0x0E], # Width: 5
'h': [0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x11], # Width: 5
# 'i': [0x00, 0x04, 0x00, 0x0C, 0x04, 0x04, 0x0E], # Width: 2
'i': [0x00, 0x02, 0x00, 0x06, 0x02, 0x02, 0x07], # Width: 2
'j': [0x00, 0x02, 0x00, 0x06, 0x02, 0x12, 0x0C], # Width: 3
'k': [0x10, 0x10, 0x12, 0x14, 0x18, 0x14, 0x12], # Width: 4
# 'l': [0x0C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0E], # Width: 3
'l': [0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07], # Width: 3
'm': [0x00, 0x00, 0x1A, 0x15, 0x15, 0x15, 0x15], # Width: 5
'n': [0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11], # Width: 5
'o': [0x00, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E], # Width: 4
'p': [0x00, 0x00, 0x1E, 0x11, 0x1E, 0x10, 0x10], # Width: 5
'q': [0x00, 0x00, 0x0D, 0x13, 0x0F, 0x01, 0x01], # Width: 5
'r': [0x00, 0x00, 0x16, 0x19, 0x10, 0x10, 0x10], # Width: 5
's': [0x00, 0x00, 0x0E, 0x10, 0x0E, 0x01, 0x1E], # Width: 4
't': [0x08, 0x08, 0x1C, 0x08, 0x08, 0x09, 0x06], # Width: 4
'u': [0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0D], # Width: 5
'v': [0x00, 0x00, 0x11, 0x11, 0x11, 0x0A, 0x04], # Width: 5
'w': [0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0A], # Width: 5
'x': [0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11], # Width: 5
'y': [0x00, 0x00, 0x11, 0x11, 0x0F, 0x01, 0x0E], # Width: 5
'z': [0x00, 0x00, 0x1F, 0x02, 0x04, 0x08, 0x1F], # Width: 5
# German Lowercase Umlaute
'ä': [0x0A, 0x00, 0x0E, 0x01, 0x0F, 0x11, 0x0F], # Width: 4 (a Umlaut)
'ö': [0x0A, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E], # Width: 4 (o Umlaut)
'ü': [0x0A, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0D], # Width: 5 (u Umlaut)
'ß': [0x00, 0x00, 0x0E, 0x11, 0x1E, 0x11, 0x1E], # Width: 5 (Eszett - scharfes S)
# Numbers (0-9) - Optimized for consistent width
'0': [0x0E, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0E], # Width: 5
'1': [0x02, 0x06, 0x02, 0x02, 0x02, 0x02, 0x07], # Width: 3
# '1': [0x04, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x0E], # Width: 3
# '1': [0x08, 0x18, 0x08, 0x08, 0x08, 0x08, 0x1C], # Width: 3
'2': [0x0E, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1F], # Width: 5
'3': [0x1F, 0x02, 0x04, 0x02, 0x01, 0x11, 0x0E], # Width: 5
'4': [0x02, 0x06, 0x0A, 0x12, 0x1F, 0x02, 0x02], # Width: 5
'5': [0x1F, 0x10, 0x1E, 0x01, 0x01, 0x11, 0x0E], # Width: 5
'6': [0x06, 0x08, 0x10, 0x1E, 0x11, 0x11, 0x0E], # Width: 5
'7': [0x1F, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08], # Width: 5
'8': [0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E], # Width: 5
'9': [0x0E, 0x11, 0x11, 0x0F, 0x01, 0x02, 0x0C], # Width: 5
# Punctuation and symbols - Optimized widths
' ': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # Width: 2
# '!': [0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x04], # Width: 1
'!': [0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01], # Width: 1
'?': [0x0E, 0x11, 0x02, 0x04, 0x04, 0x00, 0x04], # Width: 5
'.': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01], # Width: 1
',': [0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02], # Width: 1
':': [0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00], # Width: 1
';': [0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02], # Width: 1
"'": [0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00], # Width: 1
'"': [0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00], # Width: 3
'-': [0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00], # Width: 5
'_': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F], # Width: 5
'+': [0x00, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x00], # Width: 5
'=': [0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00], # Width: 5
'*': [0x00, 0x0A, 0x04, 0x1F, 0x04, 0x0A, 0x00], # Width: 5
'/': [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00], # Width: 5
'\\': [0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00], # Width: 5
'(': [0x01, 0x02, 0x04, 0x04, 0x04, 0x02, 0x01], # Width: 3
')': [0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x04], # Width: 3
'[': [0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07], # Width: 3
']': [0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07], # Width: 3
'{': [0x03, 0x02, 0x02, 0x04, 0x02, 0x02, 0x03], # Width: 3
'}': [0x06, 0x02, 0x02, 0x01, 0x02, 0x02, 0x06], # Width: 3
'<': [0x00, 0x01, 0x02, 0x04, 0x02, 0x01, 0x00], # Width: 4
'>': [0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00], # Width: 4
'@': [0x0E, 0x11, 0x17, 0x15, 0x17, 0x10, 0x0E], # Width: 5
'#': [0x0A, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x0A], # Width: 5
'$': [0x04, 0x0F, 0x14, 0x0E, 0x05, 0x1E, 0x04], # Width: 5
'%': [0x18, 0x19, 0x02, 0x04, 0x08, 0x13, 0x03], # Width: 5
'&': [0x0C, 0x12, 0x14, 0x08, 0x15, 0x12, 0x0D], # Width: 5
'^': [0x04, 0x0A, 0x11, 0x00, 0x00, 0x00, 0x00], # Width: 5
'~': [0x00, 0x00, 0x00, 0x0D, 0x12, 0x00, 0x00], # Width: 5
# Special characters
'°': [0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00], # Width: 3 (Degree symbol)
'|': [0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01], # Width: 1 (Vertical bar)
'`': [0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00], # Width: 2 (Backtick)
'': [0x0F, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D], # Width: 5 (Paragraph symbol)
'': [0x00, 0x00, 0x02, 0x07, 0x02, 0x00, 0x00], # Width: 3 (Bullet point)
}

View File

@@ -0,0 +1,104 @@
font_8x8 = {
' ': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'!': [0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x03, 0x00],
'"': [0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'#': [0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00],
'$': [0x0C, 0x1F, 0x30, 0x1E, 0x03, 0x3E, 0x0C, 0x00],
'%': [0x31, 0x33, 0x06, 0x0C, 0x18, 0x33, 0x23, 0x00],
'&': [0x3C, 0x66, 0x3C, 0x38, 0x67, 0x66, 0x3F, 0x00],
"'": [0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'(': [0x03, 0x06, 0x0C, 0x0C, 0x0C, 0x06, 0x03, 0x00],
')': [0x0C, 0x06, 0x03, 0x03, 0x03, 0x06, 0x0C, 0x00],
'*': [0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00],
'+': [0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00],
',': [0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x06],
'-': [0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00],
'.': [0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00],
'/': [0x00, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x00, 0x00],
'0': [0x1E, 0x33, 0x37, 0x3B, 0x33, 0x33, 0x1E, 0x00],
'1': [0x0C, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00],
'2': [0x1E, 0x33, 0x03, 0x06, 0x0C, 0x18, 0x3F, 0x00],
'3': [0x1E, 0x33, 0x03, 0x0E, 0x03, 0x33, 0x1E, 0x00],
'4': [0x06, 0x0E, 0x1E, 0x36, 0x3F, 0x06, 0x06, 0x00],
'5': [0x3F, 0x30, 0x3E, 0x03, 0x03, 0x33, 0x1E, 0x00],
'6': [0x1E, 0x33, 0x30, 0x3E, 0x33, 0x33, 0x1E, 0x00],
'7': [0x3F, 0x03, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x00],
'8': [0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00],
'9': [0x1E, 0x33, 0x33, 0x1F, 0x03, 0x33, 0x1E, 0x00],
':': [0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00],
';': [0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x06],
'<': [0x00, 0x03, 0x06, 0x0C, 0x06, 0x03, 0x00, 0x00],
'=': [0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x00],
'>': [0x00, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x00, 0x00],
'?': [0x1E, 0x33, 0x06, 0x0C, 0x0C, 0x00, 0x0C, 0x00],
'@': [0x3C, 0x42, 0x99, 0xA5, 0xA5, 0x9E, 0x40, 0x3C],
'A': [0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00],
'B': [0x3E, 0x33, 0x33, 0x3E, 0x33, 0x33, 0x3E, 0x00],
'C': [0x1E, 0x33, 0x30, 0x30, 0x30, 0x33, 0x1E, 0x00],
'D': [0x3C, 0x36, 0x33, 0x33, 0x33, 0x36, 0x3C, 0x00],
'E': [0x3F, 0x30, 0x30, 0x3C, 0x30, 0x30, 0x3F, 0x00],
'F': [0x3F, 0x30, 0x30, 0x3C, 0x30, 0x30, 0x30, 0x00],
'G': [0x1E, 0x33, 0x30, 0x37, 0x33, 0x33, 0x1E, 0x00],
'H': [0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00],
'I': [0x0F, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0F, 0x00],
'J': [0x0F, 0x06, 0x06, 0x06, 0x06, 0x36, 0x1C, 0x00],
'K': [0x33, 0x36, 0x3C, 0x38, 0x3C, 0x36, 0x33, 0x00],
'L': [0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x00],
'M': [0x63, 0x77, 0x7F, 0x6B, 0x63, 0x63, 0x63, 0x00],
'N': [0x33, 0x3B, 0x3F, 0x3F, 0x37, 0x33, 0x33, 0x00],
'O': [0x1E, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00],
'P': [0x3E, 0x33, 0x33, 0x3E, 0x30, 0x30, 0x30, 0x00],
'Q': [0x1E, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x07, 0x00],
'R': [0x3E, 0x33, 0x33, 0x3E, 0x3C, 0x36, 0x33, 0x00],
'S': [0x1E, 0x33, 0x30, 0x1E, 0x03, 0x33, 0x1E, 0x00],
'T': [0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00],
'U': [0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00],
'V': [0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00],
'W': [0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00],
'X': [0x33, 0x33, 0x1E, 0x0C, 0x1E, 0x33, 0x33, 0x00],
'Y': [0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x0C, 0x00],
'Z': [0x3F, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x3F, 0x00],
'[': [0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0F, 0x00],
'\\': [0x00, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0x00],
']': [0x0F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0F, 0x00],
'^': [0x0C, 0x1E, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00],
'_': [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F],
'`': [0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
'a': [0x00, 0x00, 0x1E, 0x03, 0x1F, 0x33, 0x1F, 0x00],
'b': [0x30, 0x30, 0x3E, 0x33, 0x33, 0x33, 0x3E, 0x00],
'c': [0x00, 0x00, 0x1E, 0x33, 0x30, 0x33, 0x1E, 0x00],
'd': [0x03, 0x03, 0x1F, 0x33, 0x33, 0x33, 0x1F, 0x00],
'e': [0x00, 0x00, 0x1E, 0x33, 0x3F, 0x30, 0x1E, 0x00],
'f': [0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0x18, 0x00],
'g': [0x00, 0x00, 0x1F, 0x33, 0x33, 0x1F, 0x03, 0x3E],
'h': [0x30, 0x30, 0x3E, 0x33, 0x33, 0x33, 0x33, 0x00],
'i': [0x06, 0x00, 0x0E, 0x06, 0x06, 0x06, 0x0F, 0x00],
'j': [0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x33, 0x1E],
'k': [0x30, 0x30, 0x33, 0x36, 0x3C, 0x36, 0x33, 0x00],
'l': [0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0F, 0x00],
'm': [0x00, 0x00, 0x66, 0x7F, 0x7F, 0x6B, 0x63, 0x00],
'n': [0x00, 0x00, 0x3E, 0x33, 0x33, 0x33, 0x33, 0x00],
'o': [0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00],
'p': [0x00, 0x00, 0x3E, 0x33, 0x33, 0x3E, 0x30, 0x30],
'q': [0x00, 0x00, 0x1F, 0x33, 0x33, 0x1F, 0x03, 0x03],
'r': [0x00, 0x00, 0x3E, 0x33, 0x30, 0x30, 0x30, 0x00],
's': [0x00, 0x00, 0x1F, 0x30, 0x1E, 0x03, 0x3E, 0x00],
't': [0x0C, 0x0C, 0x1F, 0x0C, 0x0C, 0x0C, 0x07, 0x00],
'u': [0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1F, 0x00],
'v': [0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00],
'w': [0x00, 0x00, 0x63, 0x6B, 0x7F, 0x3E, 0x36, 0x00],
'x': [0x00, 0x00, 0x33, 0x1E, 0x0C, 0x1E, 0x33, 0x00],
'y': [0x00, 0x00, 0x33, 0x33, 0x33, 0x1F, 0x06, 0x3C],
'z': [0x00, 0x00, 0x3F, 0x06, 0x0C, 0x18, 0x3F, 0x00],
'{': [0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00],
'|': [0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00],
'}': [0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00],
'~': [0x00, 0x00, 0x00, 0x1B, 0x36, 0x00, 0x00, 0x00],
'°': [0x0E, 0x11, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00],
'': [0x1F, 0x3D, 0x3D, 0x3D, 0x1D, 0x05, 0x05, 0x00],
'': [0x00, 0x00, 0x06, 0x0F, 0x0F, 0x06, 0x00, 0x00],
'': [0x1C, 0x3E, 0x7F, 0x7F, 0x1C, 0x1C, 0x3E, 0x00],
'': [0x1C, 0x1C, 0x3E, 0x7F, 0x36, 0x1C, 0x3E, 0x00],
'': [0x36, 0x7F, 0x7F, 0x7F, 0x3E, 0x1C, 0x08, 0x00],
'': [0x08, 0x1C, 0x3E, 0x7F, 0x3E, 0x1C, 0x08, 0x00],
}

View File

@@ -0,0 +1,418 @@
from machine import Pin # type: ignore
from neopixel import NeoPixel # type: ignore
from utils import char_width
from display import fonts
from utils import colors
from utils.time_utils import (
get_german_timestamp_short,
get_datetime_string,
get_german_time_ticks,
get_german_date_ticks,
)
import time
import math
class NeoPixel_64x64(NeoPixel):
MATRIX_WIDTH = 64
MATRIX_HEIGHT = 64
def __init__(self, pin=28):
"""
Initialize LED Display
Args:
width: Matrix width in pixels
height: Matrix height in pixels
pin: NeoPixel data pin
"""
super().__init__(Pin(pin), self.MATRIX_WIDTH * self.MATRIX_HEIGHT)
# Font configuration
self.set_font(fonts.font_5x7)
def set_font(self, font):
"""
Set the current font for text rendering
Args:
font: Font dictionary from fonts_array
"""
self.selected_font = font
# Höhe des Fonts, Anzahl der Zeilen für jedes Zeichen
# wir holen den ersten Wert des Fonts
first_char = next(iter(self.selected_font))
self.font_height = len(self.selected_font[first_char])
def set_pixel(self, x, y, color):
"""
Set a single pixel to the specified color
Args:
x: X coordinate
y: Y coordinate
color: RGB color tuple
"""
index = y * self.MATRIX_WIDTH + x
if 0 <= x < self.MATRIX_WIDTH and 0 <= y < self.MATRIX_HEIGHT:
self[index] = color
def clear(self):
"""Clear the entire display (turn off all pixels)"""
for i in range(len(self)):
self[i] = colors.BLACK
self.write()
def clear_box(
self,
from_row: int,
from_col: int,
to_row: int,
to_col: int,
color: tuple[3] = colors.BLACK,
) -> None:
"""löscht einen Bereich (Box) im Display
Args:
from_row (int): Start-Zeile
from_col (int): Start-Spalte
to_row (int): End-Zeile
to_col (int): End-Spalte
"""
for row in range(from_row, to_row):
for col in range(from_col, to_col + 1):
idx: int = row * self.MATRIX_WIDTH + col
self[idx] = color
self.write()
def clear_row(self, row: int, effect: bool = False) -> None:
"""löscht eine Zeile im Display entsprechend des eingestellten Fonts
Args:
row (int): in Pixel start bei 0 !!!
effect (bool, optional): zeilenweise bzw. pixelweise löschen. Defaults to False.
"""
start = row * self.MATRIX_WIDTH
ende = start + self.font_height * self.MATRIX_WIDTH - 1
print(f"clear row: {row} --> pixels {start} to {ende}")
for i in range(start, ende):
self[i] = colors.BLACK
if effect and i % self.MATRIX_WIDTH == 0:
self.write()
self.write()
def draw_letter(self, letter, x, y, color):
"""
Draw a single letter using current font with optimized width
Args:
letter: Character to draw
x: X position
y: Y position
color: RGB color tuple
"""
if letter in self.selected_font:
char_data = self.selected_font[letter]
charwidth = char_width(char_data)
# background for the letter (full font size)
[
# print(xpos, ypos)
self.set_pixel(xpos, ypos, colors.GRAY)
for xpos in range(
x, x + charwidth
) # 8 because full with of character representation
for ypos in range(y, y + self.font_height)
]
for row in range(self.font_height):
row_data = char_data[row]
for col in range(charwidth):
# Check if pixel should be lit (MSB first)
# Only check bits within the actual character width
if row_data & (1 << ((charwidth - 1) - col)):
self.set_pixel(x + col, y + row, color)
else:
print(f"oops, letter does not exist in the font -> {letter}")
def draw_text(self, text, x, y, color):
"""
Draw text with optimized character spacing
Args:
text: Text to draw
x: Starting X position
y: Starting Y position
color: RGB color tuple
"""
current_x = x
for char in text:
self.draw_letter(char, current_x, y, color)
# Move cursor by character width + 1 pixel spacing
charwidth = char_width(self.selected_font[char])
current_x += charwidth + 1
def show_hello(self):
"""Display HELLO with timestamp"""
self.clear()
# Draw HELLO in rainbow colors
self.draw_text("HELLO!", 6, 4, colors.RAINBOW[2])
# Show timestamp
datetimestr = get_german_timestamp_short()
self.draw_text(datetimestr, 2, 15, colors.RAINBOW[4])
self.write()
def vertical_floating_text(
self, text, x, color=colors.RAINBOW[0], float_range=3, speed=0.2, duration=10
):
"""
Vertical floating text animation
Args:
text: Text to display
x: X position (fixed)
color: Text color
float_range: How many pixels to float up/down
speed: Animation speed
duration: How long to run animation in seconds
"""
start_time = time.time()
while time.time() - start_time < duration:
# Calculate floating offset using sine wave
offset = math.sin(time.time() * speed) * float_range
current_y = int(
self.MATRIX_HEIGHT // 2 + offset - (len(text) * self.font_height) // 2
)
self.clear()
# Draw each letter vertically
for i, char in enumerate(text):
char_y = current_y + (i * self.font_height)
# Keep text within matrix bounds
if 0 <= char_y < self.MATRIX_HEIGHT - self.font_height:
self.draw_letter(char, x, char_y, color)
self.write()
time.sleep(0.05)
def horizontal_floating_text(
self, text, y, color=colors.RAINBOW[0], float_range=3, speed=0.2, duration=10
):
"""
Horizontal floating text animation
Args:
text: Text to display
y: Y position (fixed)
color: Text color
float_range: How many pixels to float left/right
speed: Animation speed
duration: How long to run animation in seconds
"""
start_time = time.time()
counter = 0
while time.time() - start_time < duration:
# Calculate floating offset using sine wave
offset = math.sin(counter) * float_range
current_x = int(offset) # to right
self.clear()
# Draw text at floating position
for i, char in enumerate(text):
charwidth = char_width(self.selected_font[char])
char_x = current_x + (i * (charwidth + 1))
# Keep text within matrix bounds
if 0 <= char_x < self.MATRIX_WIDTH - charwidth:
self.draw_letter(char, char_x, y, color)
self.write()
counter += speed
time.sleep(0.05)
def rotate_text_left_continuous(
self, text, y, color=colors.RAINBOW[0], speed=1.0, duration=10
):
"""
Continuous left rotation - text wraps around seamlessly
Args:
text: Text to display
y: Y position (fixed)
color: Text color
speed: Movement speed
duration: How long to run animation in seconds
"""
start_time = time.time()
# hier müssen wir die Länge/Breite in Pixel des gesamten Textes berechnen
# text_width_overall = len(text) * (self.font_width + 1)
### TODO: ACHTUNG: noch zu testen !!!
# Breite jedes Zeichens
text_width_overall = sum(
[char_width(self.selected_font[char]) for char in text]
)
position = 0
while time.time() - start_time < duration:
self.clear()
# Draw text at current position
for i, char in enumerate(text):
charwidth = char_width(self.selected_font[char])
char_x = int(position + (i * (charwidth + 1)))
# Handle wrapping
if char_x < -charwidth:
char_x += self.MATRIX_WIDTH + text_width_overall
if 0 <= char_x < self.MATRIX_WIDTH:
self.draw_letter(char, char_x, y, color)
self.write()
# Move left and wrap around
position -= speed
if position < -text_width_overall:
position = self.MATRIX_WIDTH
time.sleep(0.05)
def draw_rectangle(self, x, y, width, height, color, fill=False):
"""
Draw a rectangle
Args:
x: Top-left X position
y: Top-left Y position
width: Rectangle width
height: Rectangle height
color: RGB color tuple
fill: Whether to fill the rectangle
"""
if fill:
for i in range(height):
for j in range(width):
self.set_pixel(x + j, y + i, color)
else:
# Top and bottom edges
for i in range(width):
self.set_pixel(x + i, y, color)
self.set_pixel(x + i, y + height - 1, color)
# Left and right edges
for i in range(height):
self.set_pixel(x, y + i, color)
self.set_pixel(x + width - 1, y + i, color)
def draw_line(self, x1, y1, x2, y2, color):
"""
Draw a line using Bresenham's algorithm
Args:
x1, y1: Start coordinates
x2, y2: End coordinates
color: RGB color tuple
"""
dx = abs(x2 - x1)
dy = abs(y2 - y1)
sx = 1 if x1 < x2 else -1
sy = 1 if y1 < y2 else -1
err = dx - dy
while True:
self.set_pixel(x1, y1, color)
if x1 == x2 and y1 == y2:
break
e2 = 2 * err
if e2 > -dy:
err -= dy
x1 += sx
if e2 < dx:
err += dx
y1 += sy
def write_text(self, text: str, xpos: int, ypos: int, color=colors.WHITE) -> None:
self.draw_text(text, xpos, ypos, color) # Pixel setzen
self.write() # und anzeigen
def screen_text(self, text: str):
"""Text für einen Screen anpassen,
Anzahl der Zeichen je Zeile begrenzen,
ebenso wird die Höhe des Screen brücksichtigt
Args:
text (str): Text der ausgegeben werden soll
font: Berechnungen für den Font
height (int): Pixel
width (int): Pixel
"""
def text_per_row(txt):
pixs = 0
visible_text = ""
for a in txt:
pixs += char_width(self.selected_font[a]) + 1
if pixs > self.MATRIX_WIDTH:
# Zeilenende erreicht
break
visible_text += a
return visible_text
# Ganzzahl Division
max_visible_rows = self.MATRIX_HEIGHT // self.font_height
print(f"rows_visible: {max_visible_rows}")
text_left = text
scn_txt = []
for _ in range(max_visible_rows):
visible_text = text_per_row(text_left)
visible_text_len = len(visible_text)
text_left = text_left[visible_text_len:]
scn_txt.append(visible_text)
if not text_left:
break
scr_txt_dict = {"visible": scn_txt, "invisible": text_left}
return scr_txt_dict
# Example usage
if __name__ == "__main__":
# Create display instance
display = NeoPixel_64x64()
print("LED Matrix Display Initialized")
print(get_datetime_string())
print(f"German time: {get_german_time_ticks()}")
print(f"German date: {get_german_date_ticks()}")
# Demo various functions
display.show_hello()
time.sleep(3)
display.vertical_floating_text("HELLO", 30, colors.RAINBOW[0], 5, 0.15, 5)
display.horizontal_floating_text("FLOAT", 28, colors.RAINBOW[1], 10, 0.1, 5)
display.rotate_text_left_continuous("ROTATE FLOAT", 28, speed=8.0, duration=5)
# Draw some shapes
display.clear()
display.draw_rectangle(5, 5, 10, 10, colors.RAINBOW[0])
display.draw_rectangle(20, 20, 15, 8, colors.RAINBOW[2], fill=True)
display.draw_line(0, 0, 63, 63, colors.RAINBOW[4])
display.write()