#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire);
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// --- Функція розрахунку Y-координат ---
void af_getLinesY(byte totalItems, byte spacing, byte yOut[], byte centerY = 0) {
const byte lineHeight = 8; // Висота рядка
const byte totalHeight = totalItems * lineHeight + (totalItems - 1) * spacing;
// Верхня координата, від якої починаються рядки
byte top;
if (centerY > 0) {
// Центрування відносно вказаної координати
top = centerY - totalHeight / 2;
} else {
// Автоматичне центрування по дисплею (64 px)
top = (64 - totalHeight) / 2;
}
// Обчислюємо координати рядків
for (byte i = 0; i < totalItems; i++) {
yOut[i] = top + i * (lineHeight + spacing);
}
}
// --- Вивід рядка ---
void af_displayPrintLain(const char* text, byte x, byte y) {
display.setCursor(x, y);
display.print(text);
}
// --- Заглушка для X ---
byte X(byte val) { return val; }
void af_drawCrossAndFrame() {
// --- Рамка по периметру ---
display.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, WHITE);
// --- Центр дисплея ---
const int centerX = SCREEN_WIDTH / 2;
const int centerY = SCREEN_HEIGHT / 2;
// --- Горизонтальна лінія з двох рядків у шаховому порядку ---
for (int i = -1; i <= 0; i++) { // два рядки
for (int x = 0; x < SCREEN_WIDTH; x += 2) {
display.drawPixel(x, centerY + i, WHITE); // білий
display.drawPixel(x + 1, centerY + i, BLACK); // чорний
}
}
// --- Вертикальна лінія з двох рядків у шаховому порядку ---
for (int i = -1; i <= 0; i++) { // два рядки
for (int y = 0; y < SCREEN_HEIGHT; y += 2) {
display.drawPixel(centerX + i, y, WHITE); // білий
display.drawPixel(centerX + i, y + 1, BLACK); // чорний
}
}
}
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextSize(1);
display.setTextColor(WHITE);
display.clearDisplay();
display.display();
}
void loop() {
display.clearDisplay();
display.drawRect(0, 0, 128, 48, WHITE);
display.drawRect((128/2)-7, 48+1, 14, 13, WHITE); //14HIRINA
display.setCursor((128/2)-5, 48+4); // хардкод
display.print("ok");
af_drawCrossAndFrame();
const byte l = 3; // кількість рядків
const byte p = 2; // відстань між рядками
byte y[3]; // масив для координат
// Приклад 1 — автоматичне центрування
af_getLinesY(l, p, y);
// Вивід
af_displayPrintLain("Hello", X(6), y[0]);
af_displayPrintLain("BBB", X(6), y[1]);
af_displayPrintLain("Test", X(6), y[2]);
display.display();
delay(2000);
// Приклад 2 — центрування відносно координати 32
}