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)

 実行例です。