Расширенная работа с текстом на MicroPython для дисплеев Raspberry Pi Pico
В предыдущих руководствах (управление цветом и графика) Тони объяснил, как управлять цветом на дисплее Waveshare LCD для Raspberry Pi Pico и продемонстрировал, как использовать графические процедуры для рисования объектов на экране.
В этом руководстве мы расширим возможности работы с текстом, добавив новый шрифт с расширенным набором символов и отобразим его в разных размерах. Мы также предоставим несколько простых подпрограмм для помощи в размещении текста, таких как центрирование текста по ширине экрана.
Что вам понадобится
Raspberry Pi Pico с выводами
Кабель Micro-USB — для питания и программирования Pico
Дисплей Waveshare Pico LCD и драйверное программное обеспечение
Thonny, установленный на вашем компьютере
Умение вводить, редактировать, сохранять и выполнять код MicroPython на Pico с помощью Thonny
Мы будем использовать дисплей Waveshare 1.44» 128x128 для Pico, но любой другой Pico LCD дисплей от Waveshare (0.96» / 1.3» / 1.8» / 2») также будет работать таким же образом — ниже мы приведём примеры для каждого из них.
Встроенный набор символов
Стандартный набор символов (встроенный в библиотеку и импортируемый драйвером) имеет хороший диапазон символов, включая строчные и прописные буквы, цифры и многие полезные специальные символы. Они расположены от chr(32) = «пробел» до chr(127) = «тильда» — как вы можете видеть на изображении выше.
Вы можете скачать базовую программу для управления вашей платой здесь (обязательно переименуйте файлы после скачивания, чтобы убрать посторонние символы в конце имени файла):
WS 0-96 160x80 MIN.py
WS 1-3 240x240 MIN.py
WS 1-8 160x128 New Driver MIN.py
WS 1-44 128x128 MIN.py
WS 2-0 320x240 MIN.py
Шрифт и необходимые процедуры предоставлены в этом файле для скачивания:
FONTS.py
Откройте Thonny, затем скопируйте весь код из FONTS.py и вставьте его в базовую программу для используемого вами дисплея. Разместите его непосредственно выше следующей строки:
# ==== Board now setup ========== MAIN BELOW====================
Используйте Menu > Save as, чтобы создать новый файл — мы назвали наш WS 1-44 128x128 FONT.py.
Добавьте эти три строки кода непосредственно выше инструкции lcd.show():
#cntr_st(s,y,sz,r,g,b): # Centres text on line y
cntr_st("The Pi Hut",55,1,255,0,0) # Centres text on line y
cntr_st("The Pi Hut",70,2,0,0,255)
cntr_st("Pi Hut",90,3,0,255,0)
Затем измените задержку на:
utime.sleep(10)
Сохраните и запустите программу, чтобы проверить, что она работает. Результат должен выглядеть примерно так:
Первые четыре строки создаются с помощью шрифта, встроенного в библиотеку framebuf, импортируемую драйвером дисплея… но что насчёт последних трёх?
Новый шрифт!
Последние три строки используют новый шрифт в разных размерах и автоматически центрируются по ширине экрана. Этот шрифт создал Тони ДиКола, и его можно найти здесь: https://gist.github.com/tdicola/229b3eeddc12d58fb0bc724a9062aa05. Этот шрифт имеет несколько интересных особенностей:
Каждый символ имеет высоту 8 пикселей и ширину 5 пикселей
Он имеет расширенный набор из 255 символов
Есть 3 символа «пробел» — в позициях 0, 32 и 255
Многие символы ниже chr(32) часто используются для управления принтером, например LINE-FEED и RETURN, но здесь они заполнены символами
Некоторые выглядят довольно полезными, особенно те, что находятся в первой и последней парах строк. Здесь мы видим масти игральных карт, стрелки, символы пола, греческие буквы и математические символы. Символы с диакритическими знаками и те, что находятся в строках 10 и 11, вероятно, менее полезны для нас.
Новый шрифт занимает довольно много памяти и уменьшает пространство для другого кода. Это становится проблемой только для самых больших дисплеев, таких как 2» LCD 320x240, которому нужно так много места для буфера дисплея.
Новый шрифт — новые процедуры
Мы добавили несколько дополнительных процедур, чтобы в полной мере использовать этот новый шрифт.
def character(asc,xt,yt,sz,r,g,b): # Single character sz is size: 1, 2 or 3
Эта функция рисует один символ, определяемый его ASCII-кодом или номером символа, расположенный левым верхним углом в пикселе (xt, yt) при размере 1, 2 или 3 и в цвете r, g, b.
def prnt_st(asci,xx,yy,sz,r,g,b): # Text string asci
Эта функция использует предыдущую процедуру для рисования текстовой строки символов на дисплее, начиная с позиции (xx, yy).
def cntr_st(s,y,sz,r,g,b): # Centres text on line y
Эта функция центрирует строку по ширине дисплея на строке y (она вычисляет значение x, а затем вызывает две предыдущие процедуры).
Если вам не хватает памяти, вы можете удалить многие символы из расширенной части шрифта. Тогда вам нужно будет выяснить уменьшенные номера chr() для оставшихся символов.
Помните, что все базовые графические процедуры по-прежнему доступны, поскольку они фактически находятся внутри кода драйвера.
Что попробовать
Разместите символы червей, бубей, треф и пик в каждом углу дисплея в размере 1
Повторите с размерами 2 и 3
Отобразите температуру с использованием символа градуса
Отобразите первые 32 символа в каждом размере
Выведите все греческие символы
Напишите процедуру для центрирования lcd.text()
Графика и шрифты вместе?
Можно включить код драйвера дисплея, расширенные GFX-подпрограммы и систему Font/Text в Pico одновременно — просто вставьте код FONT ниже кода GFX, но выше строки # === MAIN ====.
Рекомендуем затем запустить этот код, чтобы увидеть, сколько памяти осталось:
# ==== Board now setup ========== MAIN BELOW====================
clear(0)
circle(85,47,38,colour(255,255,0))
cntr_st("Hello",40,2,0,0,255)
gc.collect()
free = gc.mem_free()
cntr_st("Mem free: ",90,1,200,200,200)
cntr_st(str(free),103,3,255,0,0)
print(free)
lcd.show()
Вы можете скачать готовый код для каждого из дисплеев здесь (опять же, обязательно переименуйте файлы после скачивания, чтобы убрать посторонние символы в конце имени файла):
WS 0-96 160x80 LOADED-T2.py
WS 1-3 240x240 LOADED-T2.py
WS 1-8 160x128 New Driver LOADED-T2.py
WS 1-44 128x128 LOADED-T2.py
WS 2-0 320x240 LOADED-T2.py
Обнаружилось, что для дисплея 2» недостаточно свободной памяти, поэтому мы удалили многие менее полезные символы из шрифта. Вы также можете убрать неиспользуемые процедуры и библиотеки, чтобы освободить больше места для кода вашего проекта.
Вот пример совместной работы графики и шрифтового кода:
Проект для практики
Проверьте свои новые навыки с помощью этой симуляции. Мы создали её на дисплее 2» 320x240 пикселей, но вы можете адаптировать её для других дисплеев с небольшими изменениями (для дисплеев с меньшей высотой ограничьте броски значением 500 или меньше и/или растяните полосы по горизонтали).
Симулируйте бросок пары кубиков 1000 раз и отображайте суммы по ходу:
Красный: 2 и 1 — текущий бросок
Жёлтый: 3 — текущая сумма
Красный: 838 — счётчик бросков
Жёлтые полосы — текущие итоги выпавших пар
Советы для быстро работающей симуляции:
Рисуйте синюю сетку только один раз — до основного цикла
Наращивайте полосы по одной короткой жёлтой линии hline() за раз — по одной на цикл
Очищайте верхнюю строку чёрными прямоугольниками fill перед обновлением чисел
Код можно скачать здесь — WS320x240 2 Dice.py — а видео ниже демонстрирует его в действии:
Надеемся, что эти руководства дали вам несколько идей о том, как вы могли бы использовать Pico LCD-дисплей в будущих проектах.
Об авторе
Эта статья написана Тони Гудью. Тони — учитель информатики на пенсии, который начал писать код ещё в 1968 году, когда это называлось программированием, — он начал с FORTRAN IV на IBM 1130! Активный участник сообщества Raspberry Pi, его основные интересы сейчас — программирование на MicroPython, путешествия и фотография.