I2C制御の有機ELディスプレイモジュール(制御IC SSD1306)文字表示プログラム例

白色OLED

有機ELディスプレイ(OLED)を用いたI2C制御の128×64ドット白色グラフィックディスプレイモジュール。モジュールで使われている制御チップはSSD1306(SOLOMON SYSTECH)で多くのライブラリが入手できる。このモジュールを使ったテキスト表示プログラムを紹介する。

●使用したハードウェア

制御チップはSSD1306(SOLOMON SYSTECH)を使った、I2C制御128×64ドット白色有機ELディスプレイモジュール。Amazonや秋月電子通商で1個\550程度で入手できる。
■主な仕様
・電源電圧:3.3~5V
・制御方式:I2C(IIC)
・制御IC:SSD1306
・解像度:128×64
・表示色:白
・アドレス:0x3C(既定)または0x3D(抵抗の付け替えによる切り替え)

●テキスト表示プログラム例

<使用したモジュール>
次のadafruitのMonochrome OLED Python Usageを参考にした。
https://learn.adafruit.com/monochrome-oled-breakouts/python-usage-2

モジュールのインストールは
sudo pip install adafruit-circuitpython-ssd1306

<プログラム例>
・OLED-SSD1306ディスプレイ表示モジュール(oledSSD1306.py)
 

import board
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306 as ADF
# sudo pip install adafruit-circuitpython-ssd1306
# Monochrome OLED Python Usage
# https://learn.adafruit.com/monochrome-oled-breakouts/python-usage-2

# SSD1306 I2Cアドレス, サイズ
OLED_ADDR = 0x3C			# OLEDのI2Cアドレス
OLED_WIDTH = 128			# OLEDの幅(Pixels)
OLED_HEIGHT = 64			# OLEDの幅(Pixels)

class OLED:
	def __init__(self):
		i2c = board.I2C()	
		self.oled = ADF.SSD1306_I2C(OLED_WIDTH, OLED_HEIGHT, i2c, addr=OLED_ADDR)
		self.linePix = [0, 16, 32, 48]		# 4行表示のPixel位置
		
	def cleanDisp(self):		# ディスプレイ全消去
		self.oled.fill(0)
		self.oled.show()

	def dispText(self, lineStr):
		# lineStr = [1行目文字列, 2行目文字列, 3行目文字列, 4行目文字列]
		image = Image.new("1", (self.oled.width, self.oled.height))
			# "1" = 1-bit pixels, black and white, stored with one pixel per byte
		draw = ImageDraw.Draw(image)
		# フォントは大小2種類を用意
		fontL = ImageFont.truetype("/usr/share/fonts/truetype/fonts-japanese-gothic.ttf", 16)
		fontS = ImageFont.truetype("/usr/share/fonts/truetype/fonts-japanese-gothic.ttf", 14)
		for i in range(len(lineStr)):
			draw.text((0, self.linePix[i]), lineStr[i], font=fontL, fill=255)
					# draw.text((x, y), 表示文字列, フォント, 表示色)
		self.oled.image(image)
		self.oled.show()


if __name__ == "__main__":
	import datetime
	oled = OLED()
	for i in range(100):
		lineStr = ["OLED TEST"]
		dt = datetime.datetime.now()
		lineStr.append(dt.strftime('%Y年%m月%d日'))
		lineStr.append(dt.strftime('  %H:%M:%S'))
		lineStr.append(str(dt.microsecond))
		oled.dispText(lineStr)
	oled.clearDisp()

●プログラム実行結果

サンプルプログラムは、日時を読み取って4行を表示する事例。日時を読み取り表示する1サイクルの時間は0.116secだった。(Raspberry Pi4を使用)

表示例