A lightweight 7 segment character generator that allows cutomizable sizing to fit small OLED displays.
All of these tests were run on a HiLetgo ESP32 OLED WiFi Kit ESP-32 using a Thonny editor on a Raspberry 400.
Used with all examples:
import sys import machine from machine import Pin, SoftI2C import ssd1306 import gfx import utime as time from oled7segment import * i2c = SoftI2C(scl=Pin(15), sda=Pin(4)) pin = Pin(16, Pin.OUT) pin.value(0) #set GPIO16 low to reset OLED pin.value(1) #while OLED is running, must set GPIO16 in high oled_width = 128 oled_height = 64 oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c) graphic = gfx.GFX (oled_width, oled_height, oled.pixel) seven_segment = OLED7Segment (graphic) d_t = time.localtime () date_str = '{:02d}-{:02d}'.format (d_t[1], d_t[2]) time_str = '{:02d}:{:02d}'.format (d_t[3], d_t[4])xpos = 0 ypos = 0 seven_segment.set_parameters (digit_size="S", spacing=2) oled.fill (0) seven_segment.display_string (xpos, ypos, "01234567890") ypos += seven_segment.get_character_height () seven_segment.display_string (xpos, ypos, "ABCDEF") ypos += seven_segment.get_character_height () seven_segment.display_string (xpos, ypos, date_str) ypos += seven_segment.get_character_height () seven_segment.display_string (xpos, ypos, time_str) ypos += seven_segment.get_character_height () oled.show ()Line 1: digits only Line 2: hexidecimal characters Line 3: Date with dash (minus sign) Line 4: Time with colon xpos = 0 ypos = 0 seven_segment.set_parameters (digit_size="L") oled.fill (0) xpos += seven_segment.display_string (xpos, ypos, "8") seven_segment.set_parameters (bold=True) seven_segment.display_string (xpos, ypos, "76") oled.show ()1st character, Bold=False 2nd, 3rd characters, Bold=True xpos = 0 ypos = 0 oled.fill (0) seven_segment.set_parameters (digit_size="M", spacing=2) char_height = seven_segment.get_character_height () # save tallest seg xpos += seven_segment.display_string (xpos, ypos, "10") seven_segment.set_parameters (v_segment_length=4, h_segment_length=4) seven_segment.display_string (xpos, ypos, "95") xpos = 0 ypos += char_height + 2 # plus extra spacing seven_segment.set_parameters (bold=True, spacing=2, segment_width=2, v_segment_length=8, h_segment_length=3) seven_segment.display_string (xpos, ypos, "87.6") oled.show ()line 1: Changes the segment lengths Line 2: Tall, narrow segment, usefull for displaying a lot of digits xpos = 0 ypos = 0 seven_segment.set_parameters (digit_size="L",bold=True) oled.fill (0) seven_segment.TOP_seg (xpos, ypos) seven_segment.MID_seg (xpos, ypos) seven_segment.BOT_seg (xpos, ypos) xpos += 40 seven_segment.UR_seg (xpos, ypos) seven_segment.MID_seg (xpos, ypos) seven_segment.LL_seg (xpos, ypos) xpos += 40 seven_segment.UR_seg (xpos, ypos) seven_segment.UL_seg (xpos, ypos) seven_segment.LR_seg (xpos, ypos) seven_segment.LL_seg (xpos, ypos) oled.show ()You can create custom symbols (Klingon?) by calling the individual segment functions. Segment positioning is manual. xpos = 0 ypos = 0 seven_segment.set_parameters (digit_size="S",bold=False) oled.fill (0) for i in range (0, 10) : # repeat 10 times for iteration in range (1, 5) : # 4 different iterations if iteration == 1 : seven_segment.UL_seg (xpos, ypos, 0) seven_segment.TOP_seg (xpos, ypos) seven_segment.UR_seg (xpos, ypos) elif iteration == 2 : seven_segment.TOP_seg (xpos, ypos, 0) seven_segment.UR_seg (xpos, ypos) seven_segment.MID_seg (xpos, ypos) elif iteration == 3 : seven_segment.UR_seg (xpos, ypos, 0) seven_segment.MID_seg (xpos, ypos) seven_segment.UL_seg (xpos, ypos) elif iteration == 4 : seven_segment.MID_seg (xpos, ypos, 0) seven_segment.UL_seg (xpos, ypos) seven_segment.TOP_seg (xpos, ypos) oled.show () time.sleep (0.1) seven_segment.TOP_seg (xpos, ypos) # done seven_segment.UR_seg (xpos, ypos) seven_segment.MID_seg (xpos, ypos) seven_segment.UL_seg (xpos, ypos) oled.show ()Couldn't provide a video. The segments rotate 10 times
Shows that something is happening 


