From ad0bf2eed1e6c8bf47b1525fa4445c9512bbc0d7 Mon Sep 17 00:00:00 2001 From: tiijay Date: Tue, 21 Oct 2025 17:31:59 +0200 Subject: [PATCH] v.0.2.0 font_5x7_optimized --- app/display/fonts/font_5x7_opt.py | 236 ++++++++++++++++++++++++++++++ app/display/fonts/fonts_utils.py | 3 + app/display/neopixel_64x64.py | 70 ++++++++- app/utils/utils.py | 5 + main.py | 66 +++++++-- 5 files changed, 364 insertions(+), 16 deletions(-) create mode 100644 app/display/fonts/font_5x7_opt.py diff --git a/app/display/fonts/font_5x7_opt.py b/app/display/fonts/font_5x7_opt.py new file mode 100644 index 0000000..786549f --- /dev/null +++ b/app/display/fonts/font_5x7_opt.py @@ -0,0 +1,236 @@ +# 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 + # 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 + # Numbers (0-9) - Optimized for consistent width + '0': [0x0E, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0E], # Width: 5 + # '1': [0x04, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x0E], # Width: 3 + '1': [0x02, 0x06, 0x02, 0x02, 0x02, 0x02, 0x07], # 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) +} + +# Character width mapping for optimized spacing +char_width = { + # Wide characters (5 pixels) + 'A': 5, + 'B': 5, + 'C': 5, + 'D': 5, + 'E': 5, + 'F': 5, + 'G': 5, + 'H': 5, + 'K': 5, + 'L': 5, + 'M': 5, + 'N': 5, + 'O': 5, + 'P': 5, + 'Q': 5, + 'R': 5, + 'S': 5, + 'T': 5, + 'U': 5, + 'V': 5, + 'W': 5, + 'X': 5, + 'Y': 5, + 'Z': 5, + 'b': 5, + 'd': 5, + 'g': 5, + 'h': 5, + 'm': 5, + 'n': 5, + 'p': 5, + 'q': 5, + 'u': 5, + 'v': 5, + 'w': 5, + 'x': 5, + 'y': 5, + 'z': 5, + '0': 5, + '2': 5, + '3': 5, + '4': 5, + '5': 5, + '6': 5, + '7': 5, + '8': 5, + '9': 5, + '?': 5, + '-': 5, + '_': 5, + '+': 5, + '=': 5, + '*': 5, + '/': 5, + '\\': 5, + '@': 5, + '#': 5, + '$': 5, + '%': 5, + '&': 5, + '^': 5, + '~': 5, + '¶': 4, + # Medium characters (4 pixels) + 'J': 5, + 'a': 5, + 'c': 5, + 'e': 5, + 'f': 5, + 'k': 5, + 'o': 5, + 's': 5, + 't': 5, + '<': 4, + '>': 4, + # Narrow characters (3 pixels) + 'I': 3, + '1': 3, + 'l': 3, + 'j': 4, + '(': 3, + ')': 3, + '[': 3, + ']': 3, + '{': 3, + '}': 3, + '°': 3, + '•': 3, + # Very narrow characters (2 pixels) + 'i': 3, + ' ': 1, + '`': 2, + # Single pixel characters + '!': 1, + '.': 1, + ',': 2, + ':': 1, + ';': 2, + "'": 1, + '|': 1, + # Special cases + '"': 3, +} + + +def get_char_width(char): + """Get the display width of a character for proper spacing""" + return char_width.get(char, 5) # Default to 5 if character not found + + +def get_text_width(text): + """Calculate total width of text including character spacing""" + width = 0 + for char in text: + if char in char_width: + width += char_width[char] + 1 # +1 for spacing between characters + else: + width += 6 # Default width + spacing + return max(0, width - 1) # Remove last spacing diff --git a/app/display/fonts/fonts_utils.py b/app/display/fonts/fonts_utils.py index 78fabfa..297e891 100644 --- a/app/display/fonts/fonts_utils.py +++ b/app/display/fonts/fonts_utils.py @@ -1,5 +1,6 @@ from .font_3x5 import font_3x5 from .font_5x7 import font_5x7 +from .font_5x7_opt import font_5x7 as font_5x7_opt from .font_8x8 import font_8x8 from .font_16x16 import font_16x16 from ..emoji.emoji_5x7 import emoji_5x7 @@ -19,6 +20,8 @@ def fonts_meta(font): return fonts_meta_[3] elif font == font_5x7: return fonts_meta_[5] + elif font == font_5x7_opt: + return fonts_meta_[5] elif font == font_8x8: return fonts_meta_[8] elif font == font_16x16: diff --git a/app/display/neopixel_64x64.py b/app/display/neopixel_64x64.py index 45e6108..af7a37e 100644 --- a/app/display/neopixel_64x64.py +++ b/app/display/neopixel_64x64.py @@ -1,13 +1,16 @@ from machine import Pin, RTC from neopixel import NeoPixel from .fonts.fonts_utils import fonts_meta + from .fonts.font_5x7 import font_5x7 -from ..utils.colors import RAINBOW, BLACK +from .fonts.font_5x7_opt import font_5x7 as font_5x7_opt, get_char_width +from ..utils.colors import GRAY, RAINBOW, BLACK, WHITE, LIME from ..utils.utils import ( get_german_timestamp_short, get_datetime_string, get_german_time_ticks, get_german_date_ticks, + number_to_bitarray_msb, ) import time import math @@ -29,7 +32,7 @@ class NeoPixel_64x64(NeoPixel): super().__init__(Pin(pin), self.MATRIX_WIDTH * self.MATRIX_HEIGHT) # Font configuration - self.set_font(font_5x7) + self.set_font(font_5x7_opt) def set_font(self, font): """ @@ -89,7 +92,7 @@ class NeoPixel_64x64(NeoPixel): self.write() - def draw_letter(self, letter, x, y, color): + def draw_letter___obsolet(self, letter, x, y, color): """ Draw a single letter using current font @@ -110,7 +113,42 @@ class NeoPixel_64x64(NeoPixel): else: print(f'oops, letter does not exist in the font -> {letter}') - def draw_text(self, text, x, y, color=RAINBOW[2], spacing=1): + 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 + """ + + # background for the letter (full font size) + [ + # print(xpos, ypos) + self.set_pixel(xpos, ypos, GRAY) + for xpos in range(x, x + 8) # 8 because full with of character representation + for ypos in range(y, y + self.font_height) + ] + + if letter in self.selected_font: + char_data = self.selected_font[letter] + char_width = get_char_width(letter) + + print(letter) + for row in range(self.font_height): + row_data = char_data[row] + print(number_to_bitarray_msb(row_data)) + for col in range(char_width): + # Check if pixel should be lit (MSB first) + # Only check bits within the actual character width + if row_data & (1 << ((char_width - 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___obsolete(self, text, x, y, color=RAINBOW[2], spacing=1): """ Draw text string at specified position @@ -125,6 +163,23 @@ class NeoPixel_64x64(NeoPixel): char_x = x + (idx * (self.font_width + spacing)) self.draw_letter(char, char_x, y, color) + 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 + char_width = get_char_width(char) + current_x += char_width + 1 + def show_hello(self): """Display HELLO with timestamp""" self.clear() @@ -296,6 +351,13 @@ class NeoPixel_64x64(NeoPixel): err += dx y1 += sy + def write_text(self, text: str, xpos: int, line_no: int, color=WHITE) -> None: + """Textausgabe in Zeile line_no""" + self.draw_text( + text, xpos * (self.font_width + 1), line_no * (self.font_height + 1), color + ) # Pixel setzen + self.write() # und anzeigen + # Example usage if __name__ == '__main__': diff --git a/app/utils/utils.py b/app/utils/utils.py index a23ad83..3194236 100644 --- a/app/utils/utils.py +++ b/app/utils/utils.py @@ -1,6 +1,11 @@ import time +def number_to_bitarray_msb(number): + """Convert 8-bit number to bit array (MSB first)""" + return [(number >> i) & 1 for i in range(7, -1, -1)] + + def get_datetime_string(format='full'): """ Return date/time as string with different formats diff --git a/main.py b/main.py index 7495336..f3455d5 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,9 @@ # from machine import Pin, ADC # type: ignore +from app.display.fonts.font_5x7_opt import font_5x7 from app.display.neopixel_64x64 import NeoPixel_64x64 -from app.utils.colors import GREEN, ORANGE, RAINBOW, RED, YELLOW, GOLD +from app.utils.colors import BLUE, GREEN, ORANGE, RAINBOW, RED, WHITE, YELLOW, GOLD from app.utils.system_load import show_system_load +import app.utils.utils as utils from app.web.wlan import Wlan @@ -9,13 +11,11 @@ from app.display.emoji.emoji_8x8 import emoji_8x8 from app.display.emoji.emoji_16x16 import emoji_16x16 from app.display.fonts.font_8x8 import font_8x8 from app.display.fonts.font_16x16 import font_16x16 -# time.sleep(0.1) # Wait for USB to become ready -print('Hello, Pi Pico!') +display = NeoPixel_64x64() def emoji_test(): - display = NeoPixel_64x64() display.clear() # display.set_font(font_8x8) # display.show_hello() @@ -64,22 +64,64 @@ def weather_check(): display.clear() - display.draw_text(f'{str(w_resp.location.name)}', 0, 0, color=RAINBOW[0]) - display.draw_text(f'{str(w_resp.current.temp_c)}°C', 0, 8, color=RAINBOW[1]) - display.draw_text(f'upd: {str(w_resp.current.last_updated)[-5:]}', 0, 16, color=RAINBOW[2]) - display.draw_text(f'cur: {str(w_resp.location.localtime)[-5:]}', 0, 24, color=RAINBOW[3]) + # display.draw_text(f'{str(w_resp.location.name)}', 0, 0, color=RAINBOW[0]) + # display.draw_text(f'{str(w_resp.current.temp_c)}°C', 0, 8, color=RAINBOW[1]) + # display.draw_text(f'upd: {str(w_resp.current.last_updated)[-5:]}', 0, 16, color=RAINBOW[2]) + # display.draw_text(f'cur: {str(w_resp.location.localtime)[-5:]}', 0, 24, color=RAINBOW[3]) + # display.write() - display.write() + display.write_text(f'{str(w_resp.location.name)}', 0, 0, color=RAINBOW[0]) + display.write_text(f'{str(w_resp.current.temp_c)}°C', 0, 1, color=RAINBOW[1]) + display.write_text(f'upd: {str(w_resp.current.last_updated)[-5:]}', 0, 2, color=RAINBOW[2]) + display.write_text(f'cur: {str(w_resp.location.localtime)[-5:]}', 0, 3, color=RAINBOW[3]) - # display.clear_row(2) + display.write_text('ready', 5, 7, color=WHITE) - print(w_resp) except OSError as e: print(f'Error: connection closed - {e}') finally: print('finally done.') +def font_5x7_test() -> None: + alphabet: str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + char_line_1 = alphabet[:11] + char_line_2 = alphabet[11:22] + char_line_3 = alphabet[21:] + num_line = '0123456789' + + display.write_text(num_line, 0, 0) + display.write_text(char_line_1.lower(), 0, 1, YELLOW) + display.write_text(char_line_2.lower(), 0, 2, YELLOW) + display.write_text(char_line_3.lower(), 0, 3, YELLOW) + display.write_text(' !?.,:;\'"-_+=*/\\()', 0, 4, ORANGE) + + +def bit_arrays(): + # def number_to_bitarray_msb(number): + # """Convert 8-bit number to bit array (MSB first)""" + # return [(number >> i) & 1 for i in range(7, -1, -1)] + + # c = 'A' + # print(c) + # [print(utils.number_to_bitarray_msb(num)) for num in font_5x7[c]] + char_row = '¶•' + [display.write_text(c, 0, idx, YELLOW) for idx, c in enumerate(char_row)] + + display.write_text(char_row, 0, len(char_row), ORANGE) + display.write_text('Kiel', 0, 7, BLUE) + + +# c = 'I' +# print(c) +# [print(number_to_bitarray_msb(num)) for num in font_5x7[c]] +# c = 'J' +# print(c) +# [print(number_to_bitarray_msb(num)) for num in font_5x7[c]] + + if __name__ == '__main__': # emoji_test() - weather_check() + # weather_check() + # font_5x7_test() + bit_arrays()