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
commit 88bbf456c6
28 changed files with 707 additions and 451 deletions

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V1
# * | Date : 2019-06-20
# * | This version: V1.1
# * | Date : 2022-08-10
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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):
logger.debug("e-Paper busy")
@ -132,8 +139,7 @@ class EPD:
def lut(self, lut):
self.send_command(0x32) # WRITE_LUT_REGISTER
for i in range(0, len(lut)):
self.send_data(lut[i])
self.send_data2(lut)
def set_lut(self, lut):
self.lut(lut)
@ -153,15 +159,15 @@ class EPD:
self.send_data(lut[158])
def SetWindows(self, Xstart, Ystart, Xend, Yend):
self.send_command(0x44); # SET_RAM_X_ADDRESS_START_END_POSITION
self.send_data((Xstart>>3) & 0xFF);
self.send_data((Xend>>3) & 0xFF);
self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION
self.send_data((Xstart>>3) & 0xFF)
self.send_data((Xend>>3) & 0xFF)
self.send_command(0x45); # SET_RAM_Y_ADDRESS_START_END_POSITION
self.send_data(Ystart & 0xFF);
self.send_data((Ystart >> 8) & 0xFF);
self.send_data(Yend & 0xFF);
self.send_data((Yend >> 8) & 0xFF);
self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION
self.send_data(Ystart & 0xFF)
self.send_data((Ystart >> 8) & 0xFF)
self.send_data(Yend & 0xFF)
self.send_data((Yend >> 8) & 0xFF)
def SetCursor(self, Xstart, Ystart):
@ -239,10 +245,13 @@ class EPD:
self.set_lut(self.WF_Full_1IN54) # Set lut
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)
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(color)
self.send_data2([color] * self.height * linewidth)
self.TurnOnDisplay()
@ -273,9 +282,7 @@ class EPD:
return
self.send_command(0x24)
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_data2(image)
self.TurnOnDisplay()
def displayPartBaseImage(self, image):
@ -283,14 +290,10 @@ class EPD:
return
self.send_command(0x24)
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_data2(image)
self.send_command(0x26)
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_data2(image)
self.TurnOnDisplay()
@ -299,9 +302,7 @@ class EPD:
return
self.send_command(0x24)
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_data2(image)
self.TurnOnDisplayPart()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V4.0
# * | Date : 2019-06-20
# * | This version: V4.1
# * | Date : 2022-08-10
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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):
logger.debug("e-Paper busy")
@ -134,17 +141,25 @@ class EPD:
return buf
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
if (blackimage != None):
self.send_command(0x24) # DATA_START_TRANSMISSION_1
for i in range(0, int(self.width * self.height / 8)):
self.send_data(blackimage[i])
self.send_data2(blackimage)
# send red data
if (redimage != None):
self.send_command(0x26) # DATA_START_TRANSMISSION_2
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_data(0xF7)
@ -152,13 +167,16 @@ class EPD:
self.ReadBusy()
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
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0xFF)
self.send_data2([0xff] * int(self.height * linewidth))
self.send_command(0x26) # DATA_START_TRANSMISSION_2
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0x00)
self.send_data2([0x00] * int(self.height * linewidth))
self.send_command(0x22) # DISPLAY_REFRESH
self.send_data(0xF7)

View file

@ -104,6 +104,13 @@ class EPD:
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data])
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):
while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy
@ -242,15 +249,8 @@ class EPD:
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)
for j in range(0, self.height):
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
self.send_data2(image)
self.TurnOnDisplay()
def displayPartial(self, image):
@ -259,34 +259,25 @@ class EPD:
else:
linewidth = int(self.width/8) + 1
self.send_command(0x24)
buf = [0x00] * self.height * linewidth
for j in range(0, self.height):
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)
for j in range(0, self.height):
for i in range(0, linewidth):
self.send_data(~image[i + j * linewidth])
self.send_data2(buf)
self.TurnOnDisplayPart()
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)
for j in range(0, self.height):
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
self.send_data2(image)
self.send_command(0x26)
for j in range(0, self.height):
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
self.send_data2(image)
self.TurnOnDisplay()
def Clear(self, color):
@ -296,10 +287,13 @@ class EPD:
linewidth = int(self.width/8) + 1
# logger.debug(linewidth)
self.send_command(0x24)
buf = [0x00] * self.height * linewidth
for j in range(0, self.height):
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)
# for j in range(0, self.height):

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V1.1
# * | Date : 2021-10-30
# * | This version: V1.2
# * | Date : 2022-08-9
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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
@ -336,9 +343,10 @@ class EPD:
self.SetCursor(0, 0)
self.send_command(0x24) # WRITE_RAM
for j in range(0, self.height):
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
# for j in range(0, self.height):
# for i in range(0, linewidth):
# self.send_data(image[i + j * linewidth])
self.send_data2(image)
self.TurnOnDisplayPart()
'''
@ -353,14 +361,10 @@ class EPD:
linewidth = int(self.width/8) + 1
self.send_command(0x24)
for j in range(0, self.height):
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
self.send_data2(image)
self.send_command(0x26)
for j in range(0, self.height):
for i in range(0, linewidth):
self.send_data(image[i + j * linewidth])
self.send_data2(image)
self.TurnOnDisplay()
'''
@ -375,10 +379,7 @@ class EPD:
# logger.debug(linewidth)
self.send_command(0x24)
for j in range(0, self.height):
for i in range(0, linewidth):
self.send_data(color)
self.send_data2([color] * int(self.height * linewidth))
self.TurnOnDisplay()
'''

View file

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

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V1.0
# * | Date : 2020-07-22
# * | This version: V1.1
# * | Date : 2022-08-9
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.delay_ms(200)
epdconfig.digital_write(self.reset_pin, 0)
epdconfig.delay_ms(5)
epdconfig.delay_ms(2)
epdconfig.digital_write(self.reset_pin, 1)
epdconfig.delay_ms(200)
@ -88,6 +88,13 @@ class EPD:
epdconfig.spi_writebyte([data])
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):
logger.debug("e-Paper busy")
@ -152,9 +159,9 @@ class EPD:
def load_lut(self, lut):
self.send_command(0x32)
for i in range(0, 153):
self.send_data(lut[i])
# for i in range(0, 153):
# self.send_data(lut[i])
self.send_data2(lut)
def turnon_display(self):
self.send_command(0x20)
@ -196,10 +203,7 @@ class EPD:
self.send_data(0x01)
self.send_command(0x24)
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_data2(image)
self.turnon_display()
@ -210,15 +214,18 @@ class EPD:
self.send_data(0x27)
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)
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(0xff)
self.send_data2(buf)
self.send_command(0x26)
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(0xff)
self.send_data2(buf)
self.turnon_display()

View file

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

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V1.0
# * | Date : 2020-10-22
# * | This version: V1.1
# * | Date : 2022-08-10
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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
def ReadBusy(self):
@ -148,25 +155,25 @@ class EPD:
Width = self.width / 8
Height = self.height
self.send_command(0x24)
buf = [0x00] * 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)
for i in range(0, int(Width * Height)):
self.send_data(~imagered[i])
self.send_data2(buf)
self.TurnOnDisplay()
# Clear the screen
def Clear(self):
self.send_command(0x24)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0xff)
self.send_data2([0xff] * int(self.width * self.height / 8))
self.send_command(0x26)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0x00)
self.send_data2([0x00] * int(self.width * self.height / 8))
self.TurnOnDisplay()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V1.0
# * | Date : 2020-10-20
# * | This version: V1.1
# * | Date : 2022-08-9
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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):
logger.debug("e-Paper busy")
@ -226,9 +233,7 @@ class EPD:
if (image == None):
return
self.send_command(0x24) # WRITE_RAM
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_data2(image)
self.TurnOnDisplay()
def display_Base(self, image):
@ -236,14 +241,10 @@ class EPD:
return
self.send_command(0x24) # WRITE_RAM
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_data2(image)
self.send_command(0x26) # WRITE_RAM
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_data2(image)
self.TurnOnDisplay()
@ -281,16 +282,17 @@ class EPD:
self.SetCursor(0, 0)
self.send_command(0x24) # WRITE_RAM
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(image[i + j * int(self.width / 8)])
self.send_data2(image)
self.TurnOnDisplay_Partial()
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
for j in range(0, self.height):
for i in range(0, int(self.width / 8)):
self.send_data(color)
self.send_data2([color] * int(self.height * linewidth))
self.TurnOnDisplay()
def sleep(self):

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V1.1
# * | Date : 2020-12-03
# * | This version: V1.2
# * | Date : 2022-08-10
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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):
logger.debug("e-Paper busy")
@ -126,12 +133,10 @@ class EPD:
def display(self, blackimage, ryimage): # ryimage: red or yellow image
if (blackimage != None):
self.send_command(0X10)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(blackimage[i])
self.send_data2(blackimage)
if (ryimage != None):
self.send_command(0X13)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(ryimage[i])
self.send_data2(ryimage)
self.send_command(0x12)
epdconfig.delay_ms(200)
@ -139,11 +144,9 @@ class EPD:
def Clear(self):
self.send_command(0X10)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0xff)
self.send_data2([0xff] * int(self.width * self.height / 8))
self.send_command(0X13)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0xff)
self.send_data2([0xff] * int(self.width * self.height / 8))
self.send_command(0x12)
epdconfig.delay_ms(200)

View file

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

View file

@ -165,7 +165,7 @@ class EPD:
else:
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)
buf_4color = bytearray(image_4color.tobytes('raw'))

View file

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

View file

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

View file

@ -6,8 +6,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V1.0
# * | Date : 2020-11-06
# * | This version: V1.1
# * | Date : 2022-08-10
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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):
logger.debug("e-Paper busy")
@ -95,33 +102,33 @@ class EPD:
self.reset()
self.ReadBusyHigh()
self.send_command(0x00);
self.send_data(0x2f);
self.send_data(0x00);
self.send_command(0x01);
self.send_data(0x37);
self.send_data(0x00);
self.send_data(0x05);
self.send_data(0x05);
self.send_command(0x03);
self.send_data(0x00);
self.send_command(0x06);
self.send_data(0xC7);
self.send_data(0xC7);
self.send_data(0x1D);
self.send_command(0x41);
self.send_data(0x00);
self.send_command(0x50);
self.send_data(0x37);
self.send_command(0x60);
self.send_data(0x22);
self.send_command(0x61);
self.send_data(0x02);
self.send_data(0x80);
self.send_data(0x01);
self.send_data(0x90);
self.send_command(0xE3);
self.send_data(0xAA);
self.send_command(0x00)
self.send_data(0x2f)
self.send_data(0x00)
self.send_command(0x01)
self.send_data(0x37)
self.send_data(0x00)
self.send_data(0x05)
self.send_data(0x05)
self.send_command(0x03)
self.send_data(0x00)
self.send_command(0x06)
self.send_data(0xC7)
self.send_data(0xC7)
self.send_data(0x1D)
self.send_command(0x41)
self.send_data(0x00)
self.send_command(0x50)
self.send_data(0x37)
self.send_command(0x60)
self.send_data(0x22)
self.send_command(0x61)
self.send_data(0x02)
self.send_data(0x80)
self.send_data(0x01)
self.send_data(0x90)
self.send_command(0xE3)
self.send_data(0xAA)
# EPD hardware init end
return 0
@ -189,9 +196,7 @@ class EPD:
self.send_data(0x01)
self.send_data(0x90)
self.send_command(0x10)
for i in range(0, int(EPD_HEIGHT)):
for j in range(0, int(EPD_WIDTH/2)):
self.send_data((image[j+(int(EPD_WIDTH/2)*i)]))
self.send_data2(image)
self.send_command(0x04)#0x04
self.ReadBusyHigh()
self.send_command(0x12)#0x12
@ -207,9 +212,7 @@ class EPD:
self.send_data(0x01)
self.send_data(0x90)
self.send_command(0x10)
for i in range(0, int(EPD_HEIGHT)):
for j in range(0, int(EPD_WIDTH/2)):
self.send_data(0x11)
self.send_data2([0x11] * int(EPD_HEIGHT) * int(EPD_WIDTH/2))
#BLACK 0x00 /// 0000
#WHITE 0x11 /// 0001
#GREEN 0x22 /// 0010

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V4.0
# * | Date : 2019-06-20
# * | This version: V4.1
# * | Date : 2022-08-9
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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):
self.send_command(0x71)
@ -250,73 +257,57 @@ class EPD:
def set_lut(self):
self.send_command(0x20) # vcom
for count in range(0, 36):
self.send_data(self.lut_vcom0[count])
self.send_data2(self.lut_vcom0)
self.send_command(0x21) # ww --
for count in range(0, 36):
self.send_data(self.lut_ww[count])
self.send_data2(self.lut_ww)
self.send_command(0x22) # bw r
for count in range(0, 36):
self.send_data(self.lut_bw[count])
self.send_data2(self.lut_bw)
self.send_command(0x23) # wb w
for count in range(0, 36):
self.send_data(self.lut_bb[count])
self.send_data2(self.lut_bb)
self.send_command(0x24) # bb b
for count in range(0, 36):
self.send_data(self.lut_wb[count])
self.send_data2(self.lut_wb)
def Partial_SetLut(self):
self.send_command(0x20);
for count in range(0, 44):
self.send_data(self.EPD_4IN2_Partial_lut_vcom1[count])
self.send_command(0x20)
self.send_data2(self.EPD_4IN2_Partial_lut_vcom1)
self.send_command(0x21);
for count in range(0, 42):
self.send_data(self.EPD_4IN2_Partial_lut_ww1[count])
self.send_command(0x21)
self.send_data2(self.EPD_4IN2_Partial_lut_ww1)
self.send_command(0x22);
for count in range(0, 42):
self.send_data(self.EPD_4IN2_Partial_lut_bw1[count])
self.send_command(0x22)
self.send_data2(self.EPD_4IN2_Partial_lut_bw1)
self.send_command(0x23);
for count in range(0, 42):
self.send_data(self.EPD_4IN2_Partial_lut_wb1[count])
self.send_command(0x23)
self.send_data2(self.EPD_4IN2_Partial_lut_wb1)
self.send_command(0x24);
for count in range(0, 42):
self.send_data(self.EPD_4IN2_Partial_lut_bb1[count])
self.send_command(0x24)
self.send_data2(self.EPD_4IN2_Partial_lut_bb1)
def Gray_SetLut(self):
self.send_command(0x20) #vcom
for count in range(0, 42):
self.send_data(self.EPD_4IN2_4Gray_lut_vcom[count])
self.send_data2(self.EPD_4IN2_4Gray_lut_vcom)
self.send_command(0x21) #red not use
for count in range(0, 42):
self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
self.send_data2(self.EPD_4IN2_4Gray_lut_ww)
self.send_command(0x22) #bw r
for count in range(0, 42):
self.send_data(self.EPD_4IN2_4Gray_lut_bw[count])
self.send_data2(self.EPD_4IN2_4Gray_lut_bw)
self.send_command(0x23) #wb w
for count in range(0, 42):
self.send_data(self.EPD_4IN2_4Gray_lut_wb[count])
self.send_data2(self.EPD_4IN2_4Gray_lut_wb)
self.send_command(0x24) #bb b
for count in range(0, 42):
self.send_data(self.EPD_4IN2_4Gray_lut_bb[count])
self.send_data2(self.EPD_4IN2_4Gray_lut_bb)
self.send_command(0x25) #vcom
for count in range(0, 42):
self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
self.send_data2(self.EPD_4IN2_4Gray_lut_ww)
def init(self):
@ -504,15 +495,18 @@ class EPD:
return buf
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.set_lut();
self.set_lut()
self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0xFF)
self.send_data2([0xFF] * int(self.width * linewidth))
self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(image[i])
self.send_data2(image)
self.send_command(0x12)
self.ReadBusy()
@ -520,54 +514,72 @@ class EPD:
def EPD_4IN2_PartialDisplay(self, X_start, Y_start, X_end, Y_end, Image):
# EPD_WIDTH = 400
# EPD_HEIGHT = 300
if(EPD_WIDTH % 8 != 0):
Width = int(EPD_WIDTH / 8) + 1;
Width = int(EPD_WIDTH / 8) + 1
else:
Width = int(EPD_WIDTH / 8);
Height = EPD_HEIGHT;
Width = int(EPD_WIDTH / 8)
Height = EPD_HEIGHT
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):
X_end = int(X_end/8)*8+8
X_end = int(X_end/8) + 1
else:
X_end = int(X_end/8)
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
buf = [0x00] * (Y_end - Y_start) * (X_end - X_start)
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)-1); #y-end
self.send_data (0x28);
self.send_data (int(Y_end/256))
self.send_data (int(Y_end%256)-1) #y-end
self.send_data (0x28)
self.send_command(0x10); #writes Old data to SRAM for programming
for j in range(0, int(Y_end - Y_start)):
for i in range(0, int(X_end/8) - int(X_start/8)):
self.send_data(self.DATA[(Y_start + j)*Width + int(X_start/8) + i]);
for j in range(0, Y_end - Y_start):
for i in range(0, X_end - X_start):
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.
for j in range(0, int(Y_end - Y_start)):
for i in range(0, int(X_end/8) - int(X_start/8)):
self.send_data(~Image[(Y_start + j)*Width + int(X_start/8) + i]);
self.DATA[(Y_start + j)*Width + int(X_start/8) + i] = ~Image[(Y_start + j)*Width + int(X_start/8) + i]
for j in range(0, Y_end - Y_start):
for i in range(0, X_end - X_start):
buf[j * (X_end - X_start) + i] = ~Image[(Y_start + j)*Width + X_start + 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!!!
self.ReadBusy()
def display_4Gray(self, image):
self.send_command(0x92);
self.set_lut();
self.set_lut()
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
temp3=0
for j in range(0, 2):
@ -597,7 +609,8 @@ class EPD:
if(j!=1 or k!=1):
temp3 <<= 1
temp1 <<= 2
self.send_data(temp3)
buf[i] = temp3
self.send_data2(buf)
self.send_command(0x13)
@ -626,11 +639,12 @@ class EPD:
elif(temp2 == 0x80):
temp3 |= 0x00 #gray1
else: #0x40
temp3 |= 0x01 #gray2
temp3 |= 0x01 #gray2
if(j!=1 or k!=1):
temp3 <<= 1
temp1 <<= 2
self.send_data(temp3)
buf[i] = temp3
self.send_data2(buf)
self.Gray_SetLut()
self.send_command(0x12)
@ -639,13 +653,16 @@ class EPD:
# pass
def Clear(self):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0xFF)
self.send_data2([0xff] * int(self.height * linewidth))
self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0xFF)
self.send_data2([0xff] * int(self.height * linewidth))
self.send_command(0x12)
self.ReadBusy()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V4.0
# * | Date : 2019-06-20
# * | This version: V4.1
# * | Date : 2022-08-10
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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):
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
self.send_command(0x71);
self.send_command(0x71)
epdconfig.delay_ms(20)
logger.debug("e-Paper busy release")
@ -114,38 +121,39 @@ class EPD:
def display(self, imageblack, imagered):
self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(imageblack[i])
self.send_data2(imageblack)
self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(imagered[i])
self.send_data2(imagered)
self.send_command(0x12)
epdconfig.delay_ms(20)
self.ReadBusy()
def Clear(self):
if self.width%8 == 0:
linewidth = int(self.width/8)
else:
linewidth = int(self.width/8) + 1
self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0xFF)
self.send_data2([0xff] * int(self.height * linewidth))
self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0xFF)
self.send_data2([0xff] * int(self.height * linewidth))
self.send_command(0x12)
epdconfig.delay_ms(20)
self.ReadBusy()
def sleep(self):
self.send_command(0X50);
self.send_data(0xf7); #border floating
self.send_command(0X50)
self.send_data(0xf7) #border floating
self.send_command(0X02); #power off
self.ReadBusy(); #waiting for the electronic paper IC to release the idle signal
self.send_command(0X07); #deep sleep
self.send_data(0xA5);
self.send_command(0X02) #power off
self.ReadBusy() #waiting for the electronic paper IC to release the idle signal
self.send_command(0X07) #deep sleep
self.send_data(0xA5)
epdconfig.delay_ms(2000)
epdconfig.module_exit()

View file

@ -80,7 +80,8 @@ class EPD:
epdconfig.spi_writebyte([data])
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.cs_pin, 0)
epdconfig.spi_writebyte2(data)
@ -177,7 +178,7 @@ class EPD:
self.send_data(0xC0)
self.send_command(0x10)
self.send_data_bulk(image)
self.send_data2(image)
self.send_command(0x04) #0x04
self.ReadBusyHigh()
self.send_command(0x12) #0x12
@ -196,7 +197,7 @@ class EPD:
# Set all pixels to white
buf = [0x11] * int(self.width * self.height / 2)
self.send_data_bulk(buf)
self.send_data2(buf)
self.send_command(0x04) #0x04
self.ReadBusyHigh()

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V1.0
# * | Date : 2020-12-09
# * | This version: V1.1
# * | Date : 2022-08-10
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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):
logger.debug("e-Paper busy")
@ -140,21 +147,20 @@ class EPD:
return buf
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)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0x00)
self.send_data2([0x00] * int(self.width * self.height / 8))
self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(~image[i])
self.send_data2(buf)
self.TurnOnDisplay()
def Clear(self):
self.send_command(0x10)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0x00)
self.send_data2([0x00] * int(self.width * self.height / 8))
self.send_command(0x13)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0x00)
self.send_data2([0x00] * int(self.width * self.height / 8))
self.TurnOnDisplay()
def sleep(self):

View file

@ -4,8 +4,8 @@
# * | Function : Electronic paper driver
# * | Info :
# *----------------
# * | This version: V1.0
# * | Date : 2020-07-04
# * | This version: V1.1
# * | Date : 2022-08-10
# # | Info : python demo
# -----------------------------------------------------------------------------
# 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.spi_writebyte([data])
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):
logger.debug("e-Paper busy")
@ -137,14 +144,16 @@ class EPD:
return buf
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):
self.send_command(0X10)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(imageblack[i])
self.send_data2(imageblack)
if (imagered != None):
self.send_command(0X13)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(~imagered[i])
self.send_data2(buf)
self.send_command(0x12)
epdconfig.delay_ms(200)
@ -152,11 +161,9 @@ class EPD:
def Clear(self):
self.send_command(0X10)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0xff)
self.send_data2([0xFF] * int(self.width * self.height / 8))
self.send_command(0X13)
for i in range(0, int(self.width * self.height / 8)):
self.send_data(0x00)
self.send_data2([0x00] * int(self.width * self.height / 8))
self.send_command(0x12)
epdconfig.delay_ms(200)

View file

@ -4,8 +4,8 @@
# * | Function : Hardware underlying interface
# * | Info :
# *----------------
# * | This version: V1.0
# * | Date : 2019-06-21
# * | This version: V1.1
# * | Date : 2022-08-10
# * | Info :
# ******************************************************************************
# Permission is hereby granted, free of charge, to any person obtaining a copy
@ -29,6 +29,7 @@
import os
import logging
from ossaudiodev import SOUND_MIXER_SPEAKER
import sys
import time
@ -127,6 +128,10 @@ class JetsonNano:
def spi_writebyte(self, data):
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):
self.GPIO.setmode(self.GPIO.BCM)
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])
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'):
implementation = RaspberryPi()
elif os.path.exists('/sys/bus/platform/drivers/gpio-x3'):
implementation = SunriseX3()
else:
implementation = JetsonNano()