Display: Дисплей
Display
-
Display lilka::display
Екземпляр класу
Display, який можна використовувати для роботи з дисплеєм. Вам не потрібно інстанціюватиDisplayвручну.
-
class Display : public Arduino_ST7789, public lilka::GFX<Display>
Клас для роботи з дисплеєм.
Дивись також
Використовується для відображення графічних об’єктів.
Цей клас наслідує
Arduino_GFXз бібліотекиArduino_GFX_Library, а також класGFX.Детальніше про доступні методи можна дізнатися в документації бібліотеки
Arduino_GFX_Library- https://github.com/moononournation/Arduino_GFX.#include <lilka.h> void setup() { lilka::begin(); } void loop() { lilka::display.fillScreen(lilka::colors::Red); // Заповнити екран червоним кольором lilka::display.setCursor(32, 32); lilka::display.setTextColor(lilka::colors::Green); // Зелений текст lilka::display.print("Привіт, Лілка!"); }
Public Functions
-
void begin()
Почати роботу з дисплеєм.
Попередження
Цей метод викликається автоматично при виклику
lilka::begin().
-
void showStartupScreen()
Відобразити вітальний екран Лілки.
Цей метод відображає зображення, встановлене за допомогою
setSplash(). За замовчуванням це вітальний екран Лілки.Дивись також
Примітка
Цей метод викликається автоматично при виклику
lilka::begin(), якщоLILKA_NO_SPLASHне встановлено вtrue.
-
void setSplash(const void *splash, uint32_t rleLength = 0)
Встановити зображення, яке буде відображатися при запуску.
За замовчуванням відображається вітальний екран Лілки.
Його потрібно викликати перед викликом
lilka::begin()або не викликати взагалі.Примітка
Якщо викликати цей метод, то вітальний екран буде відображатись навіть якщо
LILKA_NO_SPLASHвстановлено вtrue.- Параметри:
splash – Масив 16-бітних кольорів (5-6-5) з розміром 280*240 (або масив байтів, закодованих алгоритмом RLE, з довжиною rleLength).
rleLength – Якщо використовується RLE-кодування, цей аргумент вказує довжину масиву splash. Зображення повинне бути згенероване за допомогою утиліти
sdk/tools/image2codeз прапорцем--rle.
-
uint16_t color565hsv(uint16_t hue, uint8_t sat, uint8_t val)
Перетворити HSV колір в 16-бітний формат.
- Параметри:
hue – Тон (0-360).
sat – Насиченість (0-100).
val – Яскравість (0-100).
- Повертає:
16-бітний колір.
-
void begin()
Canvas
-
class Canvas : public Arduino_Canvas, public lilka::GFX<Canvas>
Клас для роботи з графічним буфером. Він наслідує клас
Arduino_Canvasз бібліотекиArduino_GFX_Library, а також класGFX.Дивись також
При частому перемальовуванні екрану без використання буфера може спостерігатися мерехтіння. Наприклад, якщо використовувати метод
fillScreenдля очищення екрану перед кожним викликомprint, то текст буде мерехтіти.Щоб уникнути цього, можна використовувати графічний буфер. Цей клас дозволяє малювати графічні об’єкти на буфері, а потім відобразити його на екрані за допомогою методу
lilka::display.drawCanvas. Фактично, цей клас і є графічним буфером.Такий підхід дозволяє зменшити мерехтіння, але збільшує використання пам’яті. Він називається «буферизація», оскільки ми спершу малюємо на буфері, а тоді відображаємо буфер на екрані.
Цей клас, як і
Display, є підкласомArduino_GFXз бібліотекиArduino_GFX_Library. Це означає, що майже всі методи, які доступні вDisplay, також доступні вCanvas.#include <lilka.h> void setup() { lilka::begin(); } void loop() { lilka::Canvas canvas; // Створити новий Canvas зі стандартним розміром (розмір дисплею) int y = 100; while (1) { canvas.fillScreen(lilka::colors::Black); // Заповнити буфер чорним кольором canvas.setCursor(32, y); canvas.setTextColor(lilka::colors::Black); // Чорний текст canvas.print("Привіт, Лілка!"); lilka::display.drawCanvas(&canvas); // Відобразити буфер на екрані - жодного мерехтіння! y++; if (y > 200) { y = 100; } } }
Public Functions
-
Canvas()
Створити буфер зі стандартним розміром (який дорівнює розміру дисплею).
-
Canvas(uint16_t w, uint16_t h)
Створити буфер з заданими розмірами.
- Параметри:
w – Ширина буфера.
h – Висота буфера.
-
Canvas(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
Створити буфер з заданими розмірами та позицією.
- Параметри:
x – Координата X лівого верхнього кута буфера.
y – Координата Y лівого верхнього кута буфера.
w – Ширина буфера.
h – Висота буфера.
-
Canvas()
GFX
-
template<typename T>
class GFX Цей клас описує спільні методи для класів
DisplayтаCanvas, оскільки вони обидва є підкласамиGFX.Public Functions
-
uint16_t color565(uint8_t r, uint8_t g, uint8_t b)
Перетворити RGB колір в 16-бітний формат.
Оскільки дисплей підтримує лише 16-бітні кольори, цей метод дозволяє перетворити 24-бітний колір в 16-бітний.
- Параметри:
r – Компонента R.
g – Компонента G.
b – Компонента B.
-
void setFont(const uint8_t *font)
Встановити шрифт.
Шрифт можна вибрати зі списку рекомендованих шрифтів:
FONT_4x6FONT_5x7FONT_5x8FONT_6x12FONT_6x13FONT_7x13FONT_8x13FONT_8x13_MONOFONT_9x15FONT_10x20FONT_10x20_MONO
Також можна використати будь-який інший шрифт з бібліотеки
U8g2: https://github.com/olikraus/u8g2/wiki/fntlistallplainlilka::display.setFont(FONT_6x12); lilka::display.setCursor(0, 32); lilka::display.print("Привіт, Лілка!");
- Параметри:
font – Вказівник на шрифт.
-
void setCursor(int16_t x, int16_t y)
Встановити курсор.
- Параметри:
x – Координата X.
y – Координата Y.
-
void setTextSize(uint8_t size)
Встановити масштаб тексту.
Якщо цей параметр дорівнює 1, текст виводиться в масштабі 1:1. Якщо 2, то кожен піксель тексту буде займати 2x2 пікселі на екрані, і так далі.
- Параметри:
size – Масштаб.
-
void setTextColor(uint16_t color)
Встановити колір тексту.
-
void setTextColor(uint16_t color, uint16_t background)
Встановити колір тексту та фону.
-
void print(...)
Відобразити текст.
lilka::display.setCursor(0, 32); lilka::display.setTextColor(lilka::colors::Black); // Чорний текст lilka::display.print("Привіт, "); lilka::display.print(String("Лілка!\n")); lilka::display.print(42);
Дивись також
- Параметри:
... – Текст.
-
void fillScreen(uint16_t color)
Заповнити екран кольором.
-
void drawPixel(int16_t x, int16_t y, uint16_t color)
Встановити колір пікселя.
-
void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color)
Намалювати лінію.
-
void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
Намалювати прямокутник.
-
void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
Намалювати заповнений прямокутник.
-
void drawCircle(int16_t x, int16_t y, int16_t r, uint16_t color)
Намалювати коло.
-
void fillCircle(int16_t x, int16_t y, int16_t r, uint16_t color)
Намалювати заповнене коло.
-
void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
Намалювати трикутник.
-
void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
Намалювати заповнений трикутник.
-
void drawEllipse(int16_t x, int16_t y, int16_t rx, int16_t ry, uint16_t color)
Намалювати еліпс.
- Параметри:
x – Координата X центру еліпса.
y – Координата Y центру еліпса.
rx – Радіус по X.
ry – Радіус по Y.
color – Колір.
-
void fillEllipse(int16_t x, int16_t y, int16_t rx, int16_t ry, uint16_t color)
Намалювати заповнений еліпс.
Дивись також
-
void drawArc(int16_t x, int16_t y, int16_t r1, int16_t r2, int16_t start, int16_t end, uint16_t color)
Намалювати дугу.
- Параметри:
x – Координата X центру дуги.
y – Координата Y центру дуги.
r1 – Зовнішній радіус дуги.
r2 – Внутрішній радіус дуги.
start – Початковий кут (в градусах).
end – Кінцевий кут (в градусах).
color – Колір.
-
void fillArc(int16_t x, int16_t y, int16_t r1, int16_t r2, int16_t start, int16_t end, uint16_t color)
Намалювати заповнену дугу.
Дивись також
-
void draw16bitRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap, int16_t w, int16_t h)
Намалювати зображення з масиву 16-бітних точок.
lilka::Image *image = lilka::resources.loadImage("image.bmp"); lilka::display.drawBitmap(0, 0, image->pixels, image->width, image->height);
- Параметри:
x – Координата X лівого верхнього кута зображення.
y – Координата Y лівого верхнього кута зображення.
bitmap – Масив 16-бітних кольорів.
w – Ширина зображення.
h – Висота зображення.
-
void draw16bitRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[], int16_t w, int16_t h)
Дивись також
-
void draw16bitRGBBitmapWithTranColor(int16_t x, int16_t y, uint16_t *bitmap, uint16_t transparent_color, int16_t w, int16_t h)
Намалювати зображення з масиву 16-бітних точок і вказати колір, який буде вважатися прозорим.
// Завантажити зображення з файлу "image.bmp", використовуючи білий колір як прозорий. lilka::Image *image = lilka::resources.loadImage("image.bmp", lilka::colors::White); lilka::display.draw16bitRGBBitmapWithTranColor( 0, 0, image->pixels, image->transparentColor, image->width, image->height );
- Параметри:
x – Координата X лівого верхнього кута зображення.
y – Координата Y лівого верхнього кута зображення.
bitmap – Масив 16-бітних кольорів.
transparent_color – Колір, який буде вважатися прозорим.
w – Ширина зображення.
h – Висота зображення.
-
void drawCanvas(Canvas *canvas)
Відобразити буфер на екрані (див.
lilka::Canvas).
-
void drawImage(Image *image, int16_t x, int16_t y)
Намалювати зображення.
lilka::Image *image = lilka::resources.loadImage("image.bmp"); if (!image) { Serial.println("Failed to load image"); return; } lilka::display.drawImage(image, 32, 64); // Звільнюємо пам'ять delete image;
- Параметри:
image – Вказівник на зображення (об’єкт класу
lilka::Image).x – Координата X осі зображення.
y – Координата Y осі зображення.
-
void drawImageTransformed(Image *image, int16_t x, int16_t y, Transform transform)
Намалювати зображення з афінними перетвореннями.
Дивись також
Примітка
Зверніть увагу, що перетворення - це повільніше, ніж звичайне малювання зображення, оскільки обчислює координати пікселів «на льоту». Використовуйте його лише тоді, коли не можете заздалегідь створити обернені копії зображеня за допомогою методів
lilka::Image::rotate,lilka::Image::flipXтаlilka::Image::flipY.- Параметри:
image – Вказівник на зображення (об’єкт класу
lilka::Image).x – Координата X осі зображення.
y – Координата Y осі зображення.
transform – Об’єкт класу
lilka::Transform, який містить матрицю перетворення.
-
uint16_t color565(uint8_t r, uint8_t g, uint8_t b)
Image
-
class Image
Зображення
Містить розміри, прозорий колір та пікселі зображення (в 16-бітному форматі, 5-6-5). Пікселі зберігаються в рядку зліва направо, зверху вниз.
Вісь зображення (pivot) - це точка, яка вказує на центр зображення. Це дозволяє вам встановити точку, відносно якої буде відображатися зображення, а також навколо якої буде відбуватися перетворення зображення.
Примітка
Основна відмінність Image від поняття «bitmap» погялає в тому, що Image містить масив пікселів, розміри зображення і прозорий колір, в той час як «bitmap» - це просто масив пікселів.
Public Functions
-
Image(uint32_t width, uint32_t height, int32_t transparentColor = -1, int16_t pivotX = 0, int16_t pivotY = 0)
Створити зображення з заданими розмірами та прозорим кольором.
Якщо
transparentColorвстановлено в-1, то прозорість відсутня.- Параметри:
width – Ширина зображення.
height – Висота зображення.
transparentColor – 16-бітний колір (5-6-5), який буде вважатися прозорим. За замовчуванням -1 (прозорість відсутня).
pivotX – Координата X центральної осі зображення. За замовчуванням 0.
pivotY – Координата Y центральної осі зображення. За замовчуванням 0.
-
void rotate(int16_t angle, Image *dest, int32_t blankColor)
Обернути зображення на заданий кут (в градусах) і записати результат в
dest.Цей метод, а також методи
flipXтаflipY, зручно використовувати для створення обернених та віддзеркалених копій зображення, якщо ви заздалегідь знаєте, які варіанти зображення вам знадобляться.Замість них можна використовувати клас
lilka::Transformта його методи, які дозволяють виконувати та комбінувати складніші перетворення «на льоту», але такі перетворення є повільнішими.lilka::Image *image = lilka::resources.loadImage("image.bmp"); if (!image) { Serial.println("Failed to load image"); return; } lilka::Image *rotatedImage = new lilka::Image(image->width, image->height); // Повертаємо на 30 градусів, заповнюючи пікселі, які виходять за межі зображення, білим кольором: image->rotate(30, rotatedImage, lilka::colors::White); // Звільнюємо пам'ять delete image; delete rotatedImage;
Дивись також
Display::drawImageTransformed, Canvas::drawImageTransformed, Transform
Попередження
destповинен бути ініціалізований заздалегідь.- Параметри:
angle – Кут обертання в градусах.
dest – Вказівник на Image, в яке буде записано обернуте зображення.
blankColor – 16-бітний колір (5-6-5), який буде використаний для заповнення пікселів, які виходять за межі зображення.
Public Members
-
uint32_t width
Ширина зображення.
-
uint32_t height
Висота зображення.
-
int32_t transparentColor
16-бітний колір (5-6-5), який буде прозорим. За замовчуванням -1 (прозорість відсутня).
-
int16_t pivotX
Координата X центральної осі зображення.
-
int16_t pivotY
Координата Y центральної осі зображення.
-
uint16_t *pixels
Масив пікселів зображення. Ініціалізується в конструкторі автоматично.
-
Image(uint32_t width, uint32_t height, int32_t transparentColor = -1, int16_t pivotX = 0, int16_t pivotY = 0)
Transform
-
class Transform
Клас для роботи з афінними перетвореннями.
Афінні перетворення - це перетворення, які зберігають паралельність ліній. Вони включають в себе обертання, масштабування та віддзеркалення.
Перетворення - це всього лиш матриця 2x2. Застосування перетворення до вектора - це множення цього вектора на матрицю перетворення. Магія!
// Цей код обертає зображення на 30 градусів і тоді віддзеркалює його по горизонталі lilka::Transform transform = lilka::Transform().rotate(30).flipX(); lilka::display.drawImageTransformed(image, 32, 64, transform);
Public Functions
-
Transform()
Створити об’єкт класу
lilka::Transform.
-
Transform rotate(int16_t angle)
Обернути навколо центру на кут
angle(в градусах).Оскільки на екрані вісь Y вказує вниз, обертання буде здійснено за годинниковою стрілкою.
- Параметри:
angle – Кут обертання в градусах.
- Повертає:
Нове перетворення.
-
Transform scale(float scaleX, float scaleY)
Масштабувати по X та Y.
Щоб віддзеркалити зображення, використайте від’ємні значення (наприклад, -1).
- Параметри:
scaleX – Масштаб по X.
scaleY – Масштаб по Y.
- Повертає:
Нове перетворення.
-
Transform multiply(Transform other)
Помножити це перетворення на інше.
Примітка
Зверніть увагу: при комбінації перетворень порядок важливий, і він є оберненим до порядку множення матриць! В результаті цього, перетворення other буде виконано перед поточним перетворенням. Тобто якщо в вас є деякі перетворення
AтаB, то перетворенняA.multiply(B)утворить нове перетворення, в якому спочатку виконається перетворенняB, а потімA.Примітка
Для уникнення плутанини рекомендуємо використовувати більш високорівневі методи, такі як
rotateтаscale.- Параметри:
other – Інше перетворення.
- Повертає:
Перетворення, яке є результатом застосування цього перетворення після
otherперетворення.lilka::Transform rotate30 = lilka::Transform().rotate(30); // обернути на 30 градусів lilka::Transform scale2x = lilka::Transform().scale(2, 2); // збільшити в 2 рази lilka::Transform scaleThenRotate = rotate30.multiply(scale2x); // результат - це перетворення "спочатку збільшити, а потім обернути", а не навпаки!
-
Transform inverse()
Інвертувати перетворення.
Примітка
Інвертне перетворення - це таке перетворення, яке скасує це перетворення, тобто є зворотнім до цього.
- Повертає:
Інвертоване перетворення.
-
inline int_vector_t transform(int_vector_t vector)
Перетворити вектор, використовуючи це перетворення.
- Параметри:
vector – Вхідний вектор.
- Повертає:
Результат перетворення.
-
Transform()