用意されている基本関数を掲載しておきます。
display.poweroff() # ディスプレイ消去 メモリに保存
display.poweron() # ディスプレイ再描画
display.contrast(0) # 暗い
display.contrast(255) # 明るい
display.invert(1) # 白黒反転(白抜き)
display.invert(0) # 白黒反転(ノーマル)
display.show() # バッファの内容を画面描画
基本的な図形描画関数です。
display.fill(0) # 黒く塗りつぶし
display.pixel(0, 10) # (0,10)座標の値(0 or 1)を得る
display.pixel(0, 10, 1) # (0,10)座標に1をセット
display.hline(0, 8, 4, 1) # (0,8)から幅4で水平線
display.vline(0, 8, 4, 1) # (0,8)から幅4で垂直線
display.line(0, 0, 127, 63, 1) # (0,0)-(127,63)に線分
display.rect(10, 10, 107, 43, 1) # (10,10)-(107,43)に矩形描画
display.fill_rect(10, 10, 107, 43, 1) # (10,10)-(107,43)に矩形描画塗りつぶし
display.text('Hello World', 0, 0, 1) # (0,0)にテキスト描画
display.scroll(20, 0) # 20ピクセル右にスクロール
ライブラリに円を描く関数がありませんので追加しておきます。アルゴリズムについての説明はここでは省略します。「ミッチェナー、円、アルゴリズム」等で検索してみてください。
def draw_circle(x,y,rad): #円を描く
cx = rad
cy = 0
d = -2 * rad + 3
while cx >= cy:
display.pixel(x+cx, y+cy, 1)
display.pixel(x-cx, y+cy, 1)
display.pixel(x+cx, y-cy, 1)
display.pixel(x-cx, y-cy, 1)
display.pixel(x+cy, y+cx, 1)
display.pixel(x-cy, y+cx, 1)
display.pixel(x+cy, y-cx, 1)
display.pixel(x-cy, y-cx, 1)
if d >= 0:
cx = cx-1
d = d - 4 * cx
cy = cy + 1
d = d + 4 * cy + 2
def constrain(val, min_val, max_val):
return min(max_val, max(min_val, val))
def fill_circle(x,y,rad): #円を塗りつぶす
cx = rad
cy = 0
d = -2 * rad + 3
while cx >= cy:
display.line(constrain(x+cy,0,127), y+cx, constrain(x-cy,0,127), y+cx,1)
display.line(constrain(x+cx,0,127), y+cy, constrain(x-cx,0,127), y+cy,1)
display.line(constrain(x-cy,0,127), y-cx, constrain(x+cy,0,127), y-cx,1)
display.line(constrain(x-cx,0,127), y-cy, constrain(x+cx,0,127), y-cy,1)
if d >= 0:
cx = cx - 1
d = d - 4*cx
cy = cy+1
d = d + (4*cy+2)
それでは図形描画の関数を使ってロボットの顔を描いてみます。
リスト20-1 oled2.py(部分)
from machine import Pin, I2C
import ssd1306
# using default address 0x3C
i2c = I2C(0, sda=Pin(16), scl=Pin(17))
display = ssd1306.SSD1306_I2C(128, 64, i2c)
def draw_circle(x,y,rad):
# 省略
def constrain(val, min_val, max_val):
return min(max_val, max(min_val, val))
def fill_circle(x,y,rad):
# 省略
draw_circle(32, 22, 20)
fill_circle(32, 22, 12)
draw_circle(96, 22, 20)
fill_circle(96, 22, 12)
display.line(32, 60, 96, 60, 1)
display.show()
これは例ですので、独自のキャラクターにしてみてください。
コメント