Детальні інструкції з проєктування та програмування.Метою цієї статті є пояснення і демонстрація схемної реалізації і ключових частин коду для створення комбінованого календаря - годинника локального часу з використанням МК STM32F103 і TFT LCD 1.44"/1.3".
Проєкти годинника на базі STM32F103 або іншого мікроконтролера (МК) лінійки STM32F детально представлена на сторінках інтернету.
Прикладом може бути чудовий сайт https://blog.avislab.com/, де викладені детальні інструкції з створення коду для підключення до МК STM32F103 періферії з використанням бібліотеки HAL. І все ж часто у студентів, що вивчають можливості MK серії STM32F, виникають проблеми з застосуванням HAL і реалізації на її основі схем підключення і програмування периферійного обладнання. Метою цієї статті є пояснення і демонстрація схемної реалізації і ключових частин коду для створення комбінованого календаря - годинника локального часу з використанням МК STM32F103 і TFT LCD 1.3" 240x240 ISP / 1.44" 128x128 SPI. Структурно схема реалізована на модулі STM32F103 Smart з підключенням до нього TFT LCD 1.3” 240x240 ISP або TFT LCD 1.44" 128x128 SPI.
Схема підключення TFT LCD 1.3" 240x240 до STM32F103 Smart.
Для деталізації наведіть маркер на елементи схеми, щоб збільшити зображення.
Схема підключення TFT LCD 1.44" 128x128 до STM32F103 Smart.
Зверніть увагу, піни розніму FT LCD 1.44" 128x128 і TFT LCD 1.3" 240x240 розведені по різному. Чому для сигналу RESET обрано PA7? Тому що пін J2.15 знаходиться на одній лінії з контактами розніму J6 плати STM32F103 Smart і це зручно для розташування Перехідної плати підключення LCD.
Назви рознімів J2 та J2 відповідають назвам рознімів у документі - специфікації плати STM32F103 Smart
А так виглядає макет Календаря - годинника.
Обидва LCD підключені через інтерфейс SPI.
Для встановлення поточного локального часу до STM32F103 Smart модуля підключено BlueTooth модуль HC-06 через інтерфейс USART2.
Код програмного зобезпечення (ПЗ) створений мовою С з використанням бібліотеки HAL. Особливістю програмного забезпечення реалізованого календаря - годинника є універсальний алгоритм формування символьних таблиць фонтів української або інщих мов різних розмірів та конфігурація поточного значення часу та дати через радіоканал стандарту BlueTooth від розробленого Android додатку.
В цій статті немає покрокового опису всіх рядків коду, але приведено детальне пояснення блоків коду, які вимагають розуміння особливостей реалізації функцій календаря - годинника.
Почнемо з використаного алгоритму формування таблиць фонтів, що можуть використовуватися для виводу текстової інформації на екран TFT LCD (Thin Film Transistor Liquid Crystal Display). TFT LCD керує кожним пікселем окремо.
В інтеренеті локалізовано велику кількість сформованих таблиць фонтів LCD, але всі вони вже мають конкретну реалізацію мови, розміру і стилю. І якщо виникає необхідність змінити стиль, мову або розмір виникає потреба пошуку іншої реалізації. Хотілося б мати універсальний алгоритм формування таблиці необхідного фонту, який би відповідав експлуатаційним вимогам. Існує величезна кількість розроблених ttf (TrueType) фонтів і додатків (платних і безкоштовних), які дозволяють використовувати існуючі ttf фонти для генерування растрових фонтів. Більшість із них генерують таблицю фонтів у вигляді байт-масивів C-формата. Один з них GLCD Font Creator (https://www.mikroe.com/glcd-font-creator) генерує з введеного ttf фонту С-масив байтів необхідної таблиці, який і використовується в коді ПЗ календаря - годинника.
Розглянемо цей процес детальніше на прикладі генерування растрового коду з ttf фонту Arial розміром 28, тобто Arial28. Число 28 означає 28 пунктів (Pt) по висоті.
Пункт(Pt) - лінійний розмір (тільки на в мм, а долях дюйма). Розмірність Pt - 1/72 дюйма (0,35 мм). 1 дюйм = 25,4 мм. Це, якби ми мали лінійку, оцифровану в 1/72 дюймів, і поміряли б на екрані LCD висоту символа з висотою 28 Pt, це було б число 28.
Піксель (Px) - це просто число. Наприклад, якщо взяти екран з висотою 4 дюйма (101,6 мм), а його роздільна здатність по висоті 480 Px, це означає, що по висоті можна відобразити 480 найменших одиниць зображення.
При цьому лінійний розмір найменшої одиниці зображення по висоті буде 4/480 = 0,0083 дюйма = 0,0083х72= 0,6 Pt.
Яку ж кількість сиволів з розміром 28 Pt можна розмістити по висоті на цьому екрані? 4/0,6 = 6 символів.
LCD Font Creator при генеруванні мережі стовпчиків і рядків рамки для зображення всіх з заданого діапазону UNICODE кодів враховує висоту 28 Pt так, щоб будь який символ по висоті і ширині вмістився в цю рамку.
Мікроконтролер буде передавати до LCD пікселі зображення. Для LCD's з фіксованими геометричними габаритами екрану і вищою роздільною здатністю воно буде меньшим, з для LCD з нижчою роздільною здатністю - меньшим.
Після запуску GLCD Font Creator ми бачимо вікно:
Нажимаємо послідовно File->New Font->Import an existing System Font->Arial:
Нажимаємо ОК, далі обираємо діапазон кодів символів:
Тут необхідні пояснення для вибору діапазону індексів символів. Чому From 1030 To 1157 ?. Для охоплення всіх мов для кодування символів використовується стандарт кодування UNICODE, в якому код кожного символа складається з 11-бітних слів і поділяється на дві частини - лівих 5 бітів і правих 6 бітів. Кодування символа у форматі UTF8 відбувається дописуванням двійкового коду 110 зліва до лівих 5 бітів і двійкового коду 10 зліва до правих 6 бітів. Наприклад UNICODE код української заглавної літери А є в десятковій системі:
104010 = 0x041016
або в двійковій:
100 0001 00002
Ліва частина коду UNICODE 100002 доповнюється зліва кодом 1102. отримуємо старший байт UTF8 коду 110100002 = 0xD016
Права частина коду UNICODE 0100002 доповнюється зліва кодом 102. отримуємо молодший байт UTF8 коду 100100002 = 0x9016
Простіше кажучи UNICODE код - це послідовний номер позиції символа А в таблиці символів UNICODE, а код 0xD09016 - це UTF8 код, утворений описаним вище способом. При визначенні в коді програмування ASCII кода літери А ми отримаємо значення 0xD09016. Розуміння цього дуже важливе для визначення по таблиці кодів символів послідовності байт, що описують піксельне графічне зображення символа. Нижче буде показано, як це використовується в коді.
Для виводу тексту на LCD використовуються символи української мови, в якій є символи крім символів кирилиці ще символи "іІїЇ'". Всі симовли, що можуть бути використані в текстах виводу повинні знаходитися в нерозривному послідовному масиві номерів UNICODE кодів.
Після клацання на "OK" в попередньому вікні буде виведено вікно з згенерованими шрифтами:
Найменший UNICODE код 103010 з діапазону 103010 115710 відповідає символу "I". Решта символів з "іІїЇ'" також попадають в цей діапазон.
Можна рухами в лівому вікні розглянути піксельне зображення кожного символу.
Тепер клацання на "Export for TFT and new GLCD (new library)" згенерує С файл з масивом згенерованих символів шрифта Arial28:,/p>
Цей масив треба скопіювати і додати до файлу проєкту програмного забезпечення Календаря - годинника.
Як використовувати цей файл, буде розглянуто нижче.
Тепер розглянемо реалізацію кода. Дерево проєкту, створеного в Keil, показано нижче:
Масив, який був створений у GLCD_Font_Creator, покладений у fonts.c >
# Клас для роботи з вектором
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x,
self.y + other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(2, 3)
v2 = Vector(4, 5)
v3 = v1 + v2
print(v3) # Vector(6, 8)
💡 Серверне зберігання: Всі повідомлення зберігаються на сервері. Інші користувачі бачитимуть їх одразу після публікації.