Урок 8 — библиотека шрифтов для дисплея st7783

STM Урок 37. Дисплей TFT 240×320 8bit. Часть 9

Урок 37

Дисплей TFT 240×320 8bit

В прошлой части данного урока мы закончили работать со шрифтами и строками и начали работать уже с изображениями, написав функцию считывания изображения с USB Flash и вывода её на экран.

Сегодня мы продолжим данную работу.

Напишем прототип этой функции.

Добавим тест для вывода картинок на экран опять же в теле функции FileReadWrite

TFT9341_DrawBitmap(0, 0, «001.bmp»);

TFT9341_DrawBitmap(0, 0, «002.bmp»);

TFT9341_DrawBitmap(0, 0, «003.bmp»);

TFT9341_DrawBitmap(0, 0, «004.bmp»);

TFT9341_DrawBitmap(0, 0, «005.bmp»);

TFT9341_DrawBitmap(0, 0, «006.bmp»);

TFT9341_DrawBitmap(0, 0, «007.bmp»);

TFT9341_DrawBitmap(0, 0, «008.bmp»);

TFT9341_DrawBitmap(0, 0, «009.bmp»);

TFT9341_DrawBitmap(0, 0, «010.bmp»);

TFT9341_DrawBitmap(0, 0, «011.bmp»);

TFT9341_DrawBitmap(0, 0, «012.bmp»);

TFT9341_DrawBitmap(0, 0, «013.bmp»);

TFT9341_DrawBitmap(0, 0, «014.bmp»);

TFT9341_DrawBitmap(0, 0, «015.bmp»);

TFT9341_DrawBitmap(0, 0, «016.bmp»);

TFT9341_DrawBitmap(0, 0, «017.bmp»);

TFT9341_DrawBitmap(0, 0, «018.bmp»);

TFT9341_DrawBitmap(0, 0, «019.bmp»);

TFT9341_DrawBitmap(0, 0, «020.bmp»);

TFT9341_DrawBitmap(0, 0, «021.bmp»);

TFT9341_DrawBitmap(0, 0, «022.bmp»);

Соберем код, прошьем контроллер и проверим на практике

Таким же самым образом выводятся и все остальные рисунки. Весь тест вы увидите в видеоверсии, прикрепленной ниже.

Раскомментируем предыдущие тесты и проверим код полностью.

Отладочную плату и дисплей LCD 20×4 можно приобрести здесь:

Где приобрести именно такой дисплей TFT 240×320, написать затрудняюсь, так как может прийти не всегда именно такой дисплей, какой заявлен в продаже. Либо придет подключаемый по SPI, либо с другим контроллером. Поэтому все тонкости уточняйте у продавца.

Смотреть ВИДЕОУРОК (нажмите на картинку)

22 комментария на “ STM Урок 37. Дисплей TFT 240×320 8bit. Часть 9 ”

Владимир, добрый день! Спасибо за Ваши уроки, весьма полезные и качественные. Есть пожелание – оставляйте промежуточный код в частях урока, так проще с ними разбираться на пути освоения урока. При попытке повторить данный урок, я столкнулся с тем что у меня идет только часть теста графики и не идет часть с текстом и я уже не говорю о катрике. А урок весьма важный и полезный! И весьма интересна как сама шина, так ещё более интересен контроллер ILI9341!

Да и к тому же Ваш пример сильно мне помог! Я им проверял полученные дисплеи! И только 3-й дисплей оказался не бракованным и с нужным контроллером, хотя все заявляли что у них ILI9341! Спасибо!

а без LCD дисплея будет работать? Что-то подсветка горит, а картинки нет

Будет, символьный дисплей используется только в целях отображения идентификатора.

Здравствуйте , Возникли проблемы по работе с данным дисплеем,

У меня другая плата и команды Chip Select я выбрал NE4, команду LCD Register Select на A6

1) Вопрос про вот эти значения откуда они берутся?

#define ADDR_CMD *(uint8_t*)0x60000000

#define ADDR_DATA *(uint8_t*)0x60010000

2) в файле ili9341.c ругается на строку extern void Error_Handler(void);

3) Обязательно ли подключать вывод RES на дисплее? дело в том что у меня этот вывод идет на кнопку ресет.

Очернь понравились уроки, дисплей с али заработал без проволочек

Прошу не этом не останавливаться и например сделать урок гле, например, stm будет по дисплею крутить видео снятое на какой нить нокии 2690

Это нужен будет как минимум STM32F769, который поддерживает аппаратное декодирование JPEG.

так ведь там h263

вот пример видео, очень старое

STM может потянуть такое?

сведения их mediainfo

Video
ID : 1
Format : H.263
Format profile : BaseLine@1.0
Codec ID : s263
Duration : 58 s 187 ms
Bit rate : 69.9 kb/s
Width : 176 pixels
Height : 144 pixels
Display aspect ratio : 1.222
Original display aspect rat : 4:3
Frame rate mode : Variable
Frame rate : 9.796 FPS
Minimum frame rate : 1.458 FPS
Maximum frame rate : 43.388 FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Compression mode : Lossy
Bits/(Pixel*Frame) : 0.281
Stream size : 496 KiB (83%)
Writing library : hant
Language : English
Encoded date : UTC 2016-10-10 11:57:06
Tagged date : UTC 2016-10-10 11:57:06

Audio
ID : 2
Format : AMR
Format/Info : Adaptive Multi-Rate
Format profile : Narrow band
Codec ID : samr
Duration : 58 s 320 ms
Bit rate mode : Constant
Bit rate : 12.8 kb/s
Channel(s) : 1 channel
Sampling rate : 8 000 Hz
Bit depth : 13 bits
Stream size : 91.1 KiB (15%)
Writing library : Nokia
Language : English
Encoded date : UTC 2016-10-10 11:57:06
Tagged date : UTC 2016-10-10 11:57:06

должен потянуть но нужно все оптимизировать и даже эту библиотеку, код которой представлен автором статьи и после нужно прикручивать декодер и буфер кадра и с него уже гонять картинку на дисплей

по хорошему, если ног не жалко то буфером пусть будет внешняя быстрая микросхема из которой контроллер просто будет читать в дисплей то есть это должно работать так: контроллер раскодирует видео и помещает в буфер, дальше из буфера прогоняет и снова

кстати дисплеи часто комплектуются халявным тачскрином который сам по себе неплох и если мы увидим статью по применению этого тач скрина то это думаю будет очень даже неплохо

Добрый день. Отличный урок.

Только есть один вопрос: как происходит совмещение логических уровней?

Ведь дисплейчик работает в пятивольтовой логике, а АРМ – в трехвольтовой. Может я что-то не заметил в Вашем уроке? Объясните, пожалуйста.

Здравтсвуйте!
Да всё нормально там работает. Дисплей работает от 3 вольт. От 5 вольт работает подстветка. Вроде так. Ну если что как правило производители делают ножки толерантными к более низким уровням.

Спасибо. А то видел у какого-то итальянца, он отпаивал стабилизатор и шины на 3,3 и 5 вольт закорачивал, когда подключал к STM. Типа, это фича такая с этим дисплейчиком и STM.

У Вас отличные уроки.

Добрый вечер.
Нужно бы урок с подключением touchscreen у этого шилда.

Подскажите такой вопрос: имеется подобный дисплей на контроллере LS022 (8ми битный интерфейс). Вот только уровни сигналов в нем 1,8В. Собрал на резисторных делителях напряжения + добавил индикаторы в виде светодиодов (D0-D7, RW, RS). Если дрыгать пинами все команды вручную – светодиоды светятся, дисплей работает, но медленно. Попробовал задействовать Ваш вариант с FSMC – кроме ресета – ничего на индикаторах нет. Функцию чтения с контроллера не использую – понятно, что связь через делители односторонняя – передаю команды и данные на дисплей. Может ли в этом быть причина?

Трудно сказать, я так не пробовал.

кстать такая фича наблюдалась и у меня – я сначала не мог сосчитать ID дисплея у меня был бред типа FEFEFEFEF… ACACA0AC0C… а если чуть увеличить тайминги – на 2 то ID считывается как ему положено 00009341. На картинка на дисплей выходит сыпанной, либо вообще какой-то сеткой покрыта и видно что часть пикселей отображается неправильно или вообще не отображается. Это исправляется подключением шины данных через витую пару и запайкой резистора 200…500 ом между контактами 5V и RW

Огромнейшее вам СПАСИБО. Почти разобрался (подключил ili9486_8bit к stm43f407vet6, читаю шрифт и картинки с SD карты, инициализацию переделал взяв команды с WIKI LCD и подключил А18 вместо А16) Ваши картинки рисует но в пол экрана это понятно, разрешение другое, а вот свою вывести не могу.Подскажите чем и как перегнать, и какие шрифты можно взять мне нужно покрупнее.Еще раз СПАСИБО.

Урок 8 — библиотека шрифтов для дисплея st7783

В этой статье расскажу, как я решился на столь очаяный шаг по доработке библиотеки UTFT (она реализует вывод графики и текста на экран цветного графического дисплея), а именно — вывод кирилицы. Как известно, библиотека UTFT поддерживает вывод только латиницы, символов и цифр в заданном шрифте. Я не любитель писать вывод на латиницы, и поэтому принципиально и в силу присущей мне национальной наружности приемлю работу в основном только на кириллице, а латиницу использую только в особых случаях, если нужен какой-либо служебный вывод информации, состояние ошибок, сообщений и т.д.

Читайте также  Сенсорный выключатель подсветки

ЧТО ТАКОЕ И С ЧЕМ ЕГО ЕДЯТ!

Наблюдая за тем, как мой друг увлеченно работает с «Ардуино», сам решил освоиться с данными девайсами. Посмотрев разнообразие модулей, и перечень микроконтроллеров, которыми «заряжены» ардуино-боарды, удивился тем, что на них стоят Atmel-камни. Меня честно порадовало Arduino Mega2560 и особенно Arduino Due c микроконтроллером ATSAM… . Кстати, на руках оба девайса.
Так дошло получилось, что это первый TFT-экран с которым я начал работать. Размер небольшой – всего 480х320 3.2 дюйма + отсутствует сенсор, и конечно по сравнению с экранами на контроллере SSD1963 (4.3’, 5.0’, 7.0’) — он маленький. Использовать библиотеку UTFT не составило сложности, и потратив некоторое время по набиванию кода в среде arduino-IDE 1.6.0, я разобрался с основными механизмами по выводу графики и текста на экран. Понравился тот факт, что среда поддерживает С++, и что самое замечательное – библиотека UTFT (и остальные ее производные), написаны на С++. Это дает всю гибкость программирования.
Собственно что качается радиотехнической части дисплея, то он не сенсорный, имеет 16-разрядную шину данных и линии управления.

Так же на борту имеется слот для подключения флэш-карточки. Угол обзора довольно приличный — на 50-60 изображение не мутнеет.
Вобщем кратко обрисовал небольшое вступление и теперь перейдем к основному вопросу — как вывести кирилицу на экран используя библиотеку UTFT. Основная плата процессора при осуществлении доработки библиотеки — Arduino Mega2560.

РЕШЕНИЕ ЗАДАЧИ

Основная идея заключается в следующем:

1. Добавить в файл DefaultFonts.c (каталог UTFT) таблицу с символами и кирилическими буквами — имя массива BigFontRus (можно любое название).

2. Написать два массива в файле реализации UTFT.cpp: первый массив содержит символы и кирилические буквы, второй массив содержит десятичные числа, по которым собственно и будет извлекаться символ из таблицы символов BigFontRus.

3. Добавить функцию tftChar, в которой будет реализован основной механизм определения символа и буквы кирилицы с последующим выводом его на экран TFT.

Теперь по порядку разъясню что к чему. По каждому пункту буду расписывать более подробно насколько сам освоил данный материал. И так:

По пункту 1. имеем — вывод символом осуществляется соответственно из файла DefaultFonts.c, но можно и другой файл создать, например RusFont.c и поместить туда таблицу символов и букв — в любом случае необходимо в программе указать шрифт, а откуда он берется не имеет значение. Ну и есть нюанс — символы, т.е. байты символом в массиве расположены несколько по иному — символ разделен попалам и половинки развернуты. На рисунке видно о чем речь (размер символа 16х16):

Так что рисовать шрифты в таком виде обернется большой рутиной. Необходим софт, который позволит конвертировать «правильный символ» в перевернутый. Лично такую утилиту не видел, но при должном понимании ее можно сваять самому.

По пункту 2. имеем — два массива соответственно с символами и байтами. Код этих массивов имеет вид:

С символами все понятно. Что же за цифры во втором массиве и почему начинаются с 32 по 135? Ответ: в таблице символов указано смещение 0х20 и оно как раз 32. Соответственно символы начинаются с 32-й позиции. Но это не проблема, можно поменять смещение на 0х00 и переписать массив байтов начиная с 0 по 103. Решил не переделывать :). Как используются данные массивы разъясню ниже.

По пункту 3. имеем — собственно так сказать СЕРДЦЕ всего содеянного с библиотекой UTFT. В методе tftChar осуществляется механизм определения символа и вывод символа из таблицы на экран посредством штатного метода printChar. Реализация метода tftChar имеет вид:

Такую реализацию я уже делал в несколько простом исполнении в статье доработка библиотеки lcd.h среды CodeVisionAVR 3.12. Собственно эту идею я использовал и здесь, и в библиотеке LCD5110_Graph, но о ней будет другая статья. И так по порядку — метод tftChar принимает три параметра:

— Символ (с). Это тот самый кирилический символ, который необходимо вывести.
— х координату вывода символа.
— y координату вывода символа.

Вся работа выолняется в цикле While, условием выполнения которого является несовпадение поступившего символа с с элементом массива character_rus — таким образом осуществляется поиск символа в массиве. Соотвественно при работе цикла происходит инкремент счетчика s. Счетчик позволяет перемещаться по элементам двух массивов. Выглядит это таким образом — пока символ с не совпадает с символом из массива, цикл работает, счетчик s инкрементируется до тех пор, как только символ найдется и далее по счетчику находим байт, и отправляем его в метод printChar. Если символ не нашли, то соответственно счетчик достигает максимального значения, при котором цикл завершается и условие if не выполняется. С помощью счетчика i умножив на ширину символа мы задаем шаг вывода символов, т.к. ширина 16 пикселов, то соответственно через 16 и должны выводить, иначе будет визуальный дефект «слипших символов». И если вы вдруг решите сделать свой шрифт, скажем размером 32х32, то в таблице символов (DefaultFonts.c) необходимо задать размер символа во избежании проблем с выводом. И еще один момент — условие if помагает избавиться от отображения мусора, который меня долгое время мучил и я не понимал почему так происходит. Оператор if меня избавил от этой напасти!
Думаю покумекав можно разобраться что к чему 😉

Проверить символы (с выбраным шрифтом соответственно в основном скетче среды) в файле DefaultFonts.c можно таким образом:

Параметром являются числа, которыми являются позиции символов в таблице. Это числа от 32 по 135 при задании шрифта BigFontRus. И вообще, таким образом можно проверять любые таблицы с символами.

РЕШЕНИЕ ЕЩЕ ОДНОЙ ЗАДАЧИ. ВЫВОД СТРОК

Теперь самое интересное — как выводить строки при помощи указателя и собственно параметром метода? Для начала какие методы нужно дописать в классе UTFT в файле UTFT.h. Методы имеют вид:

Первый метод позволяет выводить строки из указателя, т.е. так —

char *dht = «Влажность,%» ;
//и далее собственно
g.textRus(dht, 0, 19);

Второй метод позволяет выводить строки с указанием в параметре, т.е. так —

g.textRus( «Напряжение,В» , 0, 19);

Третий метод позволяет выводить символы из массива символов, которые предварительно прописаны в основном скетче программного проекта, т.е. так —

sizeof(dht) — указываем размерность массива (параметр length). Этот метод можно вообще удалить, но я не стал, оставил для каких либо нужд. Вообще этот метод я реализовал решив, что другого способа вывода кирилицы не найдется, т.к. через указатель долгое время не получалось осуществить вывод — вместе с символами отображался «мусор». Поэтому очаявшись хотел поставить на указателях крест, применив данный метод, даже утилитку сваял в среде Visual Studio 2008 C# для создания массива символов:

Ну и конечно собственно методы вывода строк, о которых я писал выше имеют такой вид:

Читайте также  Вторая жизнь air wick или даешь свежий воздух - 2

Метод void UTFT::textRus(char *st, int x, int y) принимает указатель на строку и все действо происходит в цикле, и пока не «попадется» символ нуль-терминатора каждый символ по инкременту указателя *st будет передаваться в метод tftChar. По окончанию цикла обнуляем счетчик i.

С методом void UTFT::textRus(String st, int x, int y) я особо не заморачивался и взял готовую реализацию из библиотеки.

На доработку библиотеки по выводу кирилицы я потратил где-то две недели, и когда мне все-таки удалось реализовать все «по-человечьи», я осознал, что мог это сделать за пару дней 🙂 «. мысля приходит опосля. «

Так выглядит физическая часть доработки. Качество фото конечно не лучшее.

uri02 › Блог › Подключение ST7789 к STM32F103C8T6.

Контроллер ST7789
Разрешение 240×240
Глубина цвета 16 бит
Интерфейс подключения SPI без CS
Ток потребления с подсветкой 26 мА
Диагональ 1.3″

Входы ST7789
1) GND -земля
2) VCC — 3.3V Питание
3) SCK — SPI SCK Тактовоя частота SPI
4) RES — сброс «0» — сброс, «1» — работа.
5) SDA — SPI MOSI Линия передачи данных от STM32
6) DC — Data Command «0» — команда, «1» — данные
7) BLK — 3.3V Подсветка. 1(3.3В)-ярко. 0 (0.0В)-без подсветки.
Логический ноль 0 — 0 вольт, 1- 3.3 вольта
Выходы STM32F103C8T6, SPI1
1)A7 MOSI (Master Out / Slave In) — по этому проводу данные передаются от STM32 к ST7789.
2)A6 Не используем MISO (Master In / Slave Out) — а тут наоборот: данные идут от ST7789 к ведущему
STN32

3)A5 SPI SCK SCK (Serial Clock) — тактовый сигнал, который идет от STM32 к ST7789.
4)A4 аппаратная работать с выводом NSS. Не работает. Не используем. NSS (Slave select) — необязательный провод, нужен в случае, если у нас на шине SPI висит несколько ведомых устройств.
Подключение по интерфейсу SPI ST7789 и stm32 SPI1
GND -> Земля
VDD -> +3.3В
SCK -> PA5 SPI1_CLK (Serial Clock)
SDA -> PA7 MOSI (Master Out / Slave In)
RES -> PA1 RESET
DS -> PA2 DS

Передача команд и данных

Программирование
Все программирование сводится к передаче байтов команд и данных в дисплей.
Самая главная команда прорисовки пикселя на экране. Все остальные (нарисрвать фигуры линии, символ)
пляшут от первой. Расбиратся во всех командах трудоемко.
Я использовал готовый пример библиотеку
YouTube-channel: www.youtube.com/channel/UChButpZaL5kUUl_zTyIDFkQ

Там же были программные тесты вывод графики текста и тп. Проверим

Тесты работают. Мне потребуется выводить текст вольты амперы и тп. Принципиальных проблем с этим нет.
Оставшиеся проблемы
Разрешение 240 *240 более чем достаточно выводить 10 строк шрифтом размером 32.
Но маленький экран 1.3 дюйма очень мелко получается.
Набор шрифтов 8*8 полный (все символы). а вот 32 не полный Только цифры.
Если сделать свой шрифт, он пиксельный, займет много памяти.
Дальнейшие проблемы и пути их решения
Не устойчивая работа на высокой частоте
При высокой скорости (частоте) работа была не устойчива.
То есть при задании делителя в 2
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
это получается 72 мГц делим на два получаем 31 МГц (где то ошибся, ну ладно)
или не работал или работал не устойчиво. Любое прикосновение к проводам и экрану сбрасывало его.
Экранировал провод, проблемы исчезли. Работает стало очень устойчиво.

Для ускорения прорисовки немного подправил алгоритм.
В указанной библиотеке любой символ рисовался командой прорисовки пикселя.
Это два байта адреса пикселя (координаторы X Y) и два байта цвет.
Заменил таким алгоритмом (командаCASET ) — заполнение квадратной области.
В начале передаем 4 байта координаторы (XY начало и XY конец) далее массив данных только цвет
Это скорость примерно в два раза увеличило.

Проблема со шрифтами
Первая проблема заключалась в том что экран мелкий. Если использовать размер 6.8 пикселе видно плохо.
В приведенной библиотеке имелись шрифты f6x8m.c(6 на 8 пикселей) f16f.c f24f.c f32f.h
В принципе f32f.h(высота 32 ширина 16 пикселей) можно использовать.
Для шрифтов f6x8m.c(6 на 8 пикселей) f16f.c полный набор символов, а для f24f.c f32f.h только цифры.
И это не спроста. Таблицы шривтов жоут драгоценную память. И жрут хорошо.
Во первых шрифт задан в виде

Крупным шрифтом собираюсь вы водить только цифры (вольты амперы)
В принципе 32*16 возможно маловато.
Решил программно промаршировать, увеличить в два раза.
Алгоритм простой. По горозизотали передаю один и тот же пиксель не один а два раза.
А по вертикали передаю не одну строку а две оди и теже.
Зернистость немного полезла. Но вид вполне респектабельный

Тормоза при работе АЦП
При работе АЦП (хоть по прерыванию, хоть по DMA) появились сильные тормоза.
Прорисовка экрана сильно замедлилась.
Пока решил проблему так, на период прорисовки (раз в секунду) отключаю прерывания
//Отключаю прерывания
HAL_NVIC_DisableIRQ(DMA1_Channel1_IRQn);
//рисую на экран
//Включаю прерывания
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
Это не очень красивое решение. Но другово не придумал.
Тем более хотел программно реализовать защиту по току.
АЦП несколько тысяч раз в секунду измеряет. Скачек тога должен был фиксировать не
медленнее аналоговой защиты по току. Во всяком случае я так думал.
===2021-01-14
Разработал генератор шрифтов для миктоеотролеров


Работа с цветными графическими дисплеями TFT (библиотека UTFT)

Библиотека

Поддерживаемые дисплеи

Дисплеи Инициализация
Цветной графический дисплей 2.8 TFT 320х240   Данный дисплей совместим с любыми Arduino.

UTFT myGLCD(TFT01_24SP, 6, 5, 4, 3, 2);

Дисплей можно подключать к любым выводам Arduino указав № выводов при объявлении объекта myGLCD библиотеки UTFT:
UTFT myGLCD(TFT01_24SP, SDI/MOSI, SCK, CS, RESET, DC/RS);

На дисплее установлен преобразователь уровней, так что его можно подключать и к 3В и к 5В логике.

Описание работы с сенсорным экраном находится в разделе Wiki работа с TouchScreen

UTFT myGLCD(TFT32MEGA, 38, 39, 40, 41); // дисплей на чипе ILI9341.
или
UTFT myGLCD(TFT32MEGA_2, 38, 39, 40, 41); // дисплей на чипе HX8357C.

Дисплеи поставляются на базе чипа ILI9341 или HX8357C. Если изображение на дисплее отображается зеркально, то измените тип дисплея: укажите либо TFT32MEGA, либо TFT32MEGA_2.

Если Вы не планируете использовать SD карту, то выводы 50-53 можно использовать для подключения других модулей.

Выводы не подписанные на рисунке, не используются дисплеем.

UTFT myGLCD(TFT28UNO, A2, A1, A3, A4, A0);

Если Вы не планируете использовать SD карту, то выводы 10-13 можно использовать для подключения других модулей.

Выводы не подписанные на рисунке, не используются дисплеем.

Описание работы с сенсорным экраном находится в разделе Wiki работа с TouchScreen

UTFT myGLCD(TFT01_24SP, 5, 4, 8, 7, 6);

Дисплей можно подключать к любым выводам Arduino указав № выводов при объявлении объекта myGLCD библиотеки UTFT:
UTFT myGLCD(TFT01_24SP, SDI/MOSI, SCK, CS, RESET, DC/RS);

Уровень логической «1» на входах дисплея ≤ 3,3 В.
Если Вы используете 5 В логику, то подключайте входы дисплея через делители:

При питании от 3,3 В необходимо замкнуть перемычку J1 на обратной стороне платы дисплея.

Если Вы желаете использовать SD-карту, то выводы SD_CS, SD_MOSI, SD_MISO и SD_SCK необходимо подключить к Arduino по аппаратной шине SPI:

Если аппаратный вывод CS(SS) Arduino занят, то вывод SD_CS можно подключить к любому другому выводу Arduino, указав его номер в скетче (см пример в файле image_SD библиотеки UTFT).

TouchScreen можно подключать к любым выводам Arduino указав № выводов при объявлении объекта myTouch библиотеки URTouch:
URTouch myTouch( T_CLK, T_CS, T_DIN, T_OUT, T_IRQ);
Например: URTouch myTouch(13, 12, 11, 10, 9);

Указанные в примере выводы Arduino для подключения TouchScreen пересекаются с выводами аппаратной шины SPI на платах Arduino Uno, Pro Mini, Nano и т.д. Если Вы желаете использовать на этих платах и TouchScreen, и SD-карту , то для TouchScreen нужно выбрать другие выводы Arduino, например, аналоговые выводы A0-A4, указав их в скетче при объявлении объекта:
URTouch myTouch(A0, A1, A2, A3, A4);

Описание работы с сенсорным экраном со встроенным контроллером функций TouchScreen находится в разделе Wiki работа с TouchScreen по последовательной шине данных.

UTFT myGLCD(TFT01_22SP, 5, 4, 8, 7, 6);

UTFT myGLCD(TFT18SHLD, 5, 4, 8, 7, 6);

Дисплей можно подключать к любым выводам Arduino указав № выводов при объявлении объекта myGLCD библиотеки UTFT:
UTFT myGLCD(TFT01_22SP, SDI/MOSI, SCK, CS, RESET, DC/RS);

Уровень логической «1» на входах дисплея ≤ 3,3 В.
Если Вы используете 5 В логику, то подключайте входы дисплея через делители:

Если Вы желаете использовать SD-карту, то выводы SD_CS, SD_MOSI, SD_MISO и SD_SCK необходимо подключить к Arduino по аппаратной шине SPI:

Если аппаратный вывод CS(SS) Arduino занят, то вывод SD_CS можно подключить к любому другому выводу Arduino, указав его номер в скетче (см пример в файле image_SD библиотеки UTFT).

Если Вы собираетесь использовать библиотеку UTFT для работы с другими дисплеями, то закомментируйте строку с названием Вашего дисплея в файле «memorysaver.h». А для экономии памяти, раскомментируйте остальные строки кода файла «memorysaver.h».

#1 Пример

Выводим на дисплей текст тремя базовыми шрифтами:

#2 Пример

Заливаем весь дисплей различными цветами:

#3 Пример

Рисуем различные графические элементы:

Базовые функции:

Все функции:

  • InitLCD([положение]); – Инициирует начало работы с дисплеем. Необязательный параметр может принимать одно из двух значений: PORTRAIT (вертикальная ориентация) или LANDSCAPE (горизонтальная ориентация — по умолчанию).
  • clrScr(); – Очищает дисплей, стирая всю отображаемую на дисплее информацию и заливая дисплей черным цветом.
  • fillScr(color); – Очищает дисплей, стирая всю отображаемую на дисплее информацию и заливая его указанным в качестве параметра цветом фона.
  • getDisplayXSize(); – Возвращает количество пикселей дисплея по горизонтали, число типа int.
  • getDisplayYSize(); – Возвращает количество пикселей дисплея по вертикали, число типа int.
  • setColor(color); – Выбор цвета для текста и фигур, выводимых после данной функции.
  • getColor(); – Возвращает установленный цвет для текста и фигур в формате RGB565, число типа word.
  • setBackColor(color); – Выбор цвета для фона текста, выводимого после данной функции.
  • getBackColor(); – Возвращает установленный цвет для фона текста в формате RGB565, число типа word.
  • setFont(fontName); – Выбор шрифта для текста выводимого после данной функции.
  • getFont(); – Возвращает указатель на выбранный шрифт.
  • getFontXsize(); – Возвращает количество пикселей в одном символе шрифта, по ширине.
  • getFontYsize(); – Возвращает количество пикселей в одном символе шрифта, по высоте.
  • print(str,x,y[,r]); – Вывод на дисплей строк или содержимого строковых переменных.
  • printNumI(int,x,y[,len[,sym]]); – Вывод на дисплей целого числа или содержимого целочисленной переменной.
  • printNumF(float,dec,x,y[,sym1[,len[,sym2]]]); – Вывод на дисплей вещественного числа или содержимого переменной вещественного типа
  • drawPixel(x,y); – Вывод на дисплей точки. Цвет точки определяется текущим значением цвета, устанавливаемым командой setColor().
  • drawLine(x1,y1,x2,y2); – Вывод на дисплей линии, заданной координатами двух точек.
  • drawRect(x1,y1,x2,y2); – Вывод на дисплей прямоугольника, противоположные углы которого заданы координатами двух точек.
  • drawRoundRect(x1,y1,x2,y2); – Вывод на дисплей прямоугольника со скругленными углами.
  • fillRect(x1,y1,x2,y2); – Вывод на дисплей закрашенного прямоугольника.
  • drawCircle(x,y,R); – Вывод на дисплей окружности, определяемую координатами центра и радиусом.
  • fillCircle(x,y,R); – Вывод на дисплей закрашенной окружности.
  • drawBitmap(x1,y1,x2,y2,data[,scale]); – Вывод на дисплей картинки из массива.
  • Для вывода на дисплей картинки из файла с SD-карты нужно вызвать функцию load(x1,y1,x2,y2,data); объекта библиотеки UTFT_SdRaw.
    Для работы функции load, нужно установить и подключить библиотеки: UTFT_SdRaw и SdFat.

Инициализация работы с дисплеем:

InitLCD(PORTRAIT); // инициализация (вертикальное положение)

Очистка экрана:

clrScr();
Очистка экрана с заливкой дисплея чёрным цветом
Параметр: Без параметров.
fillScr( color );
Очистка экрана с заливкой заданным цветом.

fillScr(VGA_RED); // красный цвет

Выбор цвета:

setColor(0,0,255); // синий цвет

setBackColor(2016); // зелёный цвет

Удобнее всего устанавливать цвет по его названию:
Полный перечень цветов: VGA_BLACK, VGA_WHITE, VGA_RED, VGA_GREEN, VGA_BLUE, VGA_SILVER, VGA_GRAY, VGA_MAROON, VGA_YELLOW, VGA_OLIVE, VGA_LIME, VGA_AQUA, VGA_TEAL, VGA_NAVY, VGA_FUCHSIA, VGA_PURPLE, VGA_TRANSPARENT.

Выбор шрифта:

setFont(SmallFont); // маленький шрифт

Вывод текста:

print(«iarduino», 50, 50); // текст «iarduino» горизонтально
print(«iarduino», 50, 50, 90); // текст «iarduino» вертикально

printNumI(2000,50,50); // результат: «2000»
printNumI(2000,50,50,0); // результат: «2000»
printNumI(2000,50,50,5); // результат: » 2000″
printNumI(2000,50,50,6,’0′); // результат: «002000»

printNumF(-234.3442,2,50,50); // результат «-234.34»
printNumF(-234.3442,3,50,50); // результат «-234.344»
printNumF(-234.3442,4,50,50,’*’); // результат «-234*3442»
printNumF(-234.3442,1,50,50,’,’,1); // результат «-234,3»
printNumF(-234.3442,1,50,50,’,’,7); // результат » -234,3″
printNumF(-234.3442,1,50,50,’,’,7,’0′); // результат «-0234,3»

Как создать свои шрифты для TFT дисплея

Многим пользователям библиотеки UTFT иногда бывает не достаточно базовых шрифтов для отображения информации на TFT дисплее и я сегодня расскажу и покажу как создать свои шрифты.

Дисплей покупал в Китае по ссылке ниже

Для начала нам потребуется найти и скачать необходимый шрифт из интернета, я нашел на сайте xfont.ru шрифт Deutsch Gothic Regular и скачал его.

Шрифт Deutsch Gothic Regular

Потом в Windows 7 переходим по пути ПускПанель управленияВсе элементы панели управленияШрифты и переносим в папку наш файл шрифта ( шрифт будет скопирован и установлен)

Открываем любой графический редактор , я пользуюсь Adobe Fireworks и создаем в нем новый документ с произвольным размером (например 800 х 600 px) и пользовательским цветом холста (черного цвета ).

Потом отображаем сетку (grid), для удобного пользования…

после отображения сетки редактируем ее ( выбираем редактировать сетку)

Хочу заметить что от размера шрифта которым мы хотим создать зависит размер сетки… Размер по ширине должен составлять число которое делится на 8. Например, мы будем создавать средний шрифт шириной 32 px, тогда для ширины пропишем 32 px и для высоты 10 px.

Теперь пишем текст в произвольном месте нашим шрифтом с размером шрифта 32

потом обрезаем холст до размеров высоты 64 px и ширины 320 px (ширина равна 10 символам по 32 px , а высота произвольная но не меньше ширины 2 символов)

потом перетаскиваем наш символ в видимую область фона слева по сетке и выравниваем его. Для удобства увеличиваем масштаб до 300%.

как мы видим , размер шрифта 32 в настройках шрифта маловат , и мы уже визуально меняем размер и выравниваем символ по сетке для оптимального отображения.

добавляем символы от 0 до 9 и уменьшаем высоту холста на 10 px

и после всего сохраняем файл в формате PNG32 с именем DGR

  • выбираем наш шрифт DGR в строке Picture to make font from:
  • выбираем тип шрифта в строке Font Type:
  • жмем Make File

через несколько секунд все готово

скачиваем наш файл и теперь создаем тестовый скетч для проверки отображения шрифтов…