CircuitPython

Примеры для CircuitPython будем запускать на отладочной плате Графит-S3.

Для работы с дисплеем используем библиотеку adafruit_st7789, которую можно скачать по ссылке в конце урока. Всё, что нам нужно сделать для её установки — это скопировать файл adafruit_st7789.mpy в папку lib на накопителе CIRCUITPY.

Более подробно о работе с библиотеками CircuitPython мы разбирались в одном из ранних наших уроков: Библиотеки для CircuitPython

УСТАНОВКА ЗАВИСИМОСТЕЙ

Для работы примеров понадобятся вспомогательные библиотеки, которые помогают работать с текстом и графикой:

  • adafruit_display_text
  • adafruit_display_shapes

Все эти библиотеки есть в сборнике от Adafruit. Точно также, копируем их на накопитель CIRCUITPY.

Вывод текста

Для составления программы используем среду разработки Mu.

Пусть, самая первая наша программа будет выводить текст «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 точек, высота — 280 точек. Значение аргумента 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=280, 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=280, rowstart=20)

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)

while True:
    pass

Сохраняем программу на Графит и смотрим результат.

Дисплей IPS 1.69 RobotClass и ESP32-S3

Геометрия и цвета

В следующей программе изобразим палитру. Используем функцию 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=280, rowstart=20)

# 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(280/2-2)
BOX_WIDTH = int(240/6-4)

# генерируем 12 прямоугольников с разными цветами из палитры
color_idx = 0
for y in range(2):
    for x in range(6):
        rect = Rect(x=2+x*(BOX_WIDTH+4), y=2+y*(BOX_HEIGHT+4), width=BOX_WIDTH, height=BOX_HEIGHT, fill=palette[color_idx])
        splash.append(rect)
        color_idx += 1

while True:
    pass

Сохраняем программу на отладочную плату и смотрим результат.

Дисплей IPS 1.69 RobotClass и ESP32-S3

Изменено: