CircuitPython
Для работы с дисплеем используем интерпретатор CircuitPython, который позволяет писать программы на упрощённом python. CircuitPython поддерживается большинством плат Графит, включая модели: Графит-S2, Графит-S3, Графит-RP2040 и Графит-RP2354, а также прочими платами на основе ESP32-S2/S3. В этом уроке используем Графит-S3.
Для работы с дисплеем используем библиотеку adafruit_st7789, которую можно скачать по ссылке в конце урока. Всё, что нам нужно сделать для её установки — это скопировать файл adafruit_st7789.mpy в папку lib на накопителе CIRCUITPY.
УСТАНОВКА ЗАВИСИМОСТЕЙ
Для работы примеров понадобятся вспомогательные библиотеки, которые помогают работать с текстом и графикой:
- adafruit_display_text
- adafruit_display_shapes
Все эти библиотеки есть в сборнике от Adafruit. Точно также, копируем их на накопитель CIRCUITPY.
Вывод текста
Для составления программы используем среду разработки RV Circuit Studio.
Пусть, самая первая наша программа будет выводить текст «Hello world!». Начнём с подключения всех необходимых библиотек. Помним, что в python это делается с помощью команды import.
Кроме adafruit_st7789 и adafruit_display_text нам будут нужны еще несколько библиотеки:
- board — предоставляет интерфейс для работы с периферией отладочной платы;
- terminalio — отсюда возьмем стандартный шрифт;
- displayio — нужна для работы с графическими абстрактами.
import board
import terminalio
import displayio
from displayio import FourWire
from adafruit_display_text import label
from adafruit_st7789 import ST7789
Обязательно вызываем функцию release_displays для освобождения шины:
displayio.release_displays()
Теперь инициализируем шину SPI и дисплей. Особое внимание следует обратить на аргументы конструктора ST7789: ширина матрицы — 240 точек, высота — 320 точек. Значение аргумента rowstart определяется особенностями конкретного дисплея. Также здесь можно передать четвертый аргумент — rotation, который укажет поворот дисплея в градусах (90, 180, 270).
spi = board.SPI()
tft_cs = board.D6
tft_dc = board.D4
tft_rst = board.D5
display_bus = FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst)
display = ST7789(display_bus, width=240, height=320, rowstart=20)
А теперь приступим к выводу текста.
Графическая библиотека displayio, которая часто используется в CircuitPython, работает не совсем привычно. Она требует, чтобы все графические объекты были организованы в иерархию. Такой подход может показаться более сложным, чем обычный процедурный. В действительности, это сильно упрощает работу со сложной графикой, такой как, например, в играх.
# создание коревой группы
splash = displayio.Group()
display.root_group = splash
# создание группы для размещения текста
text_group = displayio.Group(scale=2, x=45, y=125)
text = "Hello World!"
text_area = label.Label(terminalio.FONT, text=text, color=0xFF00FF)
text_group.append(text_area) # размещаем текст в его группе
splash.append(text_group) # размещаем текстовую группу в корневой группе
Вся программа целиком:
import board
import terminalio
import displayio
from displayio import FourWire
from adafruit_display_text import label
from adafruit_st7789 import ST7789
displayio.release_displays()
spi = board.SPI()
tft_cs = board.D6
tft_dc = board.D4
tft_rst = board.D5
display_bus = FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst)
display = ST7789(display_bus, width=240, height=320, rowstart=0)
splash = displayio.Group()
display.root_group = splash
text_group = displayio.Group(scale=2, x=45, y=150)
text = "Hello World!"
text_area = label.Label(terminalio.FONT, text=text, color=0xFF00FF)
text_group.append(text_area)
splash.append(text_group)
while True:
pass
Сохраняем программу на Графит и смотрим результат.

Геометрия и цвета
В следующей программе изобразим палитру. Используем функцию Rect из библиотеки adafruit_display_shapes, которая рисует закрашенный прямоугольник.
В начале программы определим 12 цветов. В circuitpython мы задаём их как 24 разрядные числа в шестнадцатеричном формате: #FF00FF. Однако, помним, что контроллер ST7789 использует только 16 разрядов для хранения цвета точки, так что эти 24-разрядные цвета позже будут конвертированы в 16-разрядные с потерей информации.
Затем строим в цикле двенадцать прямоугольников с заданными в массиве цветами. Каждый прямоугольник обязательно добавляем в корневую группу.
import time
import board
import terminalio
import displayio
from displayio import FourWire
from adafruit_display_text import label
from adafruit_display_shapes.rect import Rect
from adafruit_st7789 import ST7789
displayio.release_displays()
spi = board.SPI()
tft_cs = board.D6
tft_dc = board.D4
tft_rst = board.D5
display_bus = FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst)
display = ST7789(display_bus, width=240, height=320, rowstart=0)
# Make the display context
splash = displayio.Group()
display.root_group = splash
# определяем палитру из 12 цветов
palette = displayio.Palette(12)
palette[0] = 0x000000 #чёрный
palette[1] = 0xFFFFFF #белый
palette[2] = 0xC0C0C0 #светло серый
palette[3] = 0x808080 #серый
palette[4] = 0xFF0000 #красный
palette[5] = 0xFFFF00 #жёлтый
palette[6] = 0xFF8000 #оранжевый
palette[7] = 0x804000 #коричневый
palette[8] = 0x00FF00 #зелёный
palette[9] = 0x00FFFF #голубой
palette[10] = 0x0000FF #синий
palette[11] = 0xFF00FF #маджента
BOX_HEIGHT = int(320/2)
BOX_WIDTH = int(240/6)
# генерируем 12 прямоугольников с разными цветами из палитры
color_idx = 0
for y in range(2):
for x in range(6):
rect = Rect(x=2+x*BOX_WIDTH, y=2+y*BOX_HEIGHT, width=BOX_WIDTH, height=BOX_HEIGHT, fill=palette[color_idx])
splash.append(rect)
color_idx += 1
while True:
pass
Сохраняем программу на отладочную плату и смотрим результат.

