Add Sunrise x3 Pi Python program, modify some programs to speed up data transfer.

This commit is contained in:
SSYYL 2022-08-15 11:14:27 +08:00
parent 979184d047
commit 88bbf456c6
28 changed files with 709 additions and 453 deletions

View file

@ -30,29 +30,29 @@ try:
font18 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 18) font18 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 18)
font30 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 40) font30 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 40)
# # The Sunrise X3 PI is a bit problematic to use
# Drawing on the image # # Drawing on the image
logging.info("1.Drawing on the image...") # logging.info("1.Drawing on the image...")
Himage = Image.new('RGB', (epd.width, epd.height), 0xffffff) # Himage = Image.new('RGB', (epd.width, epd.height), 0xffffff)
draw = ImageDraw.Draw(Himage) # draw = ImageDraw.Draw(Himage)
draw.text((5, 0), 'hello world', font = font18, fill = epd.RED) # draw.text((5, 0), 'hello world', font = font18, fill = epd.RED)
draw.text((5, 20), '1.64inch e-Paper', font = font18, fill = epd.YELLOW) # draw.text((5, 20), '1.64inch e-Paper', font = font18, fill = epd.YELLOW)
draw.text((5, 40), u'微雪电子', font = font30, fill = epd.BLACK) # draw.text((5, 40), u'微雪电子', font = font30, fill = epd.BLACK)
draw.line((5, 90, 45, 160), fill = epd.RED) # draw.line((5, 90, 45, 160), fill = epd.RED)
draw.line((45, 90, 5, 160), fill = epd.YELLOW) # draw.line((45, 90, 5, 160), fill = epd.YELLOW)
draw.rectangle((5, 90, 45, 160), outline = epd.BLACK) # draw.rectangle((5, 90, 45, 160), outline = epd.BLACK)
draw.rectangle((55, 90, 95, 160), fill = epd.BLACK) # draw.rectangle((55, 90, 95, 160), fill = epd.BLACK)
draw.arc((115, 90, 150, 125), 0, 360, fill = epd.BLACK) # draw.arc((115, 90, 150, 125), 0, 360, fill = epd.BLACK)
draw.chord((115, 130, 150, 165), 0, 360, fill = epd.BLACK) # draw.chord((115, 130, 150, 165), 0, 360, fill = epd.BLACK)
epd.display(epd.getbuffer(Himage)) # epd.display(epd.getbuffer(Himage))
time.sleep(3) # time.sleep(3)
# read bmp file # # read bmp file
logging.info("3.read bmp file") # logging.info("3.read bmp file")
Himage = Image.open(os.path.join(picdir, '1.64inch-1.bmp')) # Himage = Image.open(os.path.join(picdir, '1.64inch-1.bmp'))
epd.display(epd.getbuffer(Himage)) # epd.display(epd.getbuffer(Himage))
time.sleep(3) # time.sleep(3)
logging.info("3.read bmp file") logging.info("3.read bmp file")
Himage = Image.open(os.path.join(picdir, '1.64inch-2.bmp')) Himage = Image.open(os.path.join(picdir, '1.64inch-2.bmp'))

View file

@ -22,7 +22,7 @@ try:
epd = epd2in13d.EPD() epd = epd2in13d.EPD()
logging.info("init and Clear") logging.info("init and Clear")
epd.init() epd.init()
epd.Clear(0xFF) epd.Clear()
font15 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 15) font15 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 15)
font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24) font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)
@ -60,7 +60,7 @@ try:
# partial update # partial update
logging.info("5.show time...") logging.info("5.show time...")
# epd.init() # epd.init()
# epd.Clear(0xFF) # epd.Clear()
# time_image = Image.new('1', (epd.width, epd.height), 255) # time_image = Image.new('1', (epd.width, epd.height), 255)
# time_draw = ImageDraw.Draw(time_image) # time_draw = ImageDraw.Draw(time_image)
# num = 0 # num = 0
@ -76,7 +76,7 @@ try:
logging.info("Clear...") logging.info("Clear...")
epd.init() epd.init()
epd.Clear(0xFF) epd.Clear()
logging.info("Goto Sleep...") logging.info("Goto Sleep...")
epd.sleep() epd.sleep()

View file

@ -21,7 +21,7 @@ try:
epd = epd2in9d.EPD() epd = epd2in9d.EPD()
logging.info("init and Clear") logging.info("init and Clear")
epd.init() epd.init()
epd.Clear(0xFF) epd.Clear()
font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24) font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)
font18 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 18) font18 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 18)
@ -77,7 +77,7 @@ try:
# # partial update # # partial update
logging.info("5.show time...") logging.info("5.show time...")
epd.init() epd.init()
epd.Clear(0xFF) epd.Clear()
time_image = Image.new('1', (epd.width, epd.height), 255) time_image = Image.new('1', (epd.width, epd.height), 255)
time_draw = ImageDraw.Draw(time_image) time_draw = ImageDraw.Draw(time_image)
@ -94,7 +94,7 @@ try:
epd.init() epd.init()
logging.info("Clear...") logging.info("Clear...")
epd.Clear(0xFF) epd.Clear()
time.sleep(2) time.sleep(2)
logging.info("Goto Sleep...") logging.info("Goto Sleep...")
epd.sleep() epd.sleep()

View file

@ -16,7 +16,7 @@ import traceback
logging.basicConfig(level=logging.DEBUG) logging.basicConfig(level=logging.DEBUG)
try: try:
logging.info("epd2in9 Demo") logging.info("epd3in52 Demo")
epd = epd3in52.EPD() epd = epd3in52.EPD()
logging.info("init and Clear") logging.info("init and Clear")

View file

@ -16,7 +16,7 @@ import traceback
logging.basicConfig(level=logging.DEBUG) logging.basicConfig(level=logging.DEBUG)
try: try:
logging.info("epd1in64g Demo") logging.info("epd7in3g Demo")
BLACK = 0x00 BLACK = 0x00
WHITE = 0x55 WHITE = 0x55

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1 # * | This version: V1.1
# * | Date : 2019-06-20 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -111,6 +111,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -132,8 +139,7 @@ class EPD:
def lut(self, lut): def lut(self, lut):
self.send_command(0x32) # WRITE_LUT_REGISTER self.send_command(0x32) # WRITE_LUT_REGISTER
for i in range(0, len(lut)): self.send_data2(lut)
self.send_data(lut[i])
def set_lut(self, lut): def set_lut(self, lut):
self.lut(lut) self.lut(lut)
@ -153,15 +159,15 @@ class EPD:
self.send_data(lut[158]) self.send_data(lut[158])
def SetWindows(self, Xstart, Ystart, Xend, Yend): def SetWindows(self, Xstart, Ystart, Xend, Yend):
self.send_command(0x44); # SET_RAM_X_ADDRESS_START_END_POSITION self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION
self.send_data((Xstart>>3) & 0xFF); self.send_data((Xstart>>3) & 0xFF)
self.send_data((Xend>>3) & 0xFF); self.send_data((Xend>>3) & 0xFF)
self.send_command(0x45); # SET_RAM_Y_ADDRESS_START_END_POSITION self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION
self.send_data(Ystart & 0xFF); self.send_data(Ystart & 0xFF)
self.send_data((Ystart >> 8) & 0xFF); self.send_data((Ystart >> 8) & 0xFF)
self.send_data(Yend & 0xFF); self.send_data(Yend & 0xFF)
self.send_data((Yend >> 8) & 0xFF); self.send_data((Yend >> 8) & 0xFF)
def SetCursor(self, Xstart, Ystart): def SetCursor(self, Xstart, Ystart):
@ -239,10 +245,13 @@ class EPD:
self.set_lut(self.WF_Full_1IN54) # Set lut self.set_lut(self.WF_Full_1IN54) # Set lut
def Clear(self, color): def Clear(self, color):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2([color] * self.height * linewidth)
for i in range(0, int(self.width / 8)):
self.send_data(color)
self.TurnOnDisplay() self.TurnOnDisplay()
@ -273,9 +282,7 @@ class EPD:
return return
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.TurnOnDisplay() self.TurnOnDisplay()
def displayPartBaseImage(self, image): def displayPartBaseImage(self, image):
@ -283,14 +290,10 @@ class EPD:
return return
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_command(0x26) self.send_command(0x26)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.TurnOnDisplay() self.TurnOnDisplay()
@ -299,9 +302,7 @@ class EPD:
return return
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.TurnOnDisplayPart() self.TurnOnDisplayPart()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V4.0 # * | This version: V4.1
# * | Date : 2019-06-20 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -66,6 +66,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -134,17 +141,25 @@ class EPD:
return buf return buf
def display(self, blackimage, redimage): def display(self, blackimage, redimage):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
buf = [0x00] * self.height * linewidth
# send black data # send black data
if (blackimage != None): if (blackimage != None):
self.send_command(0x24) # DATA_START_TRANSMISSION_1 self.send_command(0x24) # DATA_START_TRANSMISSION_1
for i in range(0, int(self.width * self.height / 8)): self.send_data2(blackimage)
self.send_data(blackimage[i])
# send red data # send red data
if (redimage != None): if (redimage != None):
self.send_command(0x26) # DATA_START_TRANSMISSION_2 self.send_command(0x26) # DATA_START_TRANSMISSION_2
for i in range(0, int(self.width * self.height / 8)): for i in range(0, int(self.width * self.height / 8)):
self.send_data(~redimage[i]) buf[i] = ~redimage[i]
self.send_data2(buf)
self.send_command(0x22) # DISPLAY_REFRESH self.send_command(0x22) # DISPLAY_REFRESH
self.send_data(0xF7) self.send_data(0xF7)
@ -152,13 +167,16 @@ class EPD:
self.ReadBusy() self.ReadBusy()
def Clear(self): def Clear(self):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x24) # DATA_START_TRANSMISSION_1 self.send_command(0x24) # DATA_START_TRANSMISSION_1
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xff] * int(self.height * linewidth))
self.send_data(0xFF)
self.send_command(0x26) # DATA_START_TRANSMISSION_2 self.send_command(0x26) # DATA_START_TRANSMISSION_2
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0x00] * int(self.height * linewidth))
self.send_data(0x00)
self.send_command(0x22) # DISPLAY_REFRESH self.send_command(0x22) # DISPLAY_REFRESH
self.send_data(0xF7) self.send_data(0xF7)

View file

@ -104,6 +104,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy
@ -242,15 +249,8 @@ class EPD:
def display(self, image): def display(self, image):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
self.TurnOnDisplay() self.TurnOnDisplay()
def displayPartial(self, image): def displayPartial(self, image):
@ -259,34 +259,25 @@ class EPD:
else: else:
linewidth = int(self.width/8) + 1 linewidth = int(self.width/8) + 1
self.send_command(0x24) buf = [0x00] * self.height * linewidth
for j in range(0, self.height): for j in range(0, self.height):
for i in range(0, linewidth): for i in range(0, linewidth):
self.send_data(image[i + j * linewidth]) buf[i + j * linewidth] = ~image[i + j * linewidth]
self.send_command(0x24)
self.send_data2(image)
self.send_command(0x26) self.send_command(0x26)
for j in range(0, self.height): self.send_data2(buf)
for i in range(0, linewidth):
self.send_data(~image[i + j * linewidth])
self.TurnOnDisplayPart() self.TurnOnDisplayPart()
def displayPartBaseImage(self, image): def displayPartBaseImage(self, image):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
self.send_command(0x26) self.send_command(0x26)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
self.TurnOnDisplay() self.TurnOnDisplay()
def Clear(self, color): def Clear(self, color):
@ -296,10 +287,13 @@ class EPD:
linewidth = int(self.width/8) + 1 linewidth = int(self.width/8) + 1
# logger.debug(linewidth) # logger.debug(linewidth)
self.send_command(0x24) buf = [0x00] * self.height * linewidth
for j in range(0, self.height): for j in range(0, self.height):
for i in range(0, linewidth): for i in range(0, linewidth):
self.send_data(color) buf[i + j * linewidth] = color
self.send_command(0x24)
self.send_data2(buf)
# self.send_command(0x26) # self.send_command(0x26)
# for j in range(0, self.height): # for j in range(0, self.height):

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.1 # * | This version: V1.2
# * | Date : 2021-10-30 # * | Date : 2022-08-9
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -123,6 +123,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
''' '''
function :Wait until the busy_pin goes LOW function :Wait until the busy_pin goes LOW
@ -336,9 +343,10 @@ class EPD:
self.SetCursor(0, 0) self.SetCursor(0, 0)
self.send_command(0x24) # WRITE_RAM self.send_command(0x24) # WRITE_RAM
for j in range(0, self.height): # for j in range(0, self.height):
for i in range(0, linewidth): # for i in range(0, linewidth):
self.send_data(image[i + j * linewidth]) # self.send_data(image[i + j * linewidth])
self.send_data2(image)
self.TurnOnDisplayPart() self.TurnOnDisplayPart()
''' '''
@ -353,14 +361,10 @@ class EPD:
linewidth = int(self.width/8) + 1 linewidth = int(self.width/8) + 1
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
self.send_command(0x26) self.send_command(0x26)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
self.TurnOnDisplay() self.TurnOnDisplay()
''' '''
@ -375,10 +379,7 @@ class EPD:
# logger.debug(linewidth) # logger.debug(linewidth)
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2([color] * int(self.height * linewidth))
for i in range(0, linewidth):
self.send_data(color)
self.TurnOnDisplay() self.TurnOnDisplay()
''' '''

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V4.0 # * | This version: V4.1
# * | Date : 2019-06-20 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -171,6 +171,13 @@ class EPD:
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy
@ -227,20 +234,15 @@ class EPD:
self.send_data(0x97) self.send_data(0x97)
self.send_command(0x20) # vcom self.send_command(0x20) # vcom
for count in range(0, 44): self.send_data2(self.lut_vcomDC)
self.send_data(self.lut_vcomDC[count])
self.send_command(0x21) # ww -- self.send_command(0x21) # ww --
for count in range(0, 42): self.send_data2(self.lut_ww)
self.send_data(self.lut_ww[count])
self.send_command(0x22) # bw r self.send_command(0x22) # bw r
for count in range(0, 42): self.send_data2(self.lut_bw)
self.send_data(self.lut_bw[count])
self.send_command(0x23) # wb w self.send_command(0x23) # wb w
for count in range(0, 42): self.send_data2(self.lut_wb)
self.send_data(self.lut_wb[count])
self.send_command(0x24) # bb b self.send_command(0x24) # bb b
for count in range(0, 42): self.send_data2(self.lut_bb)
self.send_data(self.lut_bb[count])
def SetPartReg(self): def SetPartReg(self):
self.send_command(0x82) self.send_command(0x82)
@ -249,20 +251,15 @@ class EPD:
self.send_data(0x47) self.send_data(0x47)
self.send_command(0x20) # vcom self.send_command(0x20) # vcom
for count in range(0, 44): self.send_data2(self.lut_vcom1)
self.send_data(self.lut_vcom1[count])
self.send_command(0x21) # ww -- self.send_command(0x21) # ww --
for count in range(0, 42): self.send_data2(self.lut_ww1)
self.send_data(self.lut_ww1[count])
self.send_command(0x22) # bw r self.send_command(0x22) # bw r
for count in range(0, 42): self.send_data2(self.lut_bw1)
self.send_data(self.lut_bw1[count])
self.send_command(0x23) # wb w self.send_command(0x23) # wb w
for count in range(0, 42): self.send_data2(self.lut_wb1)
self.send_data(self.lut_wb1[count])
self.send_command(0x24) # bb b self.send_command(0x24) # bb b
for count in range(0, 42): self.send_data2(self.lut_bb1)
self.send_data(self.lut_bb1[count])
def getbuffer(self, image): def getbuffer(self, image):
# logger.debug("bufsiz = ",int(self.width/8) * self.height) # logger.debug("bufsiz = ",int(self.width/8) * self.height)
@ -292,14 +289,17 @@ class EPD:
if (Image == None): if (Image == None):
return return
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0x00] * self.height * linewidth)
self.send_data(0x00)
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(image)
self.send_data(image[i])
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.SetFullReg() self.SetFullReg()
@ -319,29 +319,40 @@ class EPD:
self.send_data(int(self.height / 256)) self.send_data(int(self.height / 256))
self.send_data(self.height % 256 - 1) self.send_data(self.height % 256 - 1)
self.send_data(0x28) self.send_data(0x28)
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
buf = [0x00] * self.height * linewidth
for i in range(self.height * linewidth):
buf[i] = ~image[i]
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(image)
self.send_data(image[i])
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(buf)
self.send_data(~image[i])
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.SetPartReg() self.SetPartReg()
self.TurnOnDisplay() self.TurnOnDisplay()
def Clear(self, color): def Clear(self):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0x00] * self.height * linewidth)
self.send_data(0x00)
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xFF] * self.height * linewidth)
self.send_data(0xFF)
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.SetFullReg() self.SetFullReg()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.0 # * | This version: V1.1
# * | Date : 2020-07-22 # * | Date : 2022-08-9
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -70,7 +70,7 @@ class EPD:
epdconfig.digital_write(self.reset_pin, 1) epdconfig.digital_write(self.reset_pin, 1)
epdconfig.delay_ms(200) epdconfig.delay_ms(200)
epdconfig.digital_write(self.reset_pin, 0) epdconfig.digital_write(self.reset_pin, 0)
epdconfig.delay_ms(5) epdconfig.delay_ms(2)
epdconfig.digital_write(self.reset_pin, 1) epdconfig.digital_write(self.reset_pin, 1)
epdconfig.delay_ms(200) epdconfig.delay_ms(200)
@ -88,6 +88,13 @@ class EPD:
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -152,9 +159,9 @@ class EPD:
def load_lut(self, lut): def load_lut(self, lut):
self.send_command(0x32) self.send_command(0x32)
for i in range(0, 153): # for i in range(0, 153):
self.send_data(lut[i]) # self.send_data(lut[i])
self.send_data2(lut)
def turnon_display(self): def turnon_display(self):
self.send_command(0x20) self.send_command(0x20)
@ -196,10 +203,7 @@ class EPD:
self.send_data(0x01) self.send_data(0x01)
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.turnon_display() self.turnon_display()
@ -210,15 +214,18 @@ class EPD:
self.send_data(0x27) self.send_data(0x27)
self.send_data(0x01) self.send_data(0x01)
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
buf = [0xff] * int(self.height * linewidth)
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2(buf)
for i in range(0, int(self.width / 8)):
self.send_data(0xff)
self.send_command(0x26) self.send_command(0x26)
for j in range(0, self.height): self.send_data2(buf)
for i in range(0, int(self.width / 8)):
self.send_data(0xff)
self.turnon_display() self.turnon_display()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.0 # * | This version: V1.1
# * | Date : 2020-12-01 # * | Date : 2022-08-9
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -68,6 +68,13 @@ class EPD:
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -149,30 +156,30 @@ class EPD:
def display(self, Blackimage, Redimage): def display(self, Blackimage, Redimage):
if (Blackimage == None or Redimage == None): if (Blackimage == None or Redimage == None):
return return
Redimage_1 = [0x00] * len(Redimage)
for i in range(len(Redimage)) :
Redimage_1[i] = ~Redimage[i]
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2(Blackimage)
for i in range(0, int(self.width / 8)):
self.send_data(Blackimage[i + j * int(self.width / 8)])
self.send_command(0x26) self.send_command(0x26)
for j in range(0, self.height): self.send_data2(Redimage_1)
for i in range(0, int(self.width / 8)):
self.send_data(~Redimage[i + j * int(self.width / 8)])
self.turnon_display() self.turnon_display()
def Clear(self): def Clear(self):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2([0xff] * int(self.height * linewidth))
for i in range(0, int(self.width / 8)):
self.send_data(0xff)
self.send_command(0x26) self.send_command(0x26)
for j in range(0, self.height): self.send_data2([0x00] * int(self.height * linewidth))
for i in range(0, int(self.width / 8)):
self.send_data(0x00)
self.turnon_display() self.turnon_display()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.0 # * | This version: V1.1
# * | Date : 2020-10-22 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -68,6 +68,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
# Read Busy # Read Busy
def ReadBusy(self): def ReadBusy(self):
@ -148,25 +155,25 @@ class EPD:
Width = self.width / 8 Width = self.width / 8
Height = self.height Height = self.height
self.send_command(0x24) buf = [0x00] * int(Width * Height)
for i in range(0, int(Width * Height)): for i in range(0, int(Width * Height)):
self.send_data(imageblack[i]) buf[i] = ~imagered[i]
self.send_command(0x24)
self.send_data2(imageblack)
self.send_command(0x26) self.send_command(0x26)
for i in range(0, int(Width * Height)): self.send_data2(buf)
self.send_data(~imagered[i])
self.TurnOnDisplay() self.TurnOnDisplay()
# Clear the screen # Clear the screen
def Clear(self): def Clear(self):
self.send_command(0x24) self.send_command(0x24)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xff] * int(self.width * self.height / 8))
self.send_data(0xff)
self.send_command(0x26) self.send_command(0x26)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0x00] * int(self.width * self.height / 8))
self.send_data(0x00)
self.TurnOnDisplay() self.TurnOnDisplay()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.0 # * | This version: V1.1
# * | Date : 2020-10-20 # * | Date : 2022-08-9
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -109,6 +109,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -226,9 +233,7 @@ class EPD:
if (image == None): if (image == None):
return return
self.send_command(0x24) # WRITE_RAM self.send_command(0x24) # WRITE_RAM
for j in range(0, self.height): self.send_data2(image)
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.TurnOnDisplay() self.TurnOnDisplay()
def display_Base(self, image): def display_Base(self, image):
@ -236,14 +241,10 @@ class EPD:
return return
self.send_command(0x24) # WRITE_RAM self.send_command(0x24) # WRITE_RAM
for j in range(0, self.height): self.send_data2(image)
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_command(0x26) # WRITE_RAM self.send_command(0x26) # WRITE_RAM
for j in range(0, self.height): self.send_data2(image)
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.TurnOnDisplay() self.TurnOnDisplay()
@ -281,16 +282,17 @@ class EPD:
self.SetCursor(0, 0) self.SetCursor(0, 0)
self.send_command(0x24) # WRITE_RAM self.send_command(0x24) # WRITE_RAM
for j in range(0, self.height): self.send_data2(image)
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.TurnOnDisplay_Partial() self.TurnOnDisplay_Partial()
def Clear(self, color): def Clear(self, color):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x24) # WRITE_RAM self.send_command(0x24) # WRITE_RAM
for j in range(0, self.height): self.send_data2([color] * int(self.height * linewidth))
for i in range(0, int(self.width / 8)):
self.send_data(color)
self.TurnOnDisplay() self.TurnOnDisplay()
def sleep(self): def sleep(self):

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.1 # * | This version: V1.2
# * | Date : 2020-12-03 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -66,6 +66,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -126,12 +133,10 @@ class EPD:
def display(self, blackimage, ryimage): # ryimage: red or yellow image def display(self, blackimage, ryimage): # ryimage: red or yellow image
if (blackimage != None): if (blackimage != None):
self.send_command(0X10) self.send_command(0X10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(blackimage)
self.send_data(blackimage[i])
if (ryimage != None): if (ryimage != None):
self.send_command(0X13) self.send_command(0X13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(ryimage)
self.send_data(ryimage[i])
self.send_command(0x12) self.send_command(0x12)
epdconfig.delay_ms(200) epdconfig.delay_ms(200)
@ -139,11 +144,9 @@ class EPD:
def Clear(self): def Clear(self):
self.send_command(0X10) self.send_command(0X10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xff] * int(self.width * self.height / 8))
self.send_data(0xff)
self.send_command(0X13) self.send_command(0X13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xff] * int(self.width * self.height / 8))
self.send_data(0xff)
self.send_command(0x12) self.send_command(0x12)
epdconfig.delay_ms(200) epdconfig.delay_ms(200)

View file

@ -7,8 +7,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V2.0 # * | This version: V2.1
# * | Date : 2019-06-20 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -30,6 +30,7 @@
# THE SOFTWARE. # THE SOFTWARE.
# #
from distutils.command.build_scripts import build_scripts
import logging import logging
from . import epdconfig from . import epdconfig
from PIL import Image from PIL import Image
@ -129,6 +130,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -199,20 +207,15 @@ class EPD:
self.send_data(0x97) self.send_data(0x97)
self.send_command(0x20) # vcom self.send_command(0x20) # vcom
for count in range(0, 44): self.send_data2(self.lut_vcom1)
self.send_data(self.lut_vcom1[count])
self.send_command(0x21) # ww -- self.send_command(0x21) # ww --
for count in range(0, 42): self.send_data2(self.lut_ww1)
self.send_data(self.lut_ww1[count])
self.send_command(0x22) # bw r self.send_command(0x22) # bw r
for count in range(0, 42): self.send_data2(self.lut_bw1)
self.send_data(self.lut_bw1[count])
self.send_command(0x23) # wb w self.send_command(0x23) # wb w
for count in range(0, 42): self.send_data2(self.lut_wb1)
self.send_data(self.lut_wb1[count])
self.send_command(0x24) # bb b self.send_command(0x24) # bb b
for count in range(0, 42): self.send_data2(self.lut_bb1)
self.send_data(self.lut_bb1[count])
def getbuffer(self, image): def getbuffer(self, image):
# logger.debug("bufsiz = ",int(self.width/8) * self.height) # logger.debug("bufsiz = ",int(self.width/8) * self.height)
@ -240,13 +243,11 @@ class EPD:
def display(self, image): def display(self, image):
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0x00] * int(self.width * self.height / 8))
self.send_data(0x00)
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(image)
self.send_data(image[i])
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.TurnOnDisplay() self.TurnOnDisplay()
@ -263,28 +264,28 @@ class EPD:
self.send_data(int(self.height / 256)) self.send_data(int(self.height / 256))
self.send_data(self.height % 256 - 1) self.send_data(self.height % 256 - 1)
self.send_data(0x28) self.send_data(0x28)
self.send_command(0x10)
buf = [0x00] * int(self.width * self.height / 8)
for i in range(0, int(self.width * self.height / 8)): for i in range(0, int(self.width * self.height / 8)):
self.send_data(image[i]) buf[i] = ~image[i]
self.send_command(0x10)
self.send_data2(image)
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(buf)
self.send_data(~image[i])
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.TurnOnDisplay() self.TurnOnDisplay()
def Clear(self, color): def Clear(self):
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0x00] * int(self.width * self.height / 8))
self.send_data(0x00)
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xFF] * int(self.width * self.height / 8))
self.send_data(0xFF)
epdconfig.delay_ms(10) epdconfig.delay_ms(10)
self.TurnOnDisplay() self.TurnOnDisplay()

View file

@ -165,7 +165,7 @@ class EPD:
else: else:
logger.warning("Invalid image dimensions: %d x %d, expected %d x %d" % (imwidth, imheight, self.width, self.height)) logger.warning("Invalid image dimensions: %d x %d, expected %d x %d" % (imwidth, imheight, self.width, self.height))
# Convert the soruce image to the 7 colors, dithering if needed # Convert the soruce image to the 4 colors, dithering if needed
image_4color = image_temp.convert("RGB").quantize(palette=pal_image) image_4color = image_temp.convert("RGB").quantize(palette=pal_image)
buf_4color = bytearray(image_4color.tobytes('raw')) buf_4color = bytearray(image_4color.tobytes('raw'))

View file

@ -199,7 +199,7 @@ class EPD:
epdconfig.digital_write(self.reset_pin, 1) epdconfig.digital_write(self.reset_pin, 1)
epdconfig.delay_ms(200) epdconfig.delay_ms(200)
epdconfig.digital_write(self.reset_pin, 0) epdconfig.digital_write(self.reset_pin, 0)
epdconfig.delay_ms(5) epdconfig.delay_ms(2)
epdconfig.digital_write(self.reset_pin, 1) epdconfig.digital_write(self.reset_pin, 1)
epdconfig.delay_ms(200) epdconfig.delay_ms(200)
@ -214,6 +214,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -223,24 +230,19 @@ class EPD:
def lut(self) : def lut(self) :
self.send_command(0x20) # vcom self.send_command(0x20) # vcom
for count in range(0 ,42): self.send_data2(self.lut_vcom[:42])
self.send_data(self.lut_vcom[count])
self.send_command(0x21) # ww -- self.send_command(0x21) # ww --
for count in range(0 ,42): self.send_data2(self.lut_ww[:42])
self.send_data(self.lut_ww[count])
self.send_command(0x22) # bw r self.send_command(0x22) # bw r
for count in range(0 ,42): self.send_data2(self.lut_bw[:42])
self.send_data(self.lut_bw[count])
self.send_command(0x23) # wb w self.send_command(0x23) # wb w
for count in range(0 ,42): self.send_data2(self.lut_bb[:42])
self.send_data(self.lut_bb[count])
self.send_command(0x24) # bb b self.send_command(0x24) # bb b
for count in range(0 ,42): self.send_data2(self.lut_wb[:42])
self.send_data(self.lut_wb[count])
def refresh(self): def refresh(self):
self.send_command(0x17) self.send_command(0x17)
@ -251,70 +253,56 @@ class EPD:
# LUT download # LUT download
def lut_GC(self): def lut_GC(self):
self.send_command(0x20); # vcom self.send_command(0x20); # vcom
for count in range(0 ,56): self.send_data2(self.lut_R20_GC[:56])
self.send_data(self.lut_R20_GC[count])
self.send_command(0x21); # red not use self.send_command(0x21); # red not use
for count in range(0 ,42): self.send_data2(self.lut_R21_GC[:42])
self.send_data(self.lut_R21_GC[count])
self.send_command(0x24); # bb b self.send_command(0x24); # bb b
for count in range(0 ,42): self.send_data2(self.lut_R24_GC[:42])
self.send_data(self.lut_R24_GC[count])
if(self.Flag == 0) : if(self.Flag == 0) :
self.send_command(0x22); # bw r self.send_command(0x22); # bw r
for count in range(0 ,56): self.send_data2(self.lut_R22_GC[:56])
self.send_data(self.lut_R22_GC[count])
self.send_command(0x23); # wb w self.send_command(0x23); # wb w
for count in range(0 ,42): self.send_data2(self.lut_R23_GC[:42])
self.send_data(self.lut_R23_GC[count])
self.Flag = 1 self.Flag = 1
else : else :
self.send_command(0x22); # bw r self.send_command(0x22); # bw r
for count in range(0 ,56): self.send_data2(self.lut_R23_GC[:56])
self.send_data(self.lut_R23_GC[count])
self.send_command(0x23); # wb w self.send_command(0x23); # wb w
for count in range(0 ,42): self.send_data2(self.lut_R22_GC[:42])
self.send_data(self.lut_R22_GC[count])
self.Flag = 0 self.Flag = 0
# LUT download # LUT download
def lut_DU(self): def lut_DU(self):
self.send_command(0x20); # vcom self.send_command(0x20); # vcom
for count in range(0 ,56): self.send_data2(self.lut_R20_DU[:56])
self.send_data(self.lut_R20_DU[count])
self.send_command(0x21); # red not use self.send_command(0x21); # red not use
for count in range(0 ,42): self.send_data2(self.lut_R21_DU[:42])
self.send_data(self.lut_R21_DU[count])
self.send_command(0x24); # bb b self.send_command(0x24); # bb b
for count in range(0 ,42): self.send_data2(self.lut_R24_DU[:42])
self.send_data(self.lut_R24_DU[count])
if(self.Flag == 0) : if(self.Flag == 0) :
self.send_command(0x22); # bw r self.send_command(0x22); # bw r
for count in range(0 ,56): self.send_data2(self.lut_R22_DU[:56])
self.send_data(self.lut_R22_DU[count])
self.send_command(0x23); # wb w self.send_command(0x23); # wb w
for count in range(0 ,42): self.send_data2(self.lut_R23_DU[:42])
self.send_data(self.lut_R23_DU[count])
self.Flag = 1 self.Flag = 1
else : else :
self.send_command(0x22); # bw r self.send_command(0x22); # bw r
for count in range(0 ,56): self.send_data2(self.lut_R23_DU[:56])
self.send_data(self.lut_R23_DU[count])
self.send_command(0x23); # wb w self.send_command(0x23); # wb w
for count in range(0 ,42): self.send_data2(self.lut_R22_DU[:42])
self.send_data(self.lut_R22_DU[count])
self.Flag = 0 self.Flag = 0
@ -391,15 +379,14 @@ class EPD:
if (image == None): if (image == None):
return return
self.send_command(0x13); # Transfer new data self.send_command(0x13); # Transfer new data
for i in range(0, self.width * self.height / 8) : self.send_data2(image)
self.send_data(image[i])
def display_NUM(self, NUM): def display_NUM(self, NUM):
# pcnt = 0 # pcnt = 0
self.send_command(0x13); #Transfer new data self.send_command(0x13); #Transfer new data
for column in range(0, self.height): for column in range(0, self.height):
for row in range(0, self.width/8): for row in range(0, self.width//8):
if NUM == self.WHITE: if NUM == self.WHITE:
self.send_data(0xFF) self.send_data(0xFF)
@ -458,8 +445,7 @@ class EPD:
def Clear(self): def Clear(self):
self.send_command(0x13); # Transfer new data self.send_command(0x13); # Transfer new data
for i in range(0, self.width * self.height / 8) : self.send_data2([0xFF] * int(self.width * self.height / 8))
self.send_data(0xFF)
self.lut_GC() self.lut_GC()
self.refresh() self.refresh()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.0 # * | This version: V1.1
# * | Date : 2020-07-16 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -133,6 +133,13 @@ class EPD:
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -235,8 +242,7 @@ class EPD:
def load_lut(self, lut): def load_lut(self, lut):
self.send_command(0x32) self.send_command(0x32)
for i in range(0, 105): self.send_data2(lut)
self.send_data(lut[i])
def getbuffer(self, image): def getbuffer(self, image):
@ -312,6 +318,13 @@ class EPD:
self.send_data(0x00) self.send_data(0x00)
self.send_data(0x00) self.send_data(0x00)
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
buf = [0x00] * self.height * linewidth
self.send_command(0x24) self.send_command(0x24)
for i in range(0, (int)(self.height*(self.width/8))): for i in range(0, (int)(self.height*(self.width/8))):
temp3=0 temp3=0
@ -341,7 +354,8 @@ class EPD:
if(j!=1 or k!=1): if(j!=1 or k!=1):
temp3 <<= 1 temp3 <<= 1
temp1 <<= 2 temp1 <<= 2
self.send_data(temp3) buf[i] = temp3
self.send_data2(buf)
self.send_command(0x4E) self.send_command(0x4E)
self.send_data(0x00) self.send_data(0x00)
@ -379,7 +393,8 @@ class EPD:
if(j!=1 or k!=1): if(j!=1 or k!=1):
temp3 <<= 1 temp3 <<= 1
temp1 <<= 2 temp1 <<= 2
self.send_data(temp3) buf[i] = temp3
self.send_data2(buf)
self.load_lut(self.lut_4Gray_GC) self.load_lut(self.lut_4Gray_GC)
self.send_command(0x22) self.send_command(0x22)
@ -400,9 +415,7 @@ class EPD:
self.send_data(0x00) self.send_data(0x00)
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2(image)
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.load_lut(self.lut_1Gray_A2) self.load_lut(self.lut_1Gray_A2)
self.send_command(0x20) self.send_command(0x20)
@ -417,16 +430,18 @@ class EPD:
self.send_data(0x00) self.send_data(0x00)
self.send_data(0x00) self.send_data(0x00)
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x24) self.send_command(0x24)
for j in range(0, self.height): self.send_data2([0xff] * int(self.height * linewidth))
for i in range(0, int(self.width / 8)):
self.send_data(0xff)
if(mode == 0): #4Gray if(mode == 0): #4Gray
self.send_command(0x26) self.send_command(0x26)
for j in range(0, self.height): self.send_data2([0xff] * int(self.height * linewidth))
for i in range(0, int(self.width / 8)):
self.send_data(0xff)
self.load_lut(self.lut_4Gray_GC) self.load_lut(self.lut_4Gray_GC)
self.send_command(0x22) self.send_command(0x22)
self.send_data(0xC7) self.send_data(0xC7)

View file

@ -6,8 +6,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.0 # * | This version: V1.1
# * | Date : 2020-11-06 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -75,6 +75,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusyHigh(self): def ReadBusyHigh(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -95,33 +102,33 @@ class EPD:
self.reset() self.reset()
self.ReadBusyHigh() self.ReadBusyHigh()
self.send_command(0x00); self.send_command(0x00)
self.send_data(0x2f); self.send_data(0x2f)
self.send_data(0x00); self.send_data(0x00)
self.send_command(0x01); self.send_command(0x01)
self.send_data(0x37); self.send_data(0x37)
self.send_data(0x00); self.send_data(0x00)
self.send_data(0x05); self.send_data(0x05)
self.send_data(0x05); self.send_data(0x05)
self.send_command(0x03); self.send_command(0x03)
self.send_data(0x00); self.send_data(0x00)
self.send_command(0x06); self.send_command(0x06)
self.send_data(0xC7); self.send_data(0xC7)
self.send_data(0xC7); self.send_data(0xC7)
self.send_data(0x1D); self.send_data(0x1D)
self.send_command(0x41); self.send_command(0x41)
self.send_data(0x00); self.send_data(0x00)
self.send_command(0x50); self.send_command(0x50)
self.send_data(0x37); self.send_data(0x37)
self.send_command(0x60); self.send_command(0x60)
self.send_data(0x22); self.send_data(0x22)
self.send_command(0x61); self.send_command(0x61)
self.send_data(0x02); self.send_data(0x02)
self.send_data(0x80); self.send_data(0x80)
self.send_data(0x01); self.send_data(0x01)
self.send_data(0x90); self.send_data(0x90)
self.send_command(0xE3); self.send_command(0xE3)
self.send_data(0xAA); self.send_data(0xAA)
# EPD hardware init end # EPD hardware init end
return 0 return 0
@ -189,9 +196,7 @@ class EPD:
self.send_data(0x01) self.send_data(0x01)
self.send_data(0x90) self.send_data(0x90)
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(EPD_HEIGHT)): self.send_data2(image)
for j in range(0, int(EPD_WIDTH/2)):
self.send_data((image[j+(int(EPD_WIDTH/2)*i)]))
self.send_command(0x04)#0x04 self.send_command(0x04)#0x04
self.ReadBusyHigh() self.ReadBusyHigh()
self.send_command(0x12)#0x12 self.send_command(0x12)#0x12
@ -207,9 +212,7 @@ class EPD:
self.send_data(0x01) self.send_data(0x01)
self.send_data(0x90) self.send_data(0x90)
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(EPD_HEIGHT)): self.send_data2([0x11] * int(EPD_HEIGHT) * int(EPD_WIDTH/2))
for j in range(0, int(EPD_WIDTH/2)):
self.send_data(0x11)
#BLACK 0x00 /// 0000 #BLACK 0x00 /// 0000
#WHITE 0x11 /// 0001 #WHITE 0x11 /// 0001
#GREEN 0x22 /// 0010 #GREEN 0x22 /// 0010

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V4.0 # * | This version: V4.1
# * | Date : 2019-06-20 # * | Date : 2022-08-9
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -241,6 +241,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
self.send_command(0x71) self.send_command(0x71)
@ -250,73 +257,57 @@ class EPD:
def set_lut(self): def set_lut(self):
self.send_command(0x20) # vcom self.send_command(0x20) # vcom
for count in range(0, 36): self.send_data2(self.lut_vcom0)
self.send_data(self.lut_vcom0[count])
self.send_command(0x21) # ww -- self.send_command(0x21) # ww --
for count in range(0, 36): self.send_data2(self.lut_ww)
self.send_data(self.lut_ww[count])
self.send_command(0x22) # bw r self.send_command(0x22) # bw r
for count in range(0, 36): self.send_data2(self.lut_bw)
self.send_data(self.lut_bw[count])
self.send_command(0x23) # wb w self.send_command(0x23) # wb w
for count in range(0, 36): self.send_data2(self.lut_bb)
self.send_data(self.lut_bb[count])
self.send_command(0x24) # bb b self.send_command(0x24) # bb b
for count in range(0, 36): self.send_data2(self.lut_wb)
self.send_data(self.lut_wb[count])
def Partial_SetLut(self): def Partial_SetLut(self):
self.send_command(0x20); self.send_command(0x20)
for count in range(0, 44): self.send_data2(self.EPD_4IN2_Partial_lut_vcom1)
self.send_data(self.EPD_4IN2_Partial_lut_vcom1[count])
self.send_command(0x21); self.send_command(0x21)
for count in range(0, 42): self.send_data2(self.EPD_4IN2_Partial_lut_ww1)
self.send_data(self.EPD_4IN2_Partial_lut_ww1[count])
self.send_command(0x22); self.send_command(0x22)
for count in range(0, 42): self.send_data2(self.EPD_4IN2_Partial_lut_bw1)
self.send_data(self.EPD_4IN2_Partial_lut_bw1[count])
self.send_command(0x23); self.send_command(0x23)
for count in range(0, 42): self.send_data2(self.EPD_4IN2_Partial_lut_wb1)
self.send_data(self.EPD_4IN2_Partial_lut_wb1[count])
self.send_command(0x24); self.send_command(0x24)
for count in range(0, 42): self.send_data2(self.EPD_4IN2_Partial_lut_bb1)
self.send_data(self.EPD_4IN2_Partial_lut_bb1[count])
def Gray_SetLut(self): def Gray_SetLut(self):
self.send_command(0x20) #vcom self.send_command(0x20) #vcom
for count in range(0, 42): self.send_data2(self.EPD_4IN2_4Gray_lut_vcom)
self.send_data(self.EPD_4IN2_4Gray_lut_vcom[count])
self.send_command(0x21) #red not use self.send_command(0x21) #red not use
for count in range(0, 42): self.send_data2(self.EPD_4IN2_4Gray_lut_ww)
self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
self.send_command(0x22) #bw r self.send_command(0x22) #bw r
for count in range(0, 42): self.send_data2(self.EPD_4IN2_4Gray_lut_bw)
self.send_data(self.EPD_4IN2_4Gray_lut_bw[count])
self.send_command(0x23) #wb w self.send_command(0x23) #wb w
for count in range(0, 42): self.send_data2(self.EPD_4IN2_4Gray_lut_wb)
self.send_data(self.EPD_4IN2_4Gray_lut_wb[count])
self.send_command(0x24) #bb b self.send_command(0x24) #bb b
for count in range(0, 42): self.send_data2(self.EPD_4IN2_4Gray_lut_bb)
self.send_data(self.EPD_4IN2_4Gray_lut_bb[count])
self.send_command(0x25) #vcom self.send_command(0x25) #vcom
for count in range(0, 42): self.send_data2(self.EPD_4IN2_4Gray_lut_ww)
self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
def init(self): def init(self):
@ -504,15 +495,18 @@ class EPD:
return buf return buf
def display(self, image): def display(self, image):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x92); self.send_command(0x92);
self.set_lut(); self.set_lut()
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xFF] * int(self.width * linewidth))
self.send_data(0xFF)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(image)
self.send_data(image[i])
self.send_command(0x12) self.send_command(0x12)
self.ReadBusy() self.ReadBusy()
@ -520,54 +514,72 @@ class EPD:
def EPD_4IN2_PartialDisplay(self, X_start, Y_start, X_end, Y_end, Image): def EPD_4IN2_PartialDisplay(self, X_start, Y_start, X_end, Y_end, Image):
# EPD_WIDTH = 400 # EPD_WIDTH = 400
# EPD_HEIGHT = 300 # EPD_HEIGHT = 300
if(EPD_WIDTH % 8 != 0): if(EPD_WIDTH % 8 != 0):
Width = int(EPD_WIDTH / 8) + 1; Width = int(EPD_WIDTH / 8) + 1
else: else:
Width = int(EPD_WIDTH / 8); Width = int(EPD_WIDTH / 8)
Height = EPD_HEIGHT; Height = EPD_HEIGHT
if(X_start % 8 != 0): if(X_start % 8 != 0):
X_start = int(X_start/8)*8+8 X_start = int(X_start/8) + 1
else:
X_start = int(X_start/8)
if(X_end % 8 != 0): if(X_end % 8 != 0):
X_end = int(X_end/8)*8+8 X_end = int(X_end/8) + 1
else:
X_end = int(X_end/8)
buf = [0x00] * (Y_end - Y_start) * (X_end - X_start)
self.send_command(0x91); #This command makes the display enter partial mode
self.send_command(0x90); #resolution setting
self.send_data (int(X_start/256));
self.send_data (int(X_start%256)); #x-start
self.send_data (int(X_end /256));
self.send_data (int(X_end %256)-1); #x-end
self.send_data (int(Y_start/256));
self.send_data (int(Y_start%256)); #y-start self.send_command(0x91) #This command makes the display enter partial mode
self.send_command(0x90) #resolution setting
self.send_data (int(X_start*8/256))
self.send_data (int(X_start*8%256)) #x-start
self.send_data (int(X_end*8 /256))
self.send_data (int(X_end*8 %256)-1) #x-end
self.send_data (int(Y_start/256))
self.send_data (int(Y_start%256)) #y-start
self.send_data (int(Y_end/256)); self.send_data (int(Y_end/256))
self.send_data (int(Y_end%256)-1); #y-end self.send_data (int(Y_end%256)-1) #y-end
self.send_data (0x28); self.send_data (0x28)
self.send_command(0x10); #writes Old data to SRAM for programming self.send_command(0x10); #writes Old data to SRAM for programming
for j in range(0, int(Y_end - Y_start)): for j in range(0, Y_end - Y_start):
for i in range(0, int(X_end/8) - int(X_start/8)): for i in range(0, X_end - X_start):
self.send_data(self.DATA[(Y_start + j)*Width + int(X_start/8) + i]); buf[j * (X_end - X_start) + i] = self.DATA[(Y_start + j)*Width + X_start + i]
self.send_data2(buf)
self.send_command(0x13); #writes New data to SRAM. self.send_command(0x13); #writes New data to SRAM.
for j in range(0, int(Y_end - Y_start)): for j in range(0, Y_end - Y_start):
for i in range(0, int(X_end/8) - int(X_start/8)): for i in range(0, X_end - X_start):
self.send_data(~Image[(Y_start + j)*Width + int(X_start/8) + i]); buf[j * (X_end - X_start) + i] = ~Image[(Y_start + j)*Width + X_start + i]
self.DATA[(Y_start + j)*Width + int(X_start/8) + i] = ~Image[(Y_start + j)*Width + int(X_start/8) + i] self.DATA[(Y_start + j)*Width + X_start + i] = ~Image[(Y_start + j)*Width + X_start/8 + i]
self.send_data2(buf)
self.send_command(0x12); #DISPLAY REFRESH self.send_command(0x12) #DISPLAY REFRESH
epdconfig.delay_ms(200) #The delay here is necessary, 200uS at least!!! epdconfig.delay_ms(200) #The delay here is necessary, 200uS at least!!!
self.ReadBusy() self.ReadBusy()
def display_4Gray(self, image): def display_4Gray(self, image):
self.send_command(0x92); self.send_command(0x92);
self.set_lut(); self.set_lut()
self.send_command(0x10) self.send_command(0x10)
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
buf = [0x00] * self.height * linewidth
for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)): # EPD_WIDTH * EPD_HEIGHT / 4 for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)): # EPD_WIDTH * EPD_HEIGHT / 4
temp3=0 temp3=0
for j in range(0, 2): for j in range(0, 2):
@ -597,7 +609,8 @@ class EPD:
if(j!=1 or k!=1): if(j!=1 or k!=1):
temp3 <<= 1 temp3 <<= 1
temp1 <<= 2 temp1 <<= 2
self.send_data(temp3) buf[i] = temp3
self.send_data2(buf)
self.send_command(0x13) self.send_command(0x13)
@ -626,11 +639,12 @@ class EPD:
elif(temp2 == 0x80): elif(temp2 == 0x80):
temp3 |= 0x00 #gray1 temp3 |= 0x00 #gray1
else: #0x40 else: #0x40
temp3 |= 0x01 #gray2 temp3 |= 0x01 #gray2
if(j!=1 or k!=1): if(j!=1 or k!=1):
temp3 <<= 1 temp3 <<= 1
temp1 <<= 2 temp1 <<= 2
self.send_data(temp3) buf[i] = temp3
self.send_data2(buf)
self.Gray_SetLut() self.Gray_SetLut()
self.send_command(0x12) self.send_command(0x12)
@ -639,13 +653,16 @@ class EPD:
# pass # pass
def Clear(self): def Clear(self):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xff] * int(self.height * linewidth))
self.send_data(0xFF)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xff] * int(self.height * linewidth))
self.send_data(0xFF)
self.send_command(0x12) self.send_command(0x12)
self.ReadBusy() self.ReadBusy()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V4.0 # * | This version: V4.1
# * | Date : 2019-06-20 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -65,12 +65,19 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
self.send_command(0x71); self.send_command(0x71)
while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy
self.send_command(0x71); self.send_command(0x71)
epdconfig.delay_ms(20) epdconfig.delay_ms(20)
logger.debug("e-Paper busy release") logger.debug("e-Paper busy release")
@ -114,38 +121,39 @@ class EPD:
def display(self, imageblack, imagered): def display(self, imageblack, imagered):
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(imageblack)
self.send_data(imageblack[i])
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(imagered)
self.send_data(imagered[i])
self.send_command(0x12) self.send_command(0x12)
epdconfig.delay_ms(20) epdconfig.delay_ms(20)
self.ReadBusy() self.ReadBusy()
def Clear(self): def Clear(self):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xff] * int(self.height * linewidth))
self.send_data(0xFF)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xff] * int(self.height * linewidth))
self.send_data(0xFF)
self.send_command(0x12) self.send_command(0x12)
epdconfig.delay_ms(20) epdconfig.delay_ms(20)
self.ReadBusy() self.ReadBusy()
def sleep(self): def sleep(self):
self.send_command(0X50); self.send_command(0X50)
self.send_data(0xf7); #border floating self.send_data(0xf7) #border floating
self.send_command(0X02); #power off self.send_command(0X02) #power off
self.ReadBusy(); #waiting for the electronic paper IC to release the idle signal self.ReadBusy() #waiting for the electronic paper IC to release the idle signal
self.send_command(0X07); #deep sleep self.send_command(0X07) #deep sleep
self.send_data(0xA5); self.send_data(0xA5)
epdconfig.delay_ms(2000) epdconfig.delay_ms(2000)
epdconfig.module_exit() epdconfig.module_exit()

View file

@ -80,7 +80,8 @@ class EPD:
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
def send_data_bulk(self, data): # send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1) epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data) epdconfig.spi_writebyte2(data)
@ -177,7 +178,7 @@ class EPD:
self.send_data(0xC0) self.send_data(0xC0)
self.send_command(0x10) self.send_command(0x10)
self.send_data_bulk(image) self.send_data2(image)
self.send_command(0x04) #0x04 self.send_command(0x04) #0x04
self.ReadBusyHigh() self.ReadBusyHigh()
self.send_command(0x12) #0x12 self.send_command(0x12) #0x12
@ -196,7 +197,7 @@ class EPD:
# Set all pixels to white # Set all pixels to white
buf = [0x11] * int(self.width * self.height / 2) buf = [0x11] * int(self.width * self.height / 2)
self.send_data_bulk(buf) self.send_data2(buf)
self.send_command(0x04) #0x04 self.send_command(0x04) #0x04
self.ReadBusyHigh() self.ReadBusyHigh()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.0 # * | This version: V1.1
# * | Date : 2020-12-09 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -65,6 +65,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -140,21 +147,20 @@ class EPD:
return buf return buf
def display(self, image): def display(self, image):
buf = [0x00] * int(self.width * self.height / 8)
for i in range(0, int(self.width * self.height / 8)):
buf[i] = ~image[i]
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0x00] * int(self.width * self.height / 8))
self.send_data(0x00)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(buf)
self.send_data(~image[i])
self.TurnOnDisplay() self.TurnOnDisplay()
def Clear(self): def Clear(self):
self.send_command(0x10) self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0x00] * int(self.width * self.height / 8))
self.send_data(0x00)
self.send_command(0x13) self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0x00] * int(self.width * self.height / 8))
self.send_data(0x00)
self.TurnOnDisplay() self.TurnOnDisplay()
def sleep(self): def sleep(self):

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.0 # * | This version: V1.1
# * | Date : 2020-07-04 # * | Date : 2022-08-10
# # | Info : python demo # # | Info : python demo
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -66,6 +66,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.spi_writebyte([data])
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
@ -137,14 +144,16 @@ class EPD:
return buf return buf
def display(self, imageblack, imagered): def display(self, imageblack, imagered):
buf = [0x00] * int(self.width * self.height / 8)
for i in range(0, int(self.width * self.height / 8)):
buf[i] = ~imagered[i]
if (imageblack != None): if (imageblack != None):
self.send_command(0X10) self.send_command(0X10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(imageblack)
self.send_data(imageblack[i])
if (imagered != None): if (imagered != None):
self.send_command(0X13) self.send_command(0X13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2(buf)
self.send_data(~imagered[i])
self.send_command(0x12) self.send_command(0x12)
epdconfig.delay_ms(200) epdconfig.delay_ms(200)
@ -152,11 +161,9 @@ class EPD:
def Clear(self): def Clear(self):
self.send_command(0X10) self.send_command(0X10)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0xFF] * int(self.width * self.height / 8))
self.send_data(0xff)
self.send_command(0X13) self.send_command(0X13)
for i in range(0, int(self.width * self.height / 8)): self.send_data2([0x00] * int(self.width * self.height / 8))
self.send_data(0x00)
self.send_command(0x12) self.send_command(0x12)
epdconfig.delay_ms(200) epdconfig.delay_ms(200)

View file

@ -4,8 +4,8 @@
# * | Function : Hardware underlying interface # * | Function : Hardware underlying interface
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.0 # * | This version: V1.1
# * | Date : 2019-06-21 # * | Date : 2022-08-10
# * | Info : # * | Info :
# ****************************************************************************** # ******************************************************************************
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
@ -29,6 +29,7 @@
import os import os
import logging import logging
from ossaudiodev import SOUND_MIXER_SPEAKER
import sys import sys
import time import time
@ -127,6 +128,10 @@ class JetsonNano:
def spi_writebyte(self, data): def spi_writebyte(self, data):
self.SPI.SYSFS_software_spi_transfer(data[0]) self.SPI.SYSFS_software_spi_transfer(data[0])
def spi_writebyte2(self, data):
for i in range(len(data)):
self.SPI.SYSFS_software_spi_transfer(data[i])
def module_init(self): def module_init(self):
self.GPIO.setmode(self.GPIO.BCM) self.GPIO.setmode(self.GPIO.BCM)
self.GPIO.setwarnings(False) self.GPIO.setwarnings(False)
@ -147,9 +152,71 @@ class JetsonNano:
self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN]) self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN])
class SunriseX3:
# Pin definition
RST_PIN = 17
DC_PIN = 25
CS_PIN = 8
BUSY_PIN = 24
Flag = 0
def __init__(self):
import spidev
import Hobot.GPIO
self.GPIO = Hobot.GPIO
self.SPI = spidev.SpiDev()
def digital_write(self, pin, value):
self.GPIO.output(pin, value)
def digital_read(self, pin):
return self.GPIO.input(pin)
def delay_ms(self, delaytime):
time.sleep(delaytime / 1000.0)
def spi_writebyte(self, data):
self.SPI.writebytes(data)
def spi_writebyte2(self, data):
# for i in range(len(data)):
# self.SPI.writebytes([data[i]])
self.SPI.xfer3(data)
def module_init(self):
if self.Flag == 0 :
self.Flag = 1
self.GPIO.setmode(self.GPIO.BCM)
self.GPIO.setwarnings(False)
self.GPIO.setup(self.RST_PIN, self.GPIO.OUT)
self.GPIO.setup(self.DC_PIN, self.GPIO.OUT)
self.GPIO.setup(self.CS_PIN, self.GPIO.OUT)
self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN)
# SPI device, bus = 0, device = 0
self.SPI.open(2, 0)
self.SPI.max_speed_hz = 4000000
self.SPI.mode = 0b00
return 0
else :
return 0
def module_exit(self):
logger.debug("spi end")
self.SPI.close()
logger.debug("close 5V, Module enters 0 power consumption ...")
self.Flag = 0
self.GPIO.output(self.RST_PIN, 0)
self.GPIO.output(self.DC_PIN, 0)
self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN])
if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'): if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'):
implementation = RaspberryPi() implementation = RaspberryPi()
elif os.path.exists('/sys/bus/platform/drivers/gpio-x3'):
implementation = SunriseX3()
else: else:
implementation = JetsonNano() implementation = JetsonNano()

View file

@ -0,0 +1,47 @@
/*****************************************************************************
* | File : Readme_CN.txt
* | Author : Waveshare team
* | Function : Help with use
* | Info :
*----------------
* | This version: V1.0
* | Date : 2022-08-11
* | Info : 在这里提供一个中文版本的使用文档,以便你的快速使用
******************************************************************************/
这个文件是帮助您使用本例程。
由于我们的墨水屏越来越多,不便于我们的维护,因此把所有的墨水屏程序做成一个工程。
在这里简略的描述本工程的使用:
1.基本信息:
本例程是基于Ubuntu 20.04 Server_20220718系统镜像而开发的
本例程是基于sunrise x3 pi进行开发的例程均在sunrise x3 pi上进行了验证;
本例程使用e-paper Driver HAT模块进行了验证你可以在工程的examples\中查看对应的测试例程;
2.管脚连接:
管脚连接你可以在\lib\epdconfig.py中查看这里也再重述一次
EPD => sunrise x3 pi (BCM)
VCC -> 3.3
GND -> GND
DIN -> 10(SPI0_MOSI)
CLK -> 11(SPI0_SCK)
CS -> 8(SPI0_CS0)
DC -> 25
RST -> 17
BUSY -> 24
3.安装库:
系统已经内置库,无需安装
4.基本使用:
由于本工程是一个综合工程,对于使用而言,你可能需要阅读以下内容:
你可以在examples\目录中查看测试程序
请注意你购买的是哪一款的墨水屏。
栗子1
如果你购买的5.83inch e-paper那么你应该执行命令
sudo python epd_5in83_test.py
栗子2
如果你购买的2.9inch e-paper (B)由于2.9寸的B型和C型是公用的驱动代码
那么你应该执行命令:
sudo python epd_2in9bc_test.py
注意对于epd_1in54_V2_test.py和epd_2in13_V2_test.py请注意你的屏幕背面是否贴有V2标识。

View file

@ -0,0 +1,47 @@
/*****************************************************************************
* | File : Readme_CN.txt
* | Author : Waveshare team
* | Function : Help with use
* | Info :
*----------------
* | This version: V1.0
* | Date : 2022-08-11
* | Info : Here is an English version of the documentation for your quick use.
******************************************************************************/
This file is to help you use this Demo.
Since our ink screens are getting more and more, it is not convenient for our maintenance, so all the ink screen programs are made into one project.
A brief description of the use of this project is here:
1. Basic information:
This routine is developed based on the Ubuntu 20.04 Server_20220718 system image
This routine is developed based on Sunrise X3 PI, routines are verified on Sunrise X3 PI;
This routine is verified using the e-paper Driver HAT module. You can check the corresponding test routine in the examples\ of the project.
2. Pin connection:
Pin connections can be viewed in \lib\epdconfig.py and will be repeated here:
EPD => sunrise x3 pi (BCM)
VCC -> 3.3
GND -> GND
DIN -> 10(SPI0_MOSI)
CLK -> 11(SPI0_SCK)
CS -> 8(SPI0_CS0)
DC -> 25
RST -> 17
BUSY -> 24
3.Installation library
The system has built-in libraries, so you do not need to install them
4. Basic use:
Since this project is a comprehensive project, you may need to read the following for use:
You can view the test program in the examples\ directory.
Please note which ink screen you purchased.
Chestnut 1:
     If you purchased 5.83inch e-paper, then you should execute the command:
     Sudo python epd_5in83_test.py
Chestnut 2:
     If you buy a 2.9inch e-paper (B), since the 2.9-inch Type B and Type C are common driver codes,
     Then you should execute the command:
     Sudo python epd_2in9bc_test.py
    
Note: For epd_1in54_V2_test.py and epd_2in13_V2_test.py, please note that the V2 logo is attached to the back of your screen.