From 57d32993976105ee255979f3ade1dcef152cdb6d Mon Sep 17 00:00:00 2001 From: David Glaude Date: Mon, 12 Dec 2022 01:34:48 +0100 Subject: [PATCH 1/5] Add support for 0.49" inch 64x32 I2C Tested on "OLED 0.49 Shield V1.0.0 for LOLIN (WEMOS) D1 mini D32 0.49" inch 64x32 IIC I2C" Based on the issue https://github.com/adafruit/Adafruit_CircuitPython_DisplayIO_SSD1306/issues/20 and all the work from @adamcandy on the non DisplayIO library: https://github.com/adafruit/Adafruit_CircuitPython_SSD1306 --- adafruit_displayio_ssd1306.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/adafruit_displayio_ssd1306.py b/adafruit_displayio_ssd1306.py index 34220d4..1b8f608 100644 --- a/adafruit_displayio_ssd1306.py +++ b/adafruit_displayio_ssd1306.py @@ -21,6 +21,8 @@ * `Monochrome 0.96" 128x64 OLED graphic display `_ * `Monochrome 128x32 SPI OLED graphic display `_ * `Adafruit FeatherWing OLED - 128x32 OLED `_ +* Monochrome 0.49" 64x32 I2C OLED graphic display +* Might work on other sub-128 width display: Dots 72x40, 64x48, 96x16 **Software and Dependencies:** @@ -73,15 +75,22 @@ def __init__( # Patch the init sequence for 32 pixel high displays. init_sequence = bytearray(_INIT_SEQUENCE) height = kwargs["height"] + width = kwargs["width"] if "rotation" in kwargs and kwargs["rotation"] % 180 != 0: height = kwargs["width"] + width = kwargs["height"] init_sequence[16] = height - 1 # patch mux ratio - if kwargs["height"] == 32: + if height == 32 and width == 64: # FIX ME + init_sequence[16] = 64 - 1 # FORCED for 64x32 because it fail with formula + if (height == 32 or height == 16) and (width != 64): init_sequence[25] = 0x02 # patch com configuration + col_offset = 0 if width == 128 else (128 - width) // 2 # https://github.com/micropython/micropython/pull/7411 super().__init__( bus, init_sequence, **kwargs, + colstart=col_offset, + rowstart=col_offset, color_depth=1, grayscale=True, pixels_in_byte_share_row=False, From 8ea81ffea78f8a5bb4f1684a44b3f99ed8515e33 Mon Sep 17 00:00:00 2001 From: David Glaude Date: Mon, 12 Dec 2022 01:45:54 +0100 Subject: [PATCH 2/5] Create displayio_ssd1306_64x32_simpletest.py To simplify testing on those tiny screen. --- .../displayio_ssd1306_64x32_simpletest.py | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 examples/displayio_ssd1306_64x32_simpletest.py diff --git a/examples/displayio_ssd1306_64x32_simpletest.py b/examples/displayio_ssd1306_64x32_simpletest.py new file mode 100644 index 0000000..a0845ad --- /dev/null +++ b/examples/displayio_ssd1306_64x32_simpletest.py @@ -0,0 +1,56 @@ +# SPDX-FileCopyrightText: 2022 David Glaude (based on 2021 ladyada for Adafruit Industries) +# SPDX-License-Identifier: MIT + +""" +This test will initialize the display using displayio and draw a solid white +background, a smaller black rectangle, and some white text. +Customized version of displayio_ssd1306_simpletest.py for 64x32 +""" + +import board +import displayio +import terminalio +from adafruit_display_text import label +import adafruit_displayio_ssd1306 + +displayio.release_displays() + +i2c = board.I2C() # uses board.SCL and board.SDA +# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller + +display_bus = displayio.I2CDisplay(i2c, device_address=0x3C) +display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=64, height=32) + +# Make the display context +splash = displayio.Group() +display.show(splash) + +color_bitmap = displayio.Bitmap(64, 32, 1) +color_palette = displayio.Palette(1) +color_palette[0] = 0xFFFFFF # White + +bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0) +splash.append(bg_sprite) + +## Draw a smaller inner rectangle +inner_bitmap = displayio.Bitmap(62, 30, 1) +inner_palette = displayio.Palette(1) +inner_palette[0] = 0x000000 # Black + +inner_sprite = displayio.TileGrid(inner_bitmap, pixel_shader=inner_palette, x=1, y=1) +splash.append(inner_sprite) + +text = "Hello" +text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=2, y=6) +splash.append(text_area) + +text = "World" +text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=32, y=15) +splash.append(text_area) + +text = "9876543210" +text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=2, y=24) +splash.append(text_area) + +while True: + pass From 43ccd1d8de623721b70673ef5707e287c8add842 Mon Sep 17 00:00:00 2001 From: David Glaude Date: Mon, 12 Dec 2022 16:27:32 +0100 Subject: [PATCH 3/5] Black fixing those files --- adafruit_displayio_ssd1306.py | 6 ++++-- examples/displayio_ssd1306_64x32_simpletest.py | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/adafruit_displayio_ssd1306.py b/adafruit_displayio_ssd1306.py index 1b8f608..edec6b5 100644 --- a/adafruit_displayio_ssd1306.py +++ b/adafruit_displayio_ssd1306.py @@ -80,11 +80,13 @@ def __init__( height = kwargs["width"] width = kwargs["height"] init_sequence[16] = height - 1 # patch mux ratio - if height == 32 and width == 64: # FIX ME + if height == 32 and width == 64: # FIX ME init_sequence[16] = 64 - 1 # FORCED for 64x32 because it fail with formula if (height == 32 or height == 16) and (width != 64): init_sequence[25] = 0x02 # patch com configuration - col_offset = 0 if width == 128 else (128 - width) // 2 # https://github.com/micropython/micropython/pull/7411 + col_offset = ( + 0 if width == 128 else (128 - width) // 2 + ) # https://github.com/micropython/micropython/pull/7411 super().__init__( bus, init_sequence, diff --git a/examples/displayio_ssd1306_64x32_simpletest.py b/examples/displayio_ssd1306_64x32_simpletest.py index a0845ad..91734c2 100644 --- a/examples/displayio_ssd1306_64x32_simpletest.py +++ b/examples/displayio_ssd1306_64x32_simpletest.py @@ -41,15 +41,15 @@ splash.append(inner_sprite) text = "Hello" -text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=2, y=6) +text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=2, y=6) splash.append(text_area) text = "World" -text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=32, y=15) +text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=32, y=15) splash.append(text_area) text = "9876543210" -text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=2, y=24) +text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=2, y=24) splash.append(text_area) while True: From 642d1bd0c65bd814d4202902b3fd2a4f34845456 Mon Sep 17 00:00:00 2001 From: David Glaude Date: Mon, 12 Dec 2022 17:55:40 +0100 Subject: [PATCH 4/5] Making PyLint happy --- adafruit_displayio_ssd1306.py | 4 ++-- examples/displayio_ssd1306_64x32_simpletest.py | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/adafruit_displayio_ssd1306.py b/adafruit_displayio_ssd1306.py index edec6b5..23f454e 100644 --- a/adafruit_displayio_ssd1306.py +++ b/adafruit_displayio_ssd1306.py @@ -22,7 +22,7 @@ * `Monochrome 128x32 SPI OLED graphic display `_ * `Adafruit FeatherWing OLED - 128x32 OLED `_ * Monochrome 0.49" 64x32 I2C OLED graphic display -* Might work on other sub-128 width display: Dots 72x40, 64x48, 96x16 +* Might work on other sub-128 width display: Dots 72x40, 64x48, 96x16 **Software and Dependencies:** @@ -82,7 +82,7 @@ def __init__( init_sequence[16] = height - 1 # patch mux ratio if height == 32 and width == 64: # FIX ME init_sequence[16] = 64 - 1 # FORCED for 64x32 because it fail with formula - if (height == 32 or height == 16) and (width != 64): + if height in (32, 16) and width != 64: init_sequence[25] = 0x02 # patch com configuration col_offset = ( 0 if width == 128 else (128 - width) // 2 diff --git a/examples/displayio_ssd1306_64x32_simpletest.py b/examples/displayio_ssd1306_64x32_simpletest.py index 91734c2..a8ee7cc 100644 --- a/examples/displayio_ssd1306_64x32_simpletest.py +++ b/examples/displayio_ssd1306_64x32_simpletest.py @@ -40,16 +40,16 @@ inner_sprite = displayio.TileGrid(inner_bitmap, pixel_shader=inner_palette, x=1, y=1) splash.append(inner_sprite) -text = "Hello" -text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=2, y=6) +TEXT1 = "Hello" +text_area = label.Label(terminalio.FONT, text=TEXT1, color=0xFFFFFF, x=2, y=6) splash.append(text_area) -text = "World" -text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=32, y=15) +TEXT2 = "World" +text_area = label.Label(terminalio.FONT, text=TEXT2, color=0xFFFFFF, x=32, y=15) splash.append(text_area) -text = "9876543210" -text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=2, y=24) +TEXT3 = "9876543210" +text_area = label.Label(terminalio.FONT, text=TEXT3, color=0xFFFFFF, x=2, y=24) splash.append(text_area) while True: From 0eccec42c4cbcc423164ff67e703676d7c895507 Mon Sep 17 00:00:00 2001 From: David Glaude Date: Thu, 29 Dec 2022 01:17:51 +0100 Subject: [PATCH 5/5] Update adafruit_displayio_ssd1306.py Explain the test for a special resolution. I expected the same formula to work for all board, but at least 32x64 screen have special need. --- adafruit_displayio_ssd1306.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_displayio_ssd1306.py b/adafruit_displayio_ssd1306.py index 23f454e..8aa98b4 100644 --- a/adafruit_displayio_ssd1306.py +++ b/adafruit_displayio_ssd1306.py @@ -80,7 +80,7 @@ def __init__( height = kwargs["width"] width = kwargs["height"] init_sequence[16] = height - 1 # patch mux ratio - if height == 32 and width == 64: # FIX ME + if height == 32 and width == 64: # Make sure this only apply to that resolution init_sequence[16] = 64 - 1 # FORCED for 64x32 because it fail with formula if height in (32, 16) and width != 64: init_sequence[25] = 0x02 # patch com configuration