CircuitPython 10行プログラミング Step9 (6) SPIとグラフィック・ディスプレイ <その3>
前回に引き続き、マイコン・ボードESP32-S3-DevKitC-1-N8のSPIバスにグラフィック・ディスプレイ(コントローラはST7789)をつないでテキストを表示します。CircuitPython は8.0.0-beta.4です。
前回、adafruit_display_textのlabelもしくはbitmap_labelを使って、ディスプレイの全面に文字を表示しました。
Groupは複数定義できます。Groupの中にあるtileGridは画像ですが、背景色などを指定するパレットと同時に使うものです。しかし、テキストだけだと、どちらも省略できます。
二つのGroupの例です。重なってもかまいません。
●タイトルと温湿度の表示の二つのGroup
重ならないGroupを作ります。
上のグループtextはタイトルを表示し、以後、変化させません。
下のグループtext2は、AHT21の温度と湿度の値を2秒ごとにランダムな座標に表示します。
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
from board import *
from busio import I2C
import time
import adafruit_ahtx0
i2c = I2C(IO4,IO5) # uses board.SCL and board.SDA
sensor = adafruit_ahtx0.AHTx0(i2c)
print("\n")
import time
from random import random
import board
import terminalio
import displayio
from busio import SPI
from adafruit_bitmap_font import bitmap_font
from adafruit_display_text import bitmap_label
from adafruit_st7789 import ST7789
displayio.release_displays()
spi = SPI(clock=board.IO14, MOSI=board.IO11)
tft_cs = board.IO10
tft_dc = board.IO46
tft_rst = board.IO9
display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst, baudrate=40000000)
display = ST7789(display_bus, width=320, height=170, colstart=35, rotation=90)
# Make the display context
splash = displayio.Group() # Make the display context
display.show(splash)
text_group = displayio.Group(scale=3, x=20, y=20) # Title
DISPLAY_STRING = "Temp & Humi"
text = bitmap_label.Label(terminalio.FONT, text=DISPLAY_STRING, color=0xffbbcc)
text.x = 10
text.y = 0
text_group.append(text)
splash.append(text_group)
text_group = displayio.Group(scale = 3, x=0, y=50) # Data
text = '00'
text2 = bitmap_label.Label(terminalio.FONT, text=text, color=0x55FFFF)
text_group.append(text2)
splash.append(text_group)
'''
try:
display.refresh(target_frames_per_second=60)
except AttributeError:
display.refresh_soon()
display.wait_for_frame()
'''
while True:
print("\nTemperature: %0.1f C" % sensor.temperature)
print("Humidity: %0.1f %%" % sensor.relative_humidity)
text2.y = int(random() *40)
text2.x = int(random() *50)
text2.text = str(round(sensor.temperature,1)) +"C " + str(int(sensor.relative_humidity))+"%"
time.sleep(2)
二つ目のテキストグループで、表示する文字の指定は、text=textと記述しています。このように書かないと、テキストの更新ができません。理由は不明です。
text2 = bitmap_label.Label(terminalio.FONT, text=text, color=0x55FFFF)
実行例です。
●カラー・パレット
カラー・パレットPalletは、Groupの下にあって、TileGrid配下にあってbitmapとともに使われます。
画面全体を淡色のpaletteで指定します。
Bitmap(display.width, display.height, 1)の1は、1色を指定しているという意味です。そして、
color_palette[0] = 0x006600で実際の色(うすい緑色)を指定しています。
TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=40)のx,y座標は、パレットの左上の座標です。
カラー・パレットの描画部分です。以降の文字表示の背景色的な塗りつぶしになります。独立しているので、文字の表示によって色が抜けたりしません。
color_bitmap = displayio.Bitmap(display.width, display.height, 1) # background color
color_palette = displayio.Palette(1)
color_palette[0] = 0x006600 # not Bright Green
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=40) # only data group
splash.append(bg_sprite)
プログラムです。
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
from board import *
from busio import I2C
import time
import adafruit_ahtx0
i2c = I2C(IO4,IO5) # uses board.SCL and board.SDA
sensor = adafruit_ahtx0.AHTx0(i2c)
print("\n")
import time
from random import random
import board
import terminalio
import displayio
from busio import SPI
from adafruit_bitmap_font import bitmap_font
from adafruit_display_text import bitmap_label
from adafruit_st7789 import ST7789
displayio.release_displays()
spi = SPI(clock=board.IO14, MOSI=board.IO11)
tft_cs = board.IO10
tft_dc = board.IO46
tft_rst = board.IO9
display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst, baudrate=40000000)
display = ST7789(display_bus, width=320, height=170, colstart=35, rotation=90)
# Make the display context
splash = displayio.Group() # Make the display context
display.show(splash)
color_bitmap = displayio.Bitmap(display.width, display.height, 1) # background color
color_palette = displayio.Palette(1)
color_palette[0] = 0x006600 # not Bright Green
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=40) # only data group
splash.append(bg_sprite)
text_group = displayio.Group(scale=3, x=20, y=20) # Title
DISPLAY_STRING = "Temp & Humi"
text = bitmap_label.Label(terminalio.FONT, text=DISPLAY_STRING, color=0xffbbcc)
text.x = 10
text.y = 0
text_group.append(text)
splash.append(text_group)
text_group = displayio.Group(scale = 3, x=0, y=50) # Data
text = '00'
text2 = bitmap_label.Label(terminalio.FONT, text=text, color=0x55FFFF)
text_group.append(text2)
splash.append(text_group)
'''
try:
display.refresh(target_frames_per_second=60)
except AttributeError:
display.refresh_soon()
display.wait_for_frame()
'''
while True:
print("\nTemperature: %0.1f C" % sensor.temperature)
print("Humidity: %0.1f %%" % sensor.relative_humidity)
text2.y = int(random() *40)
text2.x = int(random() *50)
text2.text = str(round(sensor.temperature,1)) +"C " + str(int(sensor.relative_humidity))+"%"
time.sleep(2)
実行例です。