Модуль display
Работа с графическим дисплеем
Контроллер имеет виртуальный монохромный графический дисплей с разрешением 128x64 пикселей. Дисплей может использоваться как средство визуализации в пользовательских алгоритмах.
Модуль display
предоставляет функции для управления дисплеем, рисования графических примитивов и вывода текстовой информации на дисплей.
Начало координат находится в нижнем левом углу дисплея.
Функции
clear
Функция clear()
очищает текущий графический буфер.
update
Функция update([doClear: bool = True])
копирует содержимое текущего графического буфера в результирующий.
Если параметр doClear
установлен в True
(по умолчанию), текущий буфер очищается после копирования.
Если doClear=False
, буфер очищаться не будет.
from display import clear, update
update() # Копирует и очищает буфер
# равносильно
update(False)
clear()
Контроллер имеет два идентичных графических буфера:
- Результирующий буфер: хранит итоговое изображение дисплея, которое отображается в веб-интерфейсе.
- Текущий буфер: с которым работают все функции рисования графических примитивов.
Алгоритм рисования на виртуальном дисплее предполагает:
- Очистку графического буфера с помощью
clear()
- Рисование графических элементов
- Обновление результирующего буфера с помощью
update()
from display import clear, rect, update
clear()
rect(0, 0, 40, 40)
update()
dot
Функция dot(x: int, y: int, mode: int = ON)
рисует один пиксель с координатами (x, y)
.
Параметр mode
определяет состояние пикселя и может принимать следующие значения:
ON
— закрасить пиксельOFF
— очистить пиксельINVERT
— инвертировать состояние пикселя
# Рисуем кривую изменения значения с датчика температуры
from dev import Ai, conv
from display import dot, clear, update, WIDTH, HEIGHT
from time import sleep
temp = Ai(0).conf(type='ntc')
clear()
for x in range(WIDTH):
y = int(conv(temp.val(), 15, 35, 0, HEIGHT))
dot(x, y)
update(False)
sleep(0.5)
# Рисуем "белый шум"
from display import dot, clear, update, WIDTH, HEIGHT, INVERT
from random import randint
clear()
while True:
x = randint(0, WIDTH - 1)
y = randint(0, HEIGHT - 1)
dot(x, y, INVERT)
update(False)


line
Функция line(x: int, y: int, w: int, h: int)
рисует линию, проходящую через две точки с координатами (x, y)
и (x + w, y + h)
.
from display import line, clear, update, WIDTH, HEIGHT
from random import randint
clear()
for _ in range(50):
x = randint(0, WIDTH)
y = randint(0, HEIGHT)
w = randint(-WIDTH, WIDTH)
h = randint(-HEIGHT, HEIGHT)
line(x, y, w, h)
update(False)


lines
Функция lines(start: tuple, *increments: tuple)
рисует набор линий, в котором конец каждой линии соединен с началом следующей.
start
— координаты начала первой линии(x, y)
.*increments
— последовательность приращений(w1, h1), (w2, h2), ...
, определяющих направление и длину каждой линии относительно предыдущей точки.
Пример использования:
# Рисуем параллелепипед
from dev import run
from display import clear, lines, update
def parallelepiped(x, y, w, h, d):
lines((x, y), (w, 0), (d, h), (-w, 0), (-d, -h))
clear()
parallelepiped(0, 0, 40, 40, 10)
update()


circle
Функция circle(x: int, y: int, r: int)
рисует окружность с центром (x, y)
и радиусом r
.
# Анимация с окружностями
from dev import run
from display import clear, circle, update, WIDTH, HEIGHT
def step(c):
for i in range(12):
circle(WIDTH // 2, HEIGHT // 2, i * 6 + int(c % 6))
update()
run(step, 0.25)


image
Функция image(x: int, y: int, h: int, data: bytes | array('b'))
рисует битовое изображение (bitmap), где:
x
,y
— координаты изображения (нижний левый угол).h
— высота изображения в пикселях.data
— битовое изображение, тип данныхbytes
илиarray('b')
.
Битовое изображение представляет собой массив байт, в котором каждый байт определяет отображение столбца из 8 пикселей.
Например, байт 0xff
закрасит все 8 пикселей, 0x01
— только первый (нижний) пиксель в столбце.
Ширина изображения определяется автоматически: w = len(data) // ((h + 7) // 8)
.
Например, если высота изображения не превышает 8 пикселей, его ширина равна числу байт битового изображения; если 8 < h <= 16
, то w = len(data) / 2
.
from display import clear, image, update
# Пример битового изображения: простой смайлик 8x8 пикселей
smiley_data = bytes([
0x3C, # 00111100
0x42, # 01000010
0xA5, # 10100101
0x81, # 10000001
0xA5, # 10100101
0x99, # 10011001
0x42, # 01000010
0x3C # 00111100
])
clear()
image(60, 28, 8, smiley_data)
update()


text
Функция text(x: int, y: int, s: str, align: int = LEFT)
выводит строку текста на дисплей.
x
,y
— координаты начала текста приalign == LEFT
, середины приalign == CENTER
или конца приalign == RIGHT
.s
— строка текста.align
— выравнивание текста относительно координат(x, y)
. Возможные значения:LEFT
(по умолчанию),CENTER
,RIGHT
.
Текст выводится с помощью системного шрифта, каждый символ которого имеет размер 5 пикселей в ширину и 8 пикселей в высоту. Шрифт поддерживает кириллицу. Ограничение на длину строки — 128 байт, русские буквы занимают по 2 байта.
from display import clear, text, update, CENTER, WIDTH, HEIGHT
clear()
text(WIDTH // 2, HEIGHT // 2 - 4, "Привет, мир!", CENTER)
update()


rect
Функция rect(x: int, y: int, w: int, h: int)
рисует прямоугольник, где:
x
,y
— координаты начала прямоугольника.w
,h
— ширина и высота прямоугольника.
rectfull
Функция rectfull(x: int, y: int, w: int, h: int)
рисует закрашенный прямоугольник с заданными координатами и размерами.
from display import clear, rectfull, update
clear()
rectfull(10, 10, 50, 30)
update()


invert
Функция invert(x: int, y: int, w: int, h: int)
осуществляет инвертирование прямоугольной области, где:
x
,y
— координаты начала области.w
,h
— ширина и высота области.
При инвертировании закрашенные пиксели становятся незакрашенными и наоборот.
from display import clear, invert, update
clear()
invert(10, 10, 30, 30)
invert(20, 20, 30, 30)
update()


Константы
WIDTH
Ширина дисплея. WIDTH == 128
HEIGHT
Высота дисплея. HEIGHT == 64
LEFT
Выравнивание текста по левому краю. LEFT == 0
CENTER
Выравнивание текста по центру. CENTER == 1
RIGHT
Выравнивание текста по правому краю. RIGHT == 2
ON
Режим закрашивания пикселя. ON == 0
OFF
Режим очистки пикселя. OFF == 1
INVERT
Режим инвертирования пикселя. INVERT == 2