🔍 Календар - годинник на STM32F103 + TFT LCD 1.44" / 1.3"

А так виглядає макет Календаря - годинника.

🌅 STM32F103 TFT LCD Calendar - Clock PNG STM32F103_Smart_ Calendar_Clock.png
Звичайне зображення
📄 Статичне зображення без збільшення

Обидва LCD підключені через інтерфейс SPI.

Для встановлення поточного локального часу до STM32F103 Smart модуля підключено BlueTooth модуль HC-06 через інтерфейс USART2.

🌅 HC-6 Bluetooth module PNG HC-6.png
Звичайне зображення
📄 Статичне зображення без збільшення

Код програмного зобезпечення (ПЗ) створений мовою С з використанням бібліотеки 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 ми бачимо вікно:

🌅 GLCD_Font_Creator Step 1 BMP GLCD_Font_Creator_1.bmp
Звичайне зображення
📄 Статичне зображення без збільшення

Нажимаємо послідовно File->New Font->Import an existing System Font->Arial:

🌅 GLCD_Font_Creator Step 2 BMP GLCD_Font_Creator_2.bmp
Звичайне зображення
📄 Статичне зображення без збільшення

Нажимаємо ОК, далі обираємо діапазон кодів символів:

🌅 GLCD_Font_Creator Step 3 BMP GLCD_Font_Creator_3.bmp
Звичайне зображення
📄 Статичне зображення без збільшення

Тут необхідні пояснення для вибору діапазону індексів символів. Чому 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" в попередньому вікні буде виведено вікно з згенерованими шрифтами:

🌅 GLCD_Font_Creator Step 4 BMP GLCD_Font_Creator_4.bmp
Звичайне зображення
📄 Статичне зображення без збільшення

Найменший UNICODE код 103010 з діапазону 103010 115710 відповідає символу "I". Решта символів з "іІїЇ'" також попадають в цей діапазон.

Можна рухами в лівому вікні розглянути піксельне зображення кожного символу.

Тепер клацання на "Export for TFT and new GLCD (new library)" згенерує С файл з масивом згенерованих символів шрифта Arial28:,/p>

🌅 GLCD_Font_Creator Step 5 BMP GLCD_Font_Creator_5.bmp
Звичайне зображення
📄 Статичне зображення без збільшення

Цей масив треба скопіювати і додати до файлу проєкту програмного забезпечення Календаря - годинника.

Як використовувати цей файл, буде розглянуто нижче.

Тепер розглянемо реалізацію кода. Дерево проєкту, створеного в Keil, показано нижче:

🌅 Tree Project PNG Tree_Project
Звичайне зображення
📄 Статичне зображення без збільшення

Масив, який був створений у GLCD_Font_Creator, покладений у fonts.c

🐍 font.c: myFont_ukr[] 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)
					

💬 Обговорення 0 повідомлень

Завантаження обговорення...

💡 Серверне зберігання: Всі повідомлення зберігаються на сервері. Інші користувачі бачитимуть їх одразу після публікації.

✅ Дані збережено