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
Сохраняем программу на Графит и смотрим результат.
Геометрия и цвета
В следующей программе изобразим палитру. Используем функцию 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
Сохраняем программу на отладочную плату и смотрим результат.