Inky Impression has a stuck column of ~30 pixels

I have a 4" inky impression screen that has been working fine for about a year. I just took it off my Pi earlier and put it back on later today, and now there’s a stuck column of about 30 pixels at the right edge of the screen. When I update the screen, that column does not flash colors (but the border next to it still flashes). Is this a symptom of a broken display? Did I maybe put too much pressure on the edges when installing?

Here’s what it looks like. The entire display is supposed to be random 20x20 squares, but there’s a column on the right which is unchanged.

Do you have the correct size Impression specified in your code? That looks a bit to me like you’re trying to run an example sized for the 5.7" impression on a 4" screen?

2 Likes

Thank you for pointing me in the right direction, that sounds to be exactly it! The problem was multi-faceted:

  • I was using example code I wrote which was using the resolution provided by display.resolution. Even when I manually update the resolution to the size of the 4", I get an error because it thinks the display resolution is the resolution for the 5" model.
  • I recently reinstalled the OS on my Pi and had forgotten to enable I2C, and it seems that prevented the correct EEPROM information from being read, so the display resolution was wrong.
  • On a previous install of the raspberry pi os, I was having trouble getting auto() to read from EEPROM, so I was manually instantiating an Inky7Colour, which seemed to always read the resolution as the resolution for the 5" model.

So, enabling I2C and then switching back to auto() solved things for me here. The display no longer has stuck columns!

For anyone else experiencing this, here’s the example code I wrote which now works:

import random
import RPi.GPIO as GPIO
from inky import auto

from PIL import Image, ImageDraw

display = auto()
GPIO.setmode(GPIO.BCM)

(DISPLAY_WIDTH, DISPLAY_HEIGHT) = display.resolution

print('Display initialized with resolution', DISPLAY_WIDTH, DISPLAY_HEIGHT)

def random_color():
    return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

with Image.new("RGBA", (DISPLAY_WIDTH, DISPLAY_HEIGHT), (255, 255, 255, 255)) as canvas:
    print('Drawing canvas')
    draw = ImageDraw.Draw(canvas)
    for x in range(0, DISPLAY_WIDTH, 20):
        for y in range(0, DISPLAY_HEIGHT, 20):
            draw.rectangle(((x, y), (x + 20, y + 20)), fill=random_color())
    display.set_image(canvas)
    print('Displaying canvas')
    display.show()
2 Likes