import epaper import microbmp import time import random import gc epd_resolution = [600, 448] epd_colormap = [ [0x00, 0x00, 0x00], # black [0xff, 0xff, 0xff], # white [0x00, 0xdd, 0x00], # green [0x00, 0x00, 0xee], # blue [0x00, 0xdd, 0x00], # red [0xff, 0xdd, 0x00], # yellow [0xff, 0x88, 0x00], # orange ] images = ["lambo.bmp", "fallout.bmp", "nasa.bmp"] gc.enable() def init_display(): #print("ePaper init ", str(time.localtime())) epd = epaper.EPD_5in65() epd.fill(epd.White) return epd def draw_image(filename): global epd global epd_colormap offset_x = 0 offset_y = 0 color_map = {} def header_callback(header): print("header callback: ", str(header)) global epd_resolution w = header[0] h = header[1] offset_x = (epd_resolution[0] - w)//2 offset_y = (epd_resolution[1] - h)//2 print("offset: ", offset_x, offset_y) def pixel_callback(x, y, color): global epd global epd_colormap # translate color to color index color_index = 0 color_key = color[0] + color[1] << 8 + color[2] << 16 if color_key in color_map: color_index = color_map[color_key] else: # search for the best color best_index = 0 best_score = 1000 for index in range(len(epd_colormap)): c1 = epd_colormap[index] c2 = color score = abs(c1[0] - c2[0]) + abs(c1[1] - c2[1]) + abs(c1[2] - c2[2]) if score < best_score: best_score = score best_index = index if score < 20: break color_index = best_index color_map[color_key] = color_index # hack directly into the 4-bit color buffer instead of: # epd.pixel(offset_x + x, offset_y + y, color_to_index(color)) buffer_pos = (offset_x + x + (offset_y + y) * epd_resolution[0]) buffer_index = buffer_pos // 2 if buffer_pos % 2 == 1: buffer_pos = buffer_pos << 4 epd.buffer[buffer_index] = color_index def pixel_row_callback(x, y, colors): pass #global epd #print("PXL ", str([color, r,g,b, pixel])) #for i in range(len(colors)): # epd.pixel(offset_x + x + i, offset_y + y, color_to_index(colors[i])) print(str(time.localtime()), " BMP ", filename, " loading") epd.fill(epd.White) microbmp.MicroBMP(header_callback=header_callback, data_callback=pixel_callback).load(filename) print(str(time.localtime()), " BMP loaded") epd.EPD_5IN65F_Display(epd.buffer) print(str(time.localtime()), " ePaper printed") # MAIN epd = init_display() while True: for filename in images: epd.EPD_5IN65F_Init() print("TV loading image ", filename) draw_image(filename) epd.Sleep() print("TV showing ", filename) gc.collect() epd.delay_ms(10000)