シェルスクリプトマガジン

センサーボードで学ぶ電子回路の制御(Vol.63掲載)

著者:米田 聡

シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)向けのセンサー搭載拡張ボード「ラズパイセンサーボード」を制作しました。第10 回では、I2C 接続のモノクロ有機ELディスプレイをGroveコネクタにつなぎ、ラズパイセンサーボードだけでセンサーから情報をディスプレイ上に表示します。

シェルスクリプトマガジン Vol.63は以下のリンク先でご購入できます。

図6 有機ELディスプレイに日本語を表示するためのライブラリ(OLED.py)

import time
import Adafruit_SSD1306

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont


class OLED(Adafruit_SSD1306.SSD1306_128_64):

	WIDTH = 128
	HEIGHT = 64
	
	# DEFAULT_FONT = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf'
	DEFAULT_FONT = '/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc'
	FONT_SIZE = 12
	_LINE_HEIGHT = 16
	
	def __init__(self):
		super().__init__(rst=24)
		self._image = Image.new('1', (self.WIDTH, self.HEIGHT) ,0)
		self._draw = ImageDraw.Draw(self._image)
		self._font = ImageFont.truetype(self.DEFAULT_FONT, self.FONT_SIZE, encoding='unic')
	
	def image(self, image):
		self._image = image
		super().image(self._image)
	
	def drawString(self, str, line=0):
		self._draw.rectangle((0, line*self._LINE_HEIGHT, self.WIDTH,line*self._LINE_HEIGHT+self._LINE_HEIGHT), fill=(0))
		self._draw.text((0, line*self._LINE_HEIGHT), str, font=self._font, fill=1)
		self.image(self._image)

図7 BME280のデータを表示するサンプルプログラム(sample.py)

#!/usr/bin/env python3
#
# apt install python3-pip
# sudo pip3 install RPi.BME280
#

import time
import smbus2
import bme280

from OLED import OLED

BME280_ADDR = 0x76
BUS_NO = 1

# BME280
i2c = smbus2.SMBus(BUS_NO)
bme280.load_calibration_params(i2c, BME280_ADDR)

# OLEDパネル
oled = OLED()
oled.begin()
oled.clear()
oled.display()

try:
	while True:
		data = bme280.sample(i2c, BME280_ADDR)
		oled.drawString('気温 :' + str(round(data.temperature,1)) + '℃', 0)
		oled.drawString('湿度 :' + str(round(data.humidity,1)) + '%', 1)
		oled.drawString('気圧 :' + str(round(data.pressure,1)) + 'hPa', 2)
		oled.display()
		
		time.sleep(1)
except KeyboardInterrupt:
	pass