ESP-WROOM-02でMicroPythonを使い開発(OLED編)

〔ESP32-WROOM-32E〕 〔マイコンのトップに戻る〕
[準備編] [module編] [GPIO編] [通信編] [ファイル編]   [WiFi編] [メール編] [並行処理編] [色々編]


ESP-WROOM-02とOLED SSD1306の定番組み合わせです。

《OLED》

ESP8266のMicroPythonは、"ssd1306"クラスが最初から構築されています、
なのでぇ、I2C接続であれば"from ssd1306 import SSD1306_I2C"を記述するだけで使えます。
私が使ったSSD1306モジュールは、ESP-WROOM-02ボードと一緒に買っておいた
[マイクロファン Yahoo!ショップ]の物です。秋月通商ならこちら、スイッチサイエンスはこちら辺りです

デジタル入出力配線図
電源はUSB接続で、
回路電源はボード出力3.3Vです。
I2CはGPIO4(SDA)/GPIO5(SCL)を使っています
ピンのプルアップ抵抗はチップ内蔵を使います。

とりあえずぅ"Hello World"

@ ESP-WROOM-02ボードをUSBでPCに繋ぎます。
A "PyCharm"を起動させ、作成してあるプロジェクトを開きましょう。
  こちらのCを操作する必要が有ります。(起動時最初のみ設定)
B "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
C ESP8266に書き込みます
  左側プロジェクトウインドウから"main.py"の文字を右クリックをして、[実行(U)'Flash main.py']を
  クリックします。
--------------------------------------------------------------------------------
from machine import I2C, Pin
from ssd1306 import SSD1306_I2C

# I2Cを初期化(I2Cのプルアップ抵抗はチップ内蔵を使う)
Pin(4, Pin.OUT, Pin.PULL_UP)
Pin(5, Pin.OUT, Pin.PULL_UP)
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
# SSD1306の初期化
oled = SSD1306_I2C(128, 64, i2c)

oled.text('Hello World', 0, 0)
oled.show()
--------------------------------------------------------------------------------
framebuf
"ssd1306"クラスを呼び出せばこの"framebuf"クラスも呼び出されます。
ここでは色指定を"白"としていますが、デバイスにより色は異なります。
このクラスで利用できる関数(メソッド)は以下の通りです。

 ・oled.show()
  画面表示の更新。

 ・oled.invert(color)
  画面全体の色を反転させます。
  color = 0は黒色地、1は白色地

 ・oled.fill(color)
  画面全体を塗りつぶします。
  color = 0は黒色、1は白色

 ・oled.pixel(x, y[, color])
  指定した場所に1ドットを描画します。
  "color"を指定しなかった場合は、指定ドット位置の色を返します。
  x   = 1ドット表示を開始する横の座標位置
  y   = 1ドット表示を開始する縦の座標位置
  color = 0は黒色、1は白色

 ・oled.hline(x, y, w, color)
  開始座標位置から指定長さだけ横方向の線を描画します。
  x   = 描画開始位置の横の座標位置
  y   = 描画開始位置の縦の座標位置
  w   = 横方向の線長さを指定
  color = 0は黒色、1は白色

 ・oled.vline(x, y, h, color)
  開始座標位置から指定長さだけ縦方向の線を描画します。
  x   = 描画開始位置の横の座標位置
  y   = 描画開始位置の縦の座標位置
  h   = 縦方向の線長さを指定
  color = 0は黒色、1は白色

 ・oled.line(x_0, y_0, x_1, y_1, color)
  開始座標位置から終了座標位置まで線を描画します。
  x_0  = 描画開始位置の横の座標位置
  y_0  = 描画開始位置の縦の座標位置
  x_1  = 描画終了位置の横の座標位置
  y_1  = 描画終了位置の縦の座標位置
  color = 0は黒色、1は白色

 ・oled.rect(x, y, width, height, color)
  指定大きさの四角形を描画します(塗りつぶさない)。
  x   = 左上の角、描画開始位置の横の座標位置
  y   = 左上の角、描画開始位置の縦の座標位置
  width = 四角形の横の長さを指定
  height = 四角形の縦の長さを指定
  color = 0は黒色、1は白色

 ・oled.fill_rect(x, y, width, height, color)
  指定大きさの四角形を描画します(塗りつぶす)。
  x   = 左上の角、描画開始位置の横の座標位置
  y   = 左上の角、描画開始位置の縦の座標位置
  width = 四角形の横の長さを指定
  height = 四角形の縦の長さを指定
  color = 0は黒色、1は白色

 ・oled.text(string, x, y[, color])
  指定した場所からテキスト文字列を表示させます。
  文字サイズは 8x8 のみらしい。
  string = 表示させる文字列を指定
  x   = 表示を開始する横の座標位置
  y   = 表示を開始する縦の座標位置
  color = 0は黒色、1は白色 (色指定はオプションです)

 ・oled.scroll(delta_x, delta_y)
  フレームバッファ(画面全体)を指定場所(x/y)方向にシフト(コピー)します。
  (シフト前の場所は表示が残っています)
  delta_x= 画面をシフトさせる横の座標位置
  delta_y= 画面をシフトさせる縦の座標位置

 ・oled.blit(fbuf, x, y[, key])
  現在のフレームバッファの上に別のフレームバッファを描画します。
   oled = SSD1306_I2C(128, 64, i2c)
   oled2 = SSD1306_I2C(128, 64, i2c)

   oled.blit(oled2, 0, 0, 0)
   oled.show()
  "Key"は色値である必要があります、値"0"を指定するとoledとoled2は合成表示されます。

シリアルモニター出力の様なサンプル

シリアルモニターの様にシーケンシャルな表示を行います。
これ以降は"SKssd1306.py"を使いますのでESP-WROOM-02ボードに書き込みます。

@ "SKssd1306.py"をダウンロードし解凍します。
A "SKssd1306.py"を"PyCharm"のプロジェクトディレクトリ(ここでは"espTest"を作成している)へ
  移動させます。
B ESP-WROOM-02ボードをUSBでPCに繋ぎます。
C "PyCharm"を起動させ、作成してあるプロジェクトを開きましょう。
  こちらのCを操作する必要が有ります。(起動時最初のみ設定)
D "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
E ESP8266に書き込みます
  ・左側プロジェクトウインドウから"SKssd1306.py"の文字を右クリックをし、
   [実行(U)'Flash SKssd1306.py']を選んでクリックします。
  ・左側プロジェクトウインドウから"main.py"の文字を右クリックをして、
   [実行(U)'Flash main.py']を選んでクリックします。
--------------------------------------------------------------------------------
import time
from machine import I2C, Pin
from ssd1306 import SSD1306_I2C
from SKssd1306 import SSD1306

# I2Cを初期化(I2Cのプルアップ抵抗はチップ内蔵を使う)
Pin(4, Pin.OUT, Pin.PULL_UP)
Pin(5, Pin.OUT, Pin.PULL_UP)
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
# SSD1306の初期化
oled = SSD1306_I2C(128, 64, i2c)
dsp = SSD1306(oled)

cnt = 0
for i in range(100):
      # 毎回10行出力したら画面をクリアします。
      if (cnt % 10) == 0: dsp.print("\f")
      dsp.print("count = " + str(i))
      cnt = cnt + 1
      time.sleep(1)
--------------------------------------------------------------------------------
動作は、"count = xx"を10行表示して画面を消してを100カウントまで繰り返すだけです。

SKssd1306.py
 ・dsp.print(text)
  テキスト文字列を表示します、画面の一番上の行から表示を初め、次の行へと進めて表示していきます
  最下の行でスクロールして表示されるシリアルモニターの様な感じです。
  全画面を消す場合は"dsp.print("\f")"としましょう。

あと少しだけグラフィックを

"framebuf"クラスには"円"を表示する関数(メソッド)がないので作って見ました。
--------------------------------------------------------------------------------
from machine import I2C, Pin
from ssd1306 import SSD1306_I2C
from SKssd1306 import SSD1306

# I2Cを初期化(I2Cのプルアップ抵抗はチップ内蔵を使う)
Pin(4, Pin.OUT, Pin.PULL_UP)
Pin(5, Pin.OUT, Pin.PULL_UP)
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
# SSD1306の初期化
oled = SSD1306_I2C(128, 64, i2c)
dsp = SSD1306(oled)

oled.rect(0, 0, 127, 63, 1)                # 四角形
dsp.circle(63, 31, 31, 1)                  # 円
dsp.Elliptical(63, 31, 63, 5, 20, 1, True) # 楕円(塗りつぶし)
dsp.fill_part(48, 22, 30, 19)              # 四角形エリアの消去
oled.show()
--------------------------------------------------------------------------------
実行結果の写真
 動作は、こんな感じぃ。
 最近体力無くてぇ手がぁ震えるわ!。
 ( f^_^;  |ω・)酔っぱらい )
 外雪だしぃ家の中だしぃもあるよねぇ。
 (フォローして置きましょう。..... (^^;) )

SKssd1306.py
 ・dsp.circle(center_x, center_y, radius, color)
  指定された中心点の位置、半径、及び色で円を描きます(塗りつぶし無し)。
  center_x = 円の中心位置で横方向x座標
  center_y = 円の中心位置で縦方向y座標
  radius  = 円の半径の長さを指定
  color  = 0は黒色、1は白色

 ・dsp.Elliptical(center_x, center_y, diameter , a, b, color, fill=False)
  指定された中心点の位置、半径、及び色で楕円を描きます。
  "a"/"b"の数値を同じにすると円になるのでこれで塗りつぶしましょう。
  center_x = 楕円の中心位置で横方向x座標
  center_y = 楕円の中心位置で縦方向y座標
  diameter = 楕円の直径の長さを指定
  a    = 横方向が小さくなる係数(偏平率)
  b    = 縦方向が小さくなる係数(偏平率)
  color  = 0は黒色、1は白色
  fill    = Trueは塗りつぶす、Falseは塗りつぶさない(デフォルト)

 ・dsp.fill_part(corner_x, corner_y, width, height, color=0)
  指定された四角形エリアを消去します、colorを指定で塗りつぶします
  center_x = 左上の角、消去開始位置の横方向x座標
  center_y = 左上の角、消去開始位置の縦方向y座標
  width  = 消去する四角形エリアの横の長さを指定
  height  = 消去する四角形エリアの縦の長さを指定
  color   = 0は消去(デフォルト)、1は塗りつぶす

XBMビットマップ型式を扱う

コードに記述されたXBMビットマップ型式データを描画します。
(ファイルから直接読み込む事は現状まだ未定です)
8x8キャラクターでのサンプル
--------------------------------------------------------------------------------
from machine import I2C, Pin
from ssd1306 import SSD1306_I2C
from SKssd1306 import SSD1306

# I2Cを初期化(I2Cのプルアップ抵抗はチップ内蔵を使う)
Pin(4, Pin.OUT, Pin.PULL_UP)
Pin(5, Pin.OUT, Pin.PULL_UP)
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
# SSD1306の初期化
oled = SSD1306_I2C(128, 64, i2c)
dsp  = SSD1306(oled)

dt = [0b00000000, \
      0b00000000, \
      0b01100110, \
      0b11100111, \
      0b11111111, \
      0b01111110, \
      0b00111100, \
      0b00011000]

dsp.drawXBM(0,0,8,8,dt)
oled.invert(0)  # 反転させる
oled.show()
--------------------------------------------------------------------------------

JPEG(PNG)画像をXBMファイルに変換してXBMデータを貼り付けたサンプル
--------------------------------------------------------------------------------
from machine import I2C, Pin
from ssd1306 import SSD1306_I2C
from SKssd1306 import SSD1306

dt = [
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x7F, 0xFC, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F,
    0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
    0xFF, 0xFF, 0x1F, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x0F, 0xE0, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x0F,
    0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
    0xFF, 0xFF, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x7F, 0xF7, 0x07, 0xC0, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xC0, 0x0F,
    0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
    0xFF, 0x00, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0x3F, 0xFF, 0x00, 0x0E, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x00, 0x0C, 0x80, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x00, 0x10,
    0x80, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
    0xFF, 0x01, 0x00, 0x80, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0x3F, 0xFF, 0x01, 0x00, 0x80, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFE,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x03, 0x00,
    0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
    0xFF, 0x07, 0x00, 0x04, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0x3F, 0xFF, 0x0F, 0x00, 0x06, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x1F, 0x08, 0x0F, 0x80, 0xFF,
    0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x3F, 0xF0,
    0x0B, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F,
    0x7F, 0x7A, 0xF0, 0x1B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF,
    0xFF, 0xFF, 0x3F, 0x1F, 0x00, 0xF0, 0x31, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
    0x0F, 0xFE, 0xFF, 0xEF, 0xFF, 0x3F, 0x0F, 0x00, 0x70, 0x30, 0xF8, 0xFF,
    0xFF, 0xFF, 0xFF, 0x1F, 0xFE, 0xFF, 0xCF, 0xFF, 0x3F, 0x0F, 0x00, 0x30,
    0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFA, 0xFF, 0xC3, 0xFF, 0x3F,
    0x0F, 0x00, 0x78, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x17, 0xF8, 0xFF,
    0xC0, 0xFF, 0x3F, 0x1F, 0x00, 0x7C, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
    0x0F, 0xF0, 0xFF, 0x80, 0xFF, 0x3F, 0x3F, 0x00, 0x20, 0x00, 0xF0, 0xFF,
    0xFF, 0xFF, 0xFF, 0x07, 0xC0, 0x7F, 0x80, 0xFF, 0x3F, 0x7F, 0x00, 0x60,
    0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x3F, 0x80, 0xFF, 0x3F,
    0xFF, 0x00, 0x20, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x04, 0x3F,
    0x80, 0xFF, 0x3F, 0xFF, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0x01, 0x00, 0x1F, 0x80, 0xFF, 0x3F, 0xFF, 0x07, 0x80, 0x81, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x1E, 0x80, 0xFF, 0x3F, 0xFF, 0x07, 0xC0,
    0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x00, 0x1C, 0x80, 0xFF, 0x3F,
    0xFF, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x22, 0x00, 0x18,
    0xC0, 0x1F, 0x3E, 0xFF, 0x07, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0x67, 0x00, 0x08, 0xC0, 0x03, 0x3E, 0xFF, 0x0F, 0xFC, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x18, 0xC0, 0x01, 0x3F, 0xFF, 0xDF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x40, 0x00, 0x60, 0x00, 0x3F,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0x3F, 0x00, 0x00,
    0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC,
    0x1F, 0x80, 0x82, 0x00, 0x80, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0x1F, 0xF8, 0x01, 0x80, 0xEF, 0x01, 0x00, 0x3F, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xF0, 0x00, 0x80, 0xFF, 0x01, 0x80, 0x3F,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xE0, 0x00, 0x80, 0xFF,
    0x03, 0xC0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00,
    0x00, 0xC0, 0xFF, 0x1F, 0xC0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0x0F, 0x00, 0x00, 0xC0, 0xFB, 0x0F, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x80, 0x00, 0xE0, 0x07, 0x0F, 0xF8, 0x3F,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x01, 0xC0, 0x13,
    0x06, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00,
    0x01, 0xC0, 0x23, 0xC6, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0x0F, 0x00, 0x01, 0x80, 0x07, 0xC7, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x03, 0xFF, 0x3F,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xD7,
    0x07, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00,
    0x00, 0x80, 0x20, 0x00, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0x1F, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x70, 0x00, 0xF8, 0x3F,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xF8,
    0x00, 0xF8, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x70, 0x20,
    0x18, 0x00, 0xFC, 0x01, 0xF8, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
    0x00, 0x80, 0x20, 0x1C, 0x00, 0xFC, 0x03, 0xF8, 0x3F, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFE, 0xCF, 0xFD, 0x3F,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x20, 0x00, 0x00, 0xFF,
    0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x28,
    0x80, 0x00, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0x00, 0x00, 0x0C, 0x40, 0x80, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x3F,
]

# I2Cを初期化(I2Cのプルアップ抵抗はチップ内蔵を使う)
Pin(4, Pin.OUT, Pin.PULL_UP)
Pin(5, Pin.OUT, Pin.PULL_UP)
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
# SSD1306の初期化
oled = SSD1306_I2C(128, 64, i2c)
dsp = SSD1306(oled)

dsp.drawXBM(0, 0, 118, 64, dt)
oled.show()
--------------------------------------------------------------------------------------------------
実行結果の写真
 動作は、こんな感じぃ。
 ニワゼキショウで草花です。
 最近カメラ全然触っていない!
 カメラ調子悪いし、レンズはカビ生えているし、
 写真どり下手くそになったわ〜

ここでXBMデータのコードへの貼り付け方法を書いて置きます

@ 私は"GIMP2"を使いました。写真を開きます。
A [画像]->[モード]->[インデックス]でウインドウを開き”モノクロ2階調”を選択して、
  [変換]をクリックします。
B 適当にトリミングします。
  (私の持っている"Digital Photo Professional 4"なら128x64にキッチリトリミングできるのだがぁ..)
C [画像]->[画像の拡大・縮小]で128x64以内に縮小します。
D [ファイル]->[名前を付けてエクスポート]でファイルを保存します。
  (GIMPならこの時にXBM型式で保存可能です、E操作はいらないね!)
E ここからXBMファイルに変換しましょう。
F 変換したファイルを"メモ帳"辺りで開き、HEX部分のデータをコードに貼り付けます。

SKssd1306.py
 ・dsp.drawXBM(start_x, start_y, width, height, bmp)
  XBMビットマップ型式を描画します。
  start_x = 描画する開始位置の横方向x座標
  start_y = 描画する開始位置の縦方向x座標
  width = 画像の横サイズ
  height = 画像の縦サイズ
  bmp  = ビットマップのデータ

※ 50x50ドット以内ならこちら(ミニドット絵メーカー3:Neutralさん)のサイトで
  web上からキャラクターが作成できそうです。

やっぱりぃ日本語が表示させたいぞぉなサンプル

使ったフォントは、12x12漢字フォントファイルの"Shinonome_12.pdb(Shinome.pdb)"です。
これは、"CJKOS Japanese Fonts"サイトの"東雲"をそのまま利用しています。
このフォントはJISコードで、PythonはUTF-8だから変換を如何するかですがぁ....
UTF-8からJISの変換を考えてたら頭がオーバーヒートしオーバフローしてしまったので止めました。
代わりにJISコードを直接記述する方式にしちゃいました。(*^.^*)エヘッ

@ "Shinome.pdb"をダウンロードし解凍します。
  ("Shinome.pdb"は"SKssd1306.zip"に含めて置きます)
A "Shinome.pdb"を"PyCharm"のプロジェクトディレクトリ(ここでは"espTest"を作成している)へ
  移動させます。
B ESP-WROOM-02ボードをUSBでPCに繋ぎます。
C "PyCharm"を起動させ、作成してあるプロジェクトを開きましょう。
  こちらのCを操作する必要が有ります。(起動時最初のみ設定)
D "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
E ESP8266に書き込みます
  ・左側プロジェクトウインドウから"Shinome.pdb"の文字を右クリックをし、
   [実行(U)'Flash Shinome.pdb']を選んでクリックします。
  ・左側プロジェクトウインドウから"main.py"の文字を右クリックをして、
   [実行(U)'Flash main.py']を選んでクリックします。
--------------------------------------------------------------------------------
from machine import I2C, Pin
from ssd1306 import SSD1306_I2C
from SKssd1306 import SSD1306

# I2Cを初期化(I2Cのプルアップ抵抗はチップ内蔵を使う)
Pin(4, Pin.OUT, Pin.PULL_UP)
Pin(5, Pin.OUT, Pin.PULL_UP)
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
# SSD1306の初期化
oled = SSD1306_I2C(128, 64, i2c)
dsp  = SSD1306(oled)

DT = [0x242F, 0x245E, 0x2562, 0x2573]  # くまモン

dsp.textKanji(0, 0, DT, 1)
oled.show()
--------------------------------------------------------------------------------
SKssd1306.py
 ・dsp.textKanji(start_x, start_y, text, color)
  指定した場所から漢字(12x12)のテキスト文字列を表示させます。
  start_x = 表示を開始する横方向x座標
  start_y = 表示を開始する縦方向y座標
  text  = 表示する漢字のデータを指示(JISコードで指示)、'熊'なら0x3727
  color  = 0は黒色、1は白色

※ 漢字のJISコードを調べるには、KGK紀州技研さんのこちらをお使いください。

JISコードを調べるサイト
"漢字(日本)→JISコード"にチェック入れ、
変換元に文字列を入力後、[変換>]をクリックします。
後は、変換結果を貼り付けましょう。




[ファイル編へ] [ページ上へ] [WiFi編へ]


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2021 Shigehiro Kimura All Rights Reserved.