i2cdriver/python/samples/oled.py

108 lines
2.8 KiB
Python

"""
Example for 128X64OLED Module
Available from multiple vendors, e.g. DIYMall
This example loads the I2CDriver logo onto the display,
and flashes it four times.
"""
import sys
import time
from PIL import Image, ImageChops
from i2cdriver import I2CDriver
SETCONTRAST = 0x81
DISPLAYALLON_RESUME = 0xA4
DISPLAYALLON = 0xA5
NORMALDISPLAY = 0xA6
INVERTDISPLAY = 0xA7
DISPLAYOFF = 0xAE
DISPLAYON = 0xAF
SETDISPLAYOFFSET = 0xD3
SETCOMPINS = 0xDA
SETVCOMDETECT = 0xDB
SETDISPLAYCLOCKDIV = 0xD5
SETPRECHARGE = 0xD9
SETMULTIPLEX = 0xA8
SETLOWCOLUMN = 0x00
SETHIGHCOLUMN = 0x10
SETSTARTLINE = 0x40
MEMORYMODE = 0x20
COLUMNADDR = 0x21
PAGEADDR = 0x22
COMSCANINC = 0xC0
COMSCANDEC = 0xC8
SEGREMAP = 0xA0
CHARGEPUMP = 0x8D
class OLED:
def __init__(self, i2, a = 0x3c):
self.i2 = i2
self.a = a
self.command(DISPLAYOFF)
self.command(SETDISPLAYCLOCKDIV, 0x80) # the suggested ratio 0x80
self.command(SETMULTIPLEX, 0x3f)
self.command(SETDISPLAYOFFSET, 0)
self.command(SETSTARTLINE | 0x0)
self.command(CHARGEPUMP, 0x14)
self.command(MEMORYMODE, 0)
self.command(SEGREMAP | 0x1)
self.command(COMSCANDEC)
self.command(SETCOMPINS, 0x12)
self.command(SETCONTRAST, 0xcf)
self.command(SETVCOMDETECT, 0x40)
self.command(DISPLAYALLON_RESUME)
self.command(NORMALDISPLAY)
self.im = Image.new("1", (128,64), 1)
self.cls()
def command(self, *c):
assert(self.i2.start(self.a, 0))
assert(self.i2.write((0,) + c))
self.i2.stop()
def image(self, im):
for p in range(8):
pr = self.im.crop((0,8*p,128,8*p+8)).transpose(Image.ROTATE_270)
bb = im.crop((0,8*p,128,8*p+8)).transpose(Image.ROTATE_270)
diff = ImageChops.difference(pr, bb)
di = diff.getbbox()
if di is not None:
(x0, y0, x1, y1) = di
self.command(COLUMNADDR)
self.command(y0)
self.command(y1 - 1)
self.command(PAGEADDR)
self.command(p)
self.command(p + 1)
self.i2.start(self.a, 0)
self.i2.write([0x40])
self.i2.write(bb.tobytes()[y0:y1])
self.i2.stop()
self.im = im
self.command(DISPLAYON)
def cls(self):
self.image(Image.new("1", (128,64), 0))
if __name__ == '__main__':
i2 = I2CDriver(sys.argv[1])
d = OLED(i2)
d.image(Image.open("logo.png").convert("1"))
for i in range(4):
d.command(INVERTDISPLAY)
time.sleep(.5)
d.command(NORMALDISPLAY)
time.sleep(.5)