1. Ідентифікація та основні компоненти
flowchart TD
subgraph OLED["OLED-дисплей 0.91 дюйма (128x32)"]
direction TB
subgraph Pins["Виводи"]
direction LR
GND["GND
(Земля)"] --- VCC["VCC
(Живлення)"] --- SCL["SCL
(Тактування)"] --- SDA["SDA
(Дані)"]
end
subgraph Screen["Екран"]
SCREEN["OLED Матриця
128×32 пікселі"]
end
subgraph Chip["Контролер"]
SSD1306["SSD1306
Контролер дисплея"]
end
Pins --- Screen
Screen --- Chip
end
classDef pins fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
classDef screen fill:#f5f5f5,stroke:#333,stroke-width:1px
classDef chip fill:#fff3e0,stroke:#ef6c00,stroke-width:1px
class GND,VCC,SCL,SDA pins
class SCREEN screen
class SSD1306 chip
Перед підключенням переконайтеся, що на модулі є 4 виводи у правильному порядку: GND, VCC, SCL, SDA. Дисплей працює від напруги 3.3В або 5В (залежно від модифікації), тому уважно перевірте маркування на платі або документацію до конкретного модуля.
2. Схема підключення до Arduino UNO
flowchart LR
subgraph OLED["OLED-дисплей 0.91 дюйма"]
GND_OLED["GND"]
VCC_OLED["VCC"]
SCL_OLED["SCL"]
SDA_OLED["SDA"]
end
subgraph ARDUINO["Arduino UNO"]
GND_ARD["GND"]
V5_ARD["5V"]
A5_ARD["A5 (SCL)"]
A4_ARD["A4 (SDA)"]
end
GND_OLED -- "Чорний дріт" --> GND_ARD
VCC_OLED -- "Червоний дріт" --> V5_ARD
SCL_OLED -- "Жовтий дріт" --> A5_ARD
SDA_OLED -- "Зелений дріт" --> A4_ARD
classDef oled fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
classDef arduino fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
class GND_OLED,VCC_OLED,SCL_OLED,SDA_OLED oled
class GND_ARD,V5_ARD,A5_ARD,A4_ARD arduino
2.1. Покрокова інструкція з підключення
- Підготуйте компоненти:
- Arduino UNO (або сумісна плата)
- OLED-дисплей 0.91" з I2C інтерфейсом
- Макетна плата (опціонально)
- 4 дроти тип "тато-тато" для підключення (бажано різнокольорові)
- З'єднайте дисплей з Arduino:
- GND (дисплей) → GND (Arduino) — чорний дріт
- VCC (дисплей) → 5V (Arduino) — червоний дріт
- SCL (дисплей) → A5 (Arduino) — жовтий дріт
- SDA (дисплей) → A4 (Arduino) — зелений дріт
- Підключіть Arduino до комп'ютера через USB-кабель для живлення та програмування.
На Arduino UNO піни A4 та A5 є стандартними апаратними пінами для I2C інтерфейсу (SDA та SCL відповідно). Для інших моделей Arduino розташування I2C пінів може відрізнятися. Наприклад, на Arduino Leonardo та Micro використовуються піни 2 (SDA) і 3 (SCL).
3. Налаштування програмного забезпечення
3.1. Встановлення необхідних бібліотек
Для роботи з OLED-дисплеєм потрібно встановити спеціальні бібліотеки. Є два основних варіанти:
- Adafruit SSD1306 та Adafruit GFX (рекомендовано для початківців):
- Відкрийте Arduino IDE
- Перейдіть до Sketch → Include Library → Manage Libraries...
- У пошуковому полі введіть "Adafruit SSD1306"
- Виберіть бібліотеку від Adafruit і натисніть "Install"
- Якщо з'явиться пропозиція встановити залежності (наприклад, "Adafruit GFX Library") — погодьтеся
- Якщо "Adafruit GFX Library" не встановилася автоматично, знайдіть її та встановіть окремо
- U8g2 (більш потужна, з більшою кількістю шрифтів):
- Відкрийте Arduino IDE
- Перейдіть до Sketch → Include Library → Manage Libraries...
- У пошуковому полі введіть "U8g2"
- Виберіть бібліотеку від "oliver" і натисніть "Install"
3.2. Визначення I2C адреси дисплея
- Завантажте та встановіть скетч "I2C Scanner" (можна знайти в мережі або у прикладах деяких бібліотек)
- Завантажте скетч на Arduino
- Відкрийте Tools → Serial Monitor
- Встановіть швидкість (baud rate) як у скетчі (зазвичай 9600 або 115200)
- Сканер виведе адресу знайденого пристрою (зазвичай 0x3C або 0x3D)
- Запам'ятайте цю адресу для використання у ваших програмах
// Скетч I2C сканера для визначення адреси дисплея
#include
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("\nI2C Scanner");
}
void loop() {
byte error, address;
int nDevices = 0;
Serial.println("Сканування...");
for(address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C пристрій знайдено за адресою 0x");
if (address < 16) {
Serial.print("0");
}
Serial.println(address, HEX);
nDevices++;
}
}
if (nDevices == 0) {
Serial.println("I2C пристроїв не знайдено\n");
} else {
Serial.println("Сканування завершено\n");
}
delay(5000); // Чекаємо 5 секунд для наступного сканування
}
4. Приклади програмування
4.1. Простий текст (Adafruit SSD1306)
#include
#include
#include
#define SCREEN_WIDTH 128 // ширина OLED дисплея в пікселях
#define SCREEN_HEIGHT 32 // висота OLED дисплея в пікселях
// Ініціалізація дисплея
// -1 означає, що пін скидання не використовується (деякі дисплеї його не мають)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Serial.begin(9600);
// Ініціалізація з I2C адресою 0x3C
// (для 128x32 дисплея, більшість використовують адресу 0x3C)
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Зациклюємось при помилці
}
// Очищення буфера дисплея
display.clearDisplay();
// Налаштування тексту
display.setTextSize(1); // Розмір тексту (1 - найменший)
display.setTextColor(SSD1306_WHITE); // Колір тексту (для монохромного дисплея - білий)
display.setCursor(0, 10); // Позиція (x=0, y=10)
display.println("OLED 0.91 Display");
display.setCursor(0, 20);
display.println("Test: 128x32 pixels");
// Виведення буфера на екран
display.display();
}
void loop() {
// Ніяких дій в циклі - текст статичний
}
4.2. Великий текст з анімацією (U8g2)
#include
#include
#include
// Ініціалізація дисплея з I2C інтерфейсом
// _F_ означає використання повного буфера
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
void setup(void) {
u8g2.begin();
}
void loop(void) {
// Слово "HELLO"
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr); // Великий шрифт
u8g2.drawStr(10, 29, "HELLO");
u8g2.sendBuffer();
delay(2000);
// Слово "WORLD"
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
u8g2.drawStr(10, 29, "WORLD");
u8g2.sendBuffer();
delay(2000);
// Слово "OLED"
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
u8g2.drawStr(15, 29, "OLED");
u8g2.sendBuffer();
delay(2000);
// Маленьким шрифтом два рядки
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr); // Менший шрифт
u8g2.drawStr(0, 14, "I2C Display");
u8g2.drawStr(0, 32, "128x32 pixels");
u8g2.sendBuffer();
delay(2000);
}
4.3. Графіка та анімація (Adafruit SSD1306)
#include
#include
#include
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
}
void loop() {
// Анімація прогрес-бару
for(int16_t i=0; i<=100; i+=10) {
display.clearDisplay();
// Відображення відсотка
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Progress: ");
display.print(i);
display.println("%");
// Рамка прогрес-бару
display.drawRect(0, 16, 120, 10, SSD1306_WHITE);
// Заповнення прогрес-бару
display.fillRect(0, 16, i * 120 / 100, 10, SSD1306_WHITE);
display.display();
delay(200);
}
delay(1000);
// Анімація кола, що розширюється
for(int16_t i=0; i<=SCREEN_WIDTH/2; i+=5) {
display.clearDisplay();
display.drawCircle(SCREEN_WIDTH/2, SCREEN_HEIGHT/2, i, SSD1306_WHITE);
display.display();
delay(100);
}
delay(1000);
}
Для економії пам'яті при використанні бібліотеки U8g2 можна використовувати конструктори з суфіксом _1 або _2 замість _F (наприклад, U8G2_SSD1306_128X32_UNIVISION_1_HW_I2C), що означає використання частини буфера з відповідними оновленнями.
5. Цікаві аспекти використання
5.1. Енергоефективність OLED-технології
OLED-дисплеї мають унікальну особливість: вони споживають енергію тільки для пікселів, що світяться. Це означає:
- Чорні пікселі фактично вимкнені та не споживають енергію
- Чим менше білих пікселів на екрані, тим менше споживання енергії
- Це робить такі дисплеї ідеальними для проєктів з батарейним живленням
Для максимальної економії енергії при розробці інтерфейсу використовуйте мінімально необхідну кількість світлих пікселів — замість заповнення всього екрану білим кольором використовуйте тільки необхідні елементи інтерфейсу.
5.2. Переваги I2C-інтерфейсу
- Економія пінів: Використовує лише 2 сигнальні дроти (SDA та SCL) плюс живлення
- Багатопристроєвість: На одну шину I2C можна підключити кілька різних пристроїв з різними адресами
- Простота підключення: Не потрібно додаткових компонентів для зв'язку між Arduino та дисплеєм
5.3. Практичні застосування
- Вимірювальні пристрої: Відображення даних з сенсорів (температура, вологість, тиск)
- Інформаційні панелі: Відображення часу, дати, статусу пристроїв
- IoT-проєкти: Відображення статусу підключення до WiFi/Bluetooth, IP-адреси
- Носимі гаджети: Завдяки компактності ідеально підходить для фітнес-трекерів, розумних годинників
- Кастомні інтерфейси: Для 3D-принтерів, макропадів, DIY-пультів керування
- Міні-ігри: Завдяки високій контрастності можна створювати прості ігри
5.4. Проблеми та їх вирішення
Проблема |
Можлива причина |
Вирішення |
Дисплей не вмикається |
Неправильне підключення або адреса |
Перевірте з'єднання та використайте I2C сканер для визначення правильної адреси |
Показує випадкові символи |
Проблеми з I2C зв'язком |
Перевірте якість з'єднань, додайте підтягуючі резистори (4.7kΩ) до ліній SCL і SDA |
Зображення перевернуте |
Неправильна орієнтація |
Для Adafruit: використовуйте display.setRotation(2); Для U8g2: використовуйте інший конструктор з U8G2_R2 |
Помилка компіляції |
Несумісність бібліотек |
Оновіть Arduino IDE та всі бібліотеки до останніх версій |
При використанні довгих з'єднувальних дротів може виникнути проблема з надійністю I2C зв'язку. В таких випадках рекомендується додати підтягуючі резистори 4.7kΩ між лініями SDA, SCL та VCC.
5.5. Порівняння бібліотек
Критерій |
Adafruit SSD1306 |
U8g2 |
Простота використання |
Простіша для початківців |
Більш складна, але потужніша |
Шрифти |
Обмежена кількість |
Велика кількість вбудованих шрифтів різних розмірів |
Використання пам'яті |
Завжди використовує повний буфер |
Має режими з частковим буфером для економії пам'яті |
Графічні можливості |
Базові графічні функції |
Розширені графічні функції, включаючи складніші примітиви |
Для проєктів з Arduino UNO, де критична економія пам'яті, рекомендується використовувати U8g2 з режимом часткового буфера (конструктор з суфіксом _1 або _2). Це дозволить залишити більше пам'яті для решти програми.
Важливе зауваження: Ми доклали зусиль, щоб ця інструкція була точною та корисною. Однак, ця інструкція надається як довідковий матеріал. Електронні компоненти можуть мати варіації, а схеми підключення залежать від конкретних умов та вашого обладнання. Ця інформація надається "як є", без гарантій повноти чи безпомилковості. Наполегливо рекомендуємо перевіряти специфікації вашого модуля (datasheet), звірятися з іншими джерелами та, за найменших сумнівів, звертатися до кваліфікованих фахівців, особливо при роботі з напругою 220В.