https://bit.ly/3g7TGVP
Python遊戲程式設計工作坊v1.1:為修改過的簡報。
電路圖與外殼:為123D設計,外殼的資料也有上傳至Thingiverse。
20210414:為上次上課的檔案
002:為今天設計的遊戲。
gameESP-micropython:遊戲模組(原始來源https://github.com/cheungbx/gameESP-micropython)
https://www.thingiverse.com/thing:4828991
https://easyeda.com/chenwengo/gamepad
先下載「jumping game.zip」
再下載「flappy bird」
下方的互動區被佔住
停止「stop」,即可進入互動模式「>>>」,並於左方顯示ESP8266的檔案。
上次已灌遊戲進去,因此,一連接無法在下方互動區(已佔住),可以按thonny中右方的「stop」即可。
或按「B+L」(最左+最右鍵)來Exit
目前為1.14版,今天更新成1.15版
下載https://micropython.org/download/
選擇ESP8266進入,找到最新韌體
https://micropython.org/download/esp8266/
更新韌體但不抹除程式,下載並選擇esp8266-20210418-v1.15.bin,Erase flash before installing則取消勾選。
打開bike.py
上傳icon資料夾至晶體
執行bike.py
目前晶片中只要有「boot.py」即可,bike.py並未上傳,直接執行即可。
按左鍵→跳
按右鍵→開始遊戲
OLED做顯示設計時(I2C)
資料傳輸只有2條,scl sda,可以串接很多不同的輸入與輸出資料,硬體上有位址,就可以知道資料的傳入與傳出的地方。
d1min要用3.3v比較好,畫面的解析度為128x64。
from machine import Pin,I2C,SPI#基本要匯入的模組
import ssd1306#基本要匯入的模組
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)#pin4 pin5為固定的,配合硬體接線
oled = ssd1306.SSD1306_I2C(128,64, i2c)#此oled的型號就是1306,若買的解析度為128x32,則要修改,oled為自訂的變數名稱,ssd1306.SSD1306_I2C(128,64, i2c)為固定寫法,要看技術手冊
oled.poweron()#打開電源
oled.init_display()#初始化
oled.fill(0)#先通通填成黑色,oled.fill(1)則通通變白色
oled.text("Hello World", 0, 0)#後面的0,0為x,y開始位置
oled.show()#顯示
直接貼上程式碼
用FrameBuffer函數來畫圖
framebuf.FrameBuffer(buffer, width, height, format, stride=width) 其中的format就是要指定為水平或垂直編碼方式。
用水平方法:水平8格2進位→16進位
用垂直方法:垂直8格2進位→16進位
import ssd1306
import framebuf
from machine import I2C, Pin
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
img = [ 0x00, 0x32, 0x49, 0x79, 0x41, 0x3E, 0x00, 0x00 ]
# img =[ 0x38, 0x44, 0x04, 0x34, 0x54, 0x54, 0x38, 0x00 ]
buffer = bytearray(img)#Python的處理是1個byte 1個byte的處理
# online doc
# http://docs.micropython.org/en/latest/library/framebuf.html
fb = framebuf.FrameBuffer(buffer, 8, 8, framebuf.MONO_VLSB)#用垂直編輯VLSB, 8,8是指定大小
# fb = framebuf.FrameBuffer(buffer, 8, 8, framebuf.MONO_HLSB)#用水平編輯HLSB
oled.fill(0)#先清空畫面的命令
oled.blit(fb, 30, 20)#blit為渲染的命令, 並指定顯示的位址30,20
oled.blit(fb, 90, 20)#指定第2個顯示的位置90,20
oled.show()#最後一定要有show的命令
背景會由右向左移動,直接設定圖形為螢幕寬度128的兩倍256,先讓圖形位置在0,53→-4,53→-8,53→…-128,53→再回到→0,53
如何將影像變成碼 LCDAssistant.EXE
//------------------------------------------------------------------------------
// File generated by LCD Assistant
// http://en.radzio.dxp.pl/bitmap_converter/
//------------------------------------------------------------------------------
const unsigned char bg [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x3C, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x07, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x07, 0x80, 0xE0, 0x00, 0x0E, 0x07, 0x7F, 0xFF, 0xC0, 0x1C,
0x78, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x38, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x60, 0x01, 0xF8, 0xA0, 0x00, 0x38, 0xE3,
0x8F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF,
0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x80, 0x07, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x80, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08,
0xC0, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x08, 0x00, 0x00, 0x38, 0x08, 0x04, 0x00, 0x40, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x30,
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00,
0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00
};
上方為給C語言用的,只要複製其中的內容
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x3C, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x07, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x07, 0x80, 0xE0, 0x00, 0x0E, 0x07, 0x7F, 0xFF, 0xC0, 0x1C,
0x78, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x38, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x60, 0x01, 0xF8, 0xA0, 0x00, 0x38, 0xE3,
0x8F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF,
0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x80, 0x07, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x80, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08,
0xC0, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x08, 0x00, 0x00, 0x38, 0x08, 0x04, 0x00, 0x40, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x30,
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00,
0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00
import ssd1306
import framebuf
from machine import I2C, Pin
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
img = [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x3C, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x07, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x07, 0x80, 0xE0, 0x00, 0x0E, 0x07, 0x7F, 0xFF, 0xC0, 0x1C,
0x78, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x38, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x60, 0x01, 0xF8, 0xA0, 0x00, 0x38, 0xE3,
0x8F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF,
0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x80, 0x07, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x80, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08,
0xC0, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x08, 0x00, 0x00, 0x38, 0x08, 0x04, 0x00, 0x40, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x30,
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00,
0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00 ]
# img =[ 0x38, 0x44, 0x04, 0x34, 0x54, 0x54, 0x38, 0x00 ]
buffer = bytearray(img)
# online doc
# http://docs.micropython.org/en/latest/library/framebuf.html
#fb = framebuf.FrameBuffer(buffer, 8, 8, framebuf.MONO_VLSB)
fb = framebuf.FrameBuffer(buffer, 256, 10, framebuf.MONO_HLSB)
oled.fill(0)
#oled.blit(fb, 30, 20)#在哪裡顯示
oled.blit(fb, -10, 53)
oled.show()
from machine import Pin,I2C,SPI
import ssd1306
from time import sleep
import framebuf
pin_left = Pin(12, Pin.IN, Pin.PULL_UP) #D6 GPIO 12
pin_right = Pin(13, Pin.IN, Pin.PULL_UP) #D7 GPIO 13
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
oled = ssd1306.SSD1306_I2C(128,64, i2c)
oled.poweron()
oled.init_display()
oled.fill(0)
oled.show()
#用 dictionary 紀錄背景的座標 x, y 與 framebuffer
bg={}
bg["x"] = 0
bg["y"] = 53
#載入背景圖
fileName = "/icon/bg.bin"
f = open(fileName, 'rb')
buffer=f.read()
f.close()
bg["buf"] = framebuf.FrameBuffer(bytearray(buffer), 256, 10, framebuf.MONO_HLSB)#以字典的方式來顯示動畫,字典為陣列資料。
#用 dictionary 紀錄bike 的座標 x, y 與 framebuffer
bike = {}
bike["x"] = 10
bike["y"] = 33
bike["costume"] = 1
#載入bike 造型圖
fileName = "/icon/bike01.bin"
f = open(fileName, 'rb')
buffer=f.read()
f.close()
bike["fbike01"] = framebuf.FrameBuffer(bytearray(buffer), 40, 25, framebuf.MONO_HLSB)
fileName = "/icon/bike02.bin"
f = open(fileName, 'rb')
buffer=f.read()
f.close()
bike["fbike02"] = framebuf.FrameBuffer(bytearray(buffer), 40, 25, framebuf.MONO_HLSB)
fileName = "/icon/bike03.bin"
f = open(fileName, 'rb')
buffer=f.read()
f.close()
bike["fbike03"] = framebuf.FrameBuffer(bytearray(buffer), 40, 25, framebuf.MONO_HLSB)
fileName = "/icon/bike04.bin"
f = open(fileName, 'rb')
buffer=f.read()
f.close()
bike["fbike04"] = framebuf.FrameBuffer(bytearray(buffer), 40, 35, framebuf.MONO_HLSB)
#用 dictionary 紀錄障礙物圖形的座標 x, y 與 framebuffer
Block={}
Block["x"] = 128
Block["y"] = 42
#載入障礙物圖形
fileName = "/icon/block.bin"
f = open(fileName, 'rb')
buffer=f.read()
f.close()
Block["buf"] = framebuf.FrameBuffer(bytearray(buffer), 16, 16, framebuf.MONO_HLSB)
def draw_bg():
bg["x"]-=4
oled.blit(bg["buf"], bg["x"], bg["y"])
oled.text("s:{}".format(game_stat["score"]),60,2)
if(bg["x"]<=-128):
bg["x"]=0
def draw_bike():
global jump_stat
if jump_stat :
bike["y"] -=6
oled.blit(bike["fbike04"],bike["x"],bike["y"])
if bike["y"] < 0 :
jump_stat = False
bike["y"] =0
else :
bike["y"] +=6
if bike["y"] > 33 :
bike["y"] =33
if bike["costume"]== 1 :
oled.blit(bike["fbike01"],bike["x"],bike["y"])
elif bike["costume"] == 2:
oled.blit(bike["fbike02"],bike["x"],bike["y"])
elif bike["costume"] == 3:
oled.blit(bike["fbike03"],bike["x"],bike["y"])
bike["costume"] += 1
if bike["costume"] == 4:
bike["costume"] = 1
#用 dictionary 紀錄 遊戲狀態
game_stat={}
game_stat["play"]="loading"
game_stat["score"]=0
jump_stat = False
def init_game() :
game_stat["play"]="loading"
game_stat["score"]=0
jump_stat = False
Block["x"] = 128
Block["y"] = 42
bike["x"] = 10
bike["y"] = 33
bike["costume"] = 1
def right_click() :
if pin_right.value() == 0:
if(game_stat["play"]=="ready"):
game_stat["play"]="playing"
elif(game_stat["play"]=="playing"):
game_stat["play"]="pause"
elif(game_stat["play"]=="pause"):
game_stat["play"]="playing"
elif(game_stat["play"]=="gameover"):
init_game()
game_stat["play"]="playing"
jump_stat = False
def left_click():
global jump_stat
if bike["y"] > 25 :
if pin_left.value() == 0 :
jump_stat = True
def draw_block():
Block["x"]-=6
oled.blit(Block["buf"], Block["x"], Block["y"])
if(Block["x"]< 10):
game_stat["score"] +=1
Block["x"]=256
def collision():
if( Block["y"]-bike["y"] <15 and ( -10 <Block["x"]-bike["x"] and Block["x"]-bike["x"] <35 )):
game_stat["play"]="gameover"
sleep(1)
while (True):
oled.fill(0)
right_click()
if game_stat["play"] == "loading" :
oled.text("loading.",10,30)
oled.show()
sleep(1)
oled.text("loading..",10,30)
oled.show()
sleep(1)
oled.text("loading...",10,30)
game_stat["play"] = "ready"
elif game_stat["play"] == "ready" :
oled.text("> play",10,20)
oled.text("< jump",10,40)
elif game_stat["play"]== "pause" :
oled.text("pause...",10,30)
elif game_stat["play"]== "playing" :
draw_bg()
draw_bike()
left_click()
draw_block()
collision()
elif game_stat["play"]== "gameover" :
oled.text("game over",15,15)
oled.text("score:{}".format(game_stat["score"]),15,30)
oled.text("> replay",15,45)
oled.show()
腳踏車動畫1用LCD assistant匯出的檔案
//------------------------------------------------------------------------------
// File generated by LCD Assistant
// http://en.radzio.dxp.pl/bitmap_converter/
//------------------------------------------------------------------------------
const unsigned char bike01 [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0xFF, 0x00, 0x00,
0x04, 0x00, 0x23, 0x00, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x07, 0xFF, 0xE6, 0x00, 0x00, 0x07,
0x00, 0x40, 0x00, 0x00, 0x05, 0x00, 0x70, 0x00, 0x01, 0xE5, 0x80, 0xF3, 0xC0, 0x07, 0xFC, 0x81,
0x9F, 0xF0, 0x1C, 0x0C, 0xC1, 0x38, 0x0C, 0x30, 0x0E, 0x43, 0x6C, 0x04, 0x60, 0x0E, 0x43, 0x6C,
0x06, 0x40, 0x1B, 0x62, 0xC6, 0x02, 0x40, 0x11, 0x36, 0xC3, 0x03, 0xC0, 0x71, 0x1E, 0x81, 0x01,
0xC1, 0xC1, 0xB7, 0x81, 0x81, 0x83, 0x7F, 0xE3, 0x82, 0x41, 0x82, 0xC1, 0xAE, 0x81, 0x81, 0xC1,
0x81, 0xB8, 0x80, 0x03, 0x60, 0x01, 0x00, 0xC0, 0x02, 0x20, 0x03, 0x00, 0x60, 0x06, 0x10, 0x06,
0x00, 0x20, 0x0C, 0x08, 0x1C, 0x00, 0x1C, 0x08, 0x07, 0xF0, 0x00, 0x07, 0xF0,
};
截取其中資料部份,存在文字檔
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0xFF, 0x00, 0x00,
0x04, 0x00, 0x23, 0x00, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x07, 0xFF, 0xE6, 0x00, 0x00, 0x07,
0x00, 0x40, 0x00, 0x00, 0x05, 0x00, 0x70, 0x00, 0x01, 0xE5, 0x80, 0xF3, 0xC0, 0x07, 0xFC, 0x81,
0x9F, 0xF0, 0x1C, 0x0C, 0xC1, 0x38, 0x0C, 0x30, 0x0E, 0x43, 0x6C, 0x04, 0x60, 0x0E, 0x43, 0x6C,
0x06, 0x40, 0x1B, 0x62, 0xC6, 0x02, 0x40, 0x11, 0x36, 0xC3, 0x03, 0xC0, 0x71, 0x1E, 0x81, 0x01,
0xC1, 0xC1, 0xB7, 0x81, 0x81, 0x83, 0x7F, 0xE3, 0x82, 0x41, 0x82, 0xC1, 0xAE, 0x81, 0x81, 0xC1,
0x81, 0xB8, 0x80, 0x03, 0x60, 0x01, 0x00, 0xC0, 0x02, 0x20, 0x03, 0x00, 0x60, 0x06, 0x10, 0x06,
0x00, 0x20, 0x0C, 0x08, 0x1C, 0x00, 0x1C, 0x08, 0x07, 0xF0, 0x00, 0x07, 0xF0,
再用txt-to-byte.EXE 可以將文字轉成.bin檔案,做為程式匯入圖案的方式
例如:載入背景圖
fileName = "/icon/bg.bin"
f = open(fileName, 'rb')
buffer=f.read()
用小畫家畫了一個128x64單色的圖檔。
再用Image2cpp來轉檔 會比較正確
記得要反轉顏色Invert image colors
按「generate code」即可,再複製起來,寫入程式中
import ssd1306
import framebuf
from machine import I2C, Pin
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
img = [0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00,
0x01, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00,
0x01, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00,
0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00,
0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00,
0x00, 0x0f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00,
0x00, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00,
0x00, 0x03, 0xff, 0xfe, 0x00, 0x3f, 0xfe, 0x00, 0x03, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0xff, 0xfe, 0x03, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0c, 0x00,
0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x3c, 0x00,
0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xfe, 0x00,
0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0x00,
0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x03, 0xfe, 0x00,
0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0x00,
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0x00,
0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x1f, 0xff, 0x00,
0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80,
0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80,
0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0,
0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0,
0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0,
0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0,
0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xe0,
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe0,
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0,
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0,
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf8,
0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf8,
0x00, 0x00, 0x00, 0xf8, 0x7f, 0xff, 0xff, 0x8f, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8,
0x00, 0x00, 0x00, 0xf0, 0x7f, 0xff, 0xff, 0x03, 0xff, 0xe0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xfc,
0x00, 0x00, 0x01, 0xf0, 0x3f, 0xff, 0xfe, 0x01, 0xff, 0xe0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc,
0x00, 0x00, 0x01, 0xf0, 0x3f, 0xff, 0xfe, 0x01, 0xff, 0xf0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc,
0x00, 0x00, 0x01, 0xe0, 0x3f, 0xff, 0xfe, 0x01, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfe,
0x00, 0x00, 0x01, 0xe0, 0x3f, 0xff, 0xfe, 0x01, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x01, 0xf0, 0x3f, 0xff, 0xfe, 0x01, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x01, 0xf0, 0x7f, 0xff, 0xfe, 0x01, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x01, 0xf0, 0x7f, 0xff, 0xff, 0x01, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x01, 0xf8, 0xff, 0xff, 0xff, 0x03, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfc,
0x00, 0x00, 0x03, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xf0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf0,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xc0,
0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00]
buffer = bytearray(img)#Python的處理是1個byte 1個byte的處理
fb = framebuf.FrameBuffer(buffer, 128, 64, framebuf.MONO_HLSB)#用水平編輯HLSB
oled.fill(0)#先清空畫面的命令
oled.blit(fb, 0, 0)#blit為渲染的命令, 並指定顯示的位址30,20
oled.show()#最後一定要有show的命令