Подключение графического OLED-дисплея к Arduino

Подключение графического OLED-дисплея к Arduino

Устали от использования одних и тех же старых символьных LCD-дисплеев в своих проектах на Arduino? Что ж, вы не одиноки. Честно говоря, они начинают казаться пережитком прошлого. Познакомьтесь с OLED-дисплеями — стильным и современным обновлением, которое выводит визуализацию на новый уровень. Эти дисплеи сверхлёгкие, невероятно тонкие (почти как лист бумаги) и обеспечивают более чёткое и яркое изображение, которое буквально выделяется на экране.

В этом руководстве мы пошагово покажем вам, как подключить OLED-дисплей к Arduino. Мы начнём с отображения простого текста, перейдём к рисованию базовых фигур и, наконец, научим вас отображать собственные изображения. Чтобы упростить задачу, мы создали удобный инструмент, который поможет преобразовать любое изображение в формат, идеально подходящий для вашего OLED-дисплея. Будь то создание стильного гаджета, весёлой игры или просто добавление визуальной изюминки в ваш проект — OLED станет лучшим выбором.

Давайте погрузимся и оживим ваши проекты — пиксель за пикселем!

Обзор оборудования

OLED-дисплеи представлены в широком ассортименте, предоставляя множество вариантов в зависимости от потребностей вашего проекта. Они доступны в различных размерах, таких как 128×64 пикселей или 128×32 пикселей, и вы можете выбрать из различных цветов — белый, синий или даже эффектные двухцветные версии. Эти дисплеи также поддерживают разные способы связи с Arduino — одни используют I2C, другие — SPI.

Независимо от выбранного размера, цвета или способа связи, все эти OLED-дисплеи используют одну и ту же маленькую, но мощную микросхему SSD1306 — драйвер OLED-дисплея. Эта микросхема действует как «мозг» дисплея. Она отвечает за отрисовку всего, что вы видите на экране, сохраняя данные изображения в собственной памяти (буферизация в RAM). Благодаря такой продуманной конструкции вашему микроконтроллеру не нужно постоянно обновлять экран — он может сосредоточиться на других задачах.

В этом руководстве мы будем работать с версиями I2C и SPI 0,96-дюймового OLED-дисплея 128×64. Но если ваш дисплей другого размера или цвета, не переживайте. Основные принципы, которые мы рассмотрим, по-прежнему применимы, а шаги по его настройке будут очень похожими.

Питание

В отличие от традиционных LCD-дисплеев, OLED-дисплеям не нужна подсветка, потому что пиксели OLED создают собственный свет. Это обеспечивает OLED высокую контрастность, отличные углы обзора и действительно глубокий чёрный цвет. Поскольку им не нужна подсветка, OLED-дисплеи потребляют меньше энергии — в среднем около 20mA, что делает их идеальными для проектов с батарейным питанием.

OLED-дисплеи работают с напряжением от 3.3V до 5V. Это означает, что вы можете легко подключить OLED-дисплей к микроконтроллеру на 3.3V или 5V (например, Arduino) без каких-либо проблем.

Карта памяти OLED-дисплея

Чтобы управлять тем, что отображается на OLED-дисплее, необходимо понимать, как организована память дисплея.

Независимо от размера вашего OLED-дисплея, микросхема-драйвер SSD1306 внутри имеет 1КБ (килобайт) памяти, известной как Graphic Display Data RAM (GDDRAM). Эта память хранит паттерн пикселей, отображаемый на экране. Каждый бит в этой памяти управляет одним пикселем.

Вот как организован этот 1КБ памяти:

  • Память разделена на 8 страниц (пронумерованных от 0 до 7)

  • Каждая страница имеет 128 столбцов (также называемых сегментами)

  • Каждый столбец содержит 8 вертикальных пикселей на экране

Таким образом, расчёт выглядит следующим образом:

8 страниц × 128 столбцов × 8 бит = 8192 бита = 1024 байта = 1КБ памяти

Вся память объёмом 1КБ, включая страницы, сегменты и данные, показана ниже.

Подключение графического OLED-дисплея к Arduino

Помните, каждый OLED-модуль содержит 1КБ RAM, независимо от его размера. Модуль OLED 128×64 отображает всё содержимое этого 1КБ RAM (все 8 страниц), тогда как модуль OLED 128×32 показывает только половину RAM (первые 4 страницы).

Технические характеристики

Вот технические характеристики:

Технология дисплея

OLED (Organic LED)

Интерфейс микроконтроллера

I2C / SPI

Размер экрана

0,96 дюйма по диагонали

Разрешение

128×64 пикселей

Рабочее напряжение

3.3V – 5V

Рабочий ток

20mA макс.

Угол обзора

160°

Символов в строке

21

Количество строк символов

7

Распиновка OLED-дисплея

Прежде чем перейти к подключению и примерам кода, давайте подробнее рассмотрим распиновку модуля OLED-дисплея.

Модуль OLED-дисплея с интерфейсом I2C

Подключение графического OLED-дисплея к Arduino

GND — это вывод заземления.

VCC — это вывод питания дисплея. Его можно подключить к выводу 3.3V или 5V на вашем микроконтроллере.

SCL — это вывод тактирования последовательного интерфейса I2C.

SDA — это вывод данных последовательного интерфейса I2C.

Модуль OLED-дисплея с интерфейсом SPI

Подключение графического OLED-дисплея к Arduino

GND — это вывод заземления.

VCC — это вывод питания дисплея. Его можно подключить к выводу 3.3V или 5V на вашем микроконтроллере.

D0 / CLK — это вывод тактирования SPI.

D1 / MOSI — это вывод данных SPI.

RES (Reset) — используется для сброса дисплея.

DC (Data/Command) — сообщает дисплею, следует ли ожидать данные (например, информацию о пикселях) или команду (например, установку позиции курсора или очистку экрана).

CS — это вывод выбора кристалла SPI.

Схема подключения OLED-дисплея к Arduino

Давайте подключим OLED-дисплей к Arduino. Рассмотрим, как это сделать для обоих типов OLED-дисплеев — I2C и SPI.

Схема подключения OLED-дисплея по I2C

Если вы используете OLED-дисплей с интерфейсом I2C, вот как его подключить:

Сначала подключите вывод VCC дисплея к выходу 5V Arduino, а вывод GND — к заземлению Arduino.

Далее нужно подключить выводы, используемые для связи по I2C. Важно знать, что разные платы Arduino имеют разные выводы I2C, и они должны быть подключены правильно. На платах Arduino с разводкой R3 выводы SDA (линия данных) и SCL (линия тактирования) также находятся на штыревых разъёмах рядом с выводом AREF. Однако внутренне они совпадают с выводами A4 (SDA) и A5 (SCL).

Вот краткая справочная таблица подключений:

I2C OLED DisplayArduino
VCC5V
GNDGND
SCLSCL or A5
SDASDA or A4

Эта схема показывает, как именно всё подключить:

Подключение графического OLED-дисплея к Arduino

Схема подключения OLED-дисплея по SPI

Если вы используете OLED-дисплей с интерфейсом SPI, вот как его подключить:

Сначала подключите вывод VCC дисплея к выходу 5V Arduino, а вывод GND — к заземлению Arduino.

После подключения питания вам нужно подключить несколько выводов данных. Вывод D0/CLK должен быть подключён к цифровому выводу 13 Arduino. Вывод D1/MOSI подключается к цифровому выводу 11. Вывод RES (сброс) подключается к выводу 9, вывод DC (управление данные/команда) идёт к выводу 10, а вывод CS (выбор кристалла) должен быть подключён к выводу 12.

Вот краткая справочная таблица подключений:

SPI OLED DisplayArduino
VCC5V
GNDGND
D0 / CLK10
D1 / MOSI9
RES13
DC11
CS12

Эта схема показывает, как именно всё подключить:

Подключение графического OLED-дисплея к Arduino

Установка библиотеки

Контроллер SSD1306, используемый в OLED-дисплеях, очень гибкий, но работать с ним напрямую может быть довольно сложно. Для правильного использования обычно необходимо хорошее понимание адресации памяти, что может быть непросто, особенно для начинающих.

К счастью, нам не нужно беспокоиться обо всём этом. Библиотека Adafruit SSD1306 была создана, чтобы значительно упростить задачу. Эта библиотека берёт на себя всю сложную работу, позволяя управлять OLED-дисплеем с помощью простых и понятных команд.

Для установки библиотеки:

  1. Сначала откройте программу Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.

  2. Введите «adafruit ssd1306» в поле поиска для фильтрации результатов.

  3. Найдите библиотеку Adafruit SSD1306 от Adafruit.

  4. Нажмите кнопку Install, чтобы добавить её в Arduino IDE.

Подключение графического OLED-дисплея к Arduino

Поскольку библиотека Adafruit SSD1306 зависит от других библиотек, вам будет предложено установить её зависимости, включая библиотеку Adafruit Bus IO и библиотеку Adafruit GFX.

Когда появится это сообщение, просто нажмите INSTALL ALL, чтобы убедиться, что всё настроено правильно.

Подключение графического OLED-дисплея к Arduino

Пример 1 для Arduino — Отображение текста

Теперь начинается самое интересное — давайте отобразим что-нибудь на OLED-экране!

Скетч ниже показывает, как:

  • Отображать простой текст

  • Отображать инвертированный текст

  • Отображать числа

  • Отображать числа с указанием системы счисления (Hex, Dec)

  • Отображать символы ASCII

  • Прокручивать текст горизонтально и вертикально

  • Прокручивать часть дисплея

Как только вы освоите этот пример, вы будете на верном пути к созданию более креативных и продвинутых проектов с OLED-дисплеем.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels

// Declaration for SSD1306 display connected using I2C
#define OLED_RESET -1  // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Declaration for SSD1306 display connected using software SPI:
//#define OLED_MOSI   9
//#define OLED_CLK   10
//#define OLED_DC    11
//#define OLED_CS    12
//#define OLED_RESET 13
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup() {
  Serial.begin(9600);

  // initialize the OLED object
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ;  // Don't proceed, loop forever
  }

  // Uncomment this if you are using SPI
  //if(!display.begin(SSD1306_SWITCHCAPVCC)) {
  //  Serial.println(F("SSD1306 allocation failed"));
  //  for(;;); // Don't proceed, loop forever
  //}

  // Clear the buffer.
  display.clearDisplay();

  // Display Text
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 28);
  display.println("Hello world!");
  display.display();
  delay(2000);
  display.clearDisplay();

  // Display Inverted Text
  display.setTextColor(BLACK, WHITE);  // 'inverted' text
  display.setCursor(0, 28);
  display.println("Hello world!");
  display.display();
  delay(2000);
  display.clearDisplay();

  // Changing Font Size
  display.setTextColor(WHITE);
  display.setCursor(0, 24);
  display.setTextSize(2);
  display.println("Hello!");
  display.display();
  delay(2000);
  display.clearDisplay();

  // Display Numbers
  display.setTextSize(1);
  display.setCursor(0, 28);
  display.println(123456789);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Specifying Base For Numbers
  display.setCursor(0, 28);
  display.print("0x");
  display.print(0xFF, HEX);
  display.print("(HEX) = ");
  display.print(0xFF, DEC);
  display.println("(DEC)");
  display.display();
  delay(2000);
  display.clearDisplay();

  // Display ASCII Characters
  display.setCursor(0, 24);
  display.setTextSize(2);
  display.write(3);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Scroll full screen
  display.setCursor(0, 0);
  display.setTextSize(1);
  display.println("Full");
  display.println("screen");
  display.println("scrolling!");
  display.display();
  display.startscrollright(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrolldiagright(0x00, 0x07);
  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  display.clearDisplay();

  // Scroll part of the screen
  display.setCursor(0, 0);
  display.setTextSize(1);
  display.println("Scroll");
  display.println("some part");
  display.println("of the screen.");
  display.display();
  display.startscrollright(0x00, 0x00);
}

void loop() {
}

Вот как выглядит результат.

Подключение графического OLED-дисплея к Arduino

Объяснение кода

В начале мы подключаем четыре библиотеки: SPI.h, Wire.h, Adafruit_GFX.h и Adafruit_SSD1306.h. Эти библиотеки помогают Arduino взаимодействовать с OLED-дисплеем. Хотя мы используем I2C (для которого библиотека SPI не нужна), мы всё равно подключаем SPI, чтобы код компилировался без ошибок.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Далее мы определяем ширину и высоту экрана в пикселях. Большинство распространённых OLED-дисплеев имеют разрешение 128 пикселей в ширину и 64 пикселя в высоту, поэтому мы устанавливаем SCREEN_WIDTH равным 128, а SCREEN_HEIGHT — 64.

Затем мы создаём объект display с помощью библиотеки Adafruit_SSD1306. Мы сообщаем ему размер экрана — 128 пикселей в ширину и 64 пикселя в высоту — и указываем, что используем I2C. Поскольку наш OLED-модуль не имеет вывода сброса, мы передаём -1, чтобы показать, что не используем его.

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for SSD1306 display connected using I2C
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Этот скетч использует протокол I2C для связи с дисплеем. Однако если вы хотите использовать SPI, переключиться легко. Просто раскомментируйте следующие строки кода, и скетч будет работать по протоколу SPI.

// Declaration for SSD1306 display connected using software SPI:
//#define OLED_MOSI   9
//#define OLED_CLK   10
//#define OLED_DC    11
//#define OLED_CS    12
//#define OLED_RESET 13
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

В функции setup() мы сначала начинаем последовательную связь для вывода отладочных сообщений в монитор последовательного порта.

Затем мы вызываем display.begin() для начала связи с OLED-дисплеем. Первый аргумент включает встроенную схему подкачки заряда, которая помогает питать экран, а второй аргумент задаёт I2C-адрес (I2C-адрес экрана обычно 0x3C, но некоторые дисплеи используют 0x3D, поэтому при необходимости его нужно изменить). Если дисплей не запустится корректно, мы выводим сообщение об ошибке и останавливаем программу.

Serial.begin(9600);

// initialize the OLED object
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
  Serial.println(F("SSD1306 allocation failed"));
  for(;;); // Don't proceed, loop forever
}

// Uncomment this if you are using SPI
//if(!display.begin(SSD1306_SWITCHCAPVCC)) {
//  Serial.println(F("SSD1306 allocation failed"));
//  for(;;); // Don't proceed, loop forever
//}

Когда дисплей готов, мы очищаем экран с помощью display.clearDisplay(). Это гарантирует, что мы работаем с чистым экраном.

// Clear the buffer.
display.clearDisplay();

Отображение простого текста (Hello World)

Подключение графического OLED-дисплея к Arduino
// Display Text
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,28);
display.println("Hello world!");
display.display();
delay(2000);

Чтобы отобразить текст на OLED-экране, мы сначала устанавливаем размер текста с помощью функции setTextSize(). Эта функция принимает число, где 1 — наименьший размер, а большие числа увеличивают текст.

Далее мы выбираем цвет текста с помощью setTextColor(). Поскольку наш OLED-экран имеет тёмный фон, мы обычно используем WHITE, чтобы текст был хорошо виден.

Перед выводом чего-либо мы указываем дисплею, где начать писать, установив позицию курсора с помощью setCursor(x, y). Значение x определяет, насколько далеко от левого края начинается текст, а y — насколько далеко от верхнего края. Верхний левый угол — это позиция (0, 0).

Для вывода сообщения мы используем println("Hello world!"). Это работает так же, как вывод в монитор последовательного порта, и перемещает курсор на следующую строку после печати.

Наконец, мы используем display() для обновления экрана и отображения всего, что мы подготовили в коде. Экран не обновляется, пока вы не вызовете эту функцию.

Отображение инвертированного текста

Подключение графического OLED-дисплея к Arduino
// Display Inverted Text
display.clearDisplay();
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.setCursor(0,28);
display.println("Hello world!");
display.display();
delay(2000);

Если вы хотите показать текст с перевёрнутыми цветами (чёрный текст на белом фоне), это можно сделать, снова используя функцию setTextColor(), но на этот раз с двумя значениями. Когда мы пишем setTextColor(BLACK, WHITE), мы указываем дисплею рисовать чёрные буквы на белом прямоугольнике. Возможность передать два значения обусловлена так называемой «перегрузкой функций» — это просто означает, что одна и та же функция может вести себя по-разному в зависимости от количества переданных значений.

Масштабирование размера шрифта

Подключение графического OLED-дисплея к Arduino
// Changing Font Size
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0,24);
display.setTextSize(2);
display.println("Hello!");
display.display();
delay(2000);

Ранее в скетче мы использовали функцию setTextSize() и передали число 1 для установки размера шрифта по умолчанию. Но вы не ограничены только этим — можно сделать текст больше, передав большее число.

Например, вызов setTextSize(2) сделает текст в два раза больше размера 1. Вы можете использовать любое целое число (2, 3, 4…) в зависимости от того, насколько большим вы хотите видеть текст.

Обратите внимание, что каждый символ на OLED-экране рисуется в прямоугольной области с соотношением ширины к высоте 7:10. Таким образом:

  • Размер шрифта 1 рисует каждый символ 7×10 пикселей

  • Размер шрифта 2 рисует каждый символ 14×20 пикселей

  • Размер шрифта 3 — 21×30 пикселей и так далее

Отображение чисел

Подключение графического OLED-дисплея к Arduino
// Display Numbers
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,28);
display.println(123456789);
display.display();
delay(2000);

Как и с текстом, вы можете использовать print() или println() для отображения чисел на экране. Эти функции принимают 32-битные беззнаковые целые числа, то есть можно отображать числа в диапазоне от 0 до 4 294 967 295.

Указание системы счисления для чисел

Подключение графического OLED-дисплея к Arduino
// Specifying Base For Numbers
display.clearDisplay();
display.setCursor(0,28);
display.print("0x"); display.print(0xFF, HEX);
display.print("(HEX) = ");
display.print(0xFF, DEC);
display.println("(DEC)");
display.display();
delay(2000);

Иногда вам может потребоваться показать число в другом формате, например двоичном (основание 2), восьмеричном (основание 8), десятичном (основание 10) или шестнадцатеричном (основание 16). Функции print() и println() позволяют это сделать, добавив второй параметр, указывающий формат. Например, print(78, BIN) выводит 1001110, а print(78, HEX) выводит 4E.

Этот второй параметр также можно использовать для десятичных чисел, чтобы контролировать количество цифр после запятой. Например, print(1.23456, 2) покажет 1.23, а print(1.23456, 4) покажет 1.2346.

Отображение символов ASCII

Подключение графического OLED-дисплея к Arduino
// Display ASCII Characters
display.clearDisplay();
display.setCursor(0,24);
display.setTextSize(2);
display.write(3);
display.display();
delay(2000);

Вы также можете показывать специальные символы с помощью функции write(). Она работает немного иначе, чем print() — вместо обычного текста она отправляет число, представляющее символ ASCII, непосредственно на экран. Например, write(3) отобразит символ сердца. Это забавный способ добавить значки на ваш дисплей!

Прокрутка всего экрана

Подключение графического OLED-дисплея к Arduino
// Scroll full screen
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.println("Full");
display.println("screen");
display.println("scrolling!");
display.display();
display.startscrollright(0x00, 0x07);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollleft(0x00, 0x07);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrolldiagright(0x00, 0x07);
delay(2000);
display.startscrolldiagleft(0x00, 0x07);
delay(2000);
display.stopscroll();

Если вы хотите, чтобы сообщение перемещалось по экрану, можно настроить прокрутку. Сначала отобразите сообщение обычным способом, используя изученные шаги. Затем используйте startscrollright() или startscrollleft() для перемещения текста в нужном направлении. Также можно использовать startscrolldiagright() или startscrolldiagleft() для диагональной прокрутки.

Каждая из этих функций требует два параметра: начальную страницу и конечную страницу. Для получения дополнительной информации о страницах обратитесь к разделу карты памяти OLED. Поскольку дисплей имеет восемь страниц, пронумерованных от 0 до 7, вы можете прокрутить весь экран, пройдя по всем страницам. Для этого просто передайте параметры 0x00 (для начальной страницы) и 0x07 (для конечной страницы).

Когда вы хотите остановить прокрутку, просто используйте stopscroll().

Прокрутка определённой части

Подключение графического OLED-дисплея к Arduino
// Scroll part of the screen
display.setCursor(0,0);
display.setTextSize(1);
display.println("Scroll");
display.println("some part");
display.println("of the screen.");
display.display();
display.startscrollright(0x00, 0x00);

Иногда вам может понадобиться прокрутить не весь экран, а только его часть. Это можно сделать, указав правильные значения начальной и конечной страниц в функциях прокрутки. Например, если передать 0x00 для обоих — начальной и конечной страницы, будет прокручиваться только первая страница дисплея.

Пример 2 для Arduino — Рисование базовых фигур

Этот пример скетча показывает, как рисовать простые фигуры — прямоугольники, круги и треугольники — на OLED-дисплее.

Загрузите скетч на Arduino и посмотрите, как он работает, прежде чем мы объясним его подробно.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels

// Declaration for SSD1306 display connected using I2C
#define OLED_RESET -1  // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Declaration for SSD1306 display connected using software SPI:
//#define OLED_MOSI   9
//#define OLED_CLK   10
//#define OLED_DC    11
//#define OLED_CS    12
//#define OLED_RESET 13
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup() {
  Serial.begin(9600);

  // initialize the OLED object
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ;  // Don't proceed, loop forever
  }

  // Uncomment this if you are using SPI
  //if(!display.begin(SSD1306_SWITCHCAPVCC)) {
  //  Serial.println(F("SSD1306 allocation failed"));
  //  for(;;); // Don't proceed, loop forever
  //}

  // Clear the buffer.
  display.clearDisplay();

  // Draw Rectangle
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Rectangle");
  display.drawRect(0, 15, 60, 40, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Draw Filled Rectangle
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Filled Rectangle");
  display.fillRect(0, 15, 60, 40, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Draw Round Rectangle
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Round Rectangle");
  display.drawRoundRect(0, 15, 60, 40, 8, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Draw Filled Round Rectangle
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Filled Round Rectangl");
  display.fillRoundRect(0, 15, 60, 40, 8, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Draw Circle
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Circle");
  display.drawCircle(20, 35, 20, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Draw Filled Circle
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Filled Circle");
  display.fillCircle(20, 35, 20, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Draw Triangle
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Triangle");
  display.drawTriangle(30, 15, 0, 60, 60, 60, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Draw Filled Triangle
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Filled Triangle");
  display.fillTriangle(30, 15, 0, 60, 60, 60, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
}

void loop() {
}

Вот как выглядит результат.

Подключение графического OLED-дисплея к Arduino

Вы заметите, что код настройки дисплея точно такой же, как в предыдущем примере. Разница в том, что здесь мы используем новые функции для рисования фигур вместо отображения текста.

Рисование прямоугольника

Подключение графического OLED-дисплея к Arduino Подключение графического OLED-дисплея к Arduino
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Rectangle");
display.drawRect(0, 15, 60, 40, WHITE);
display.display();
delay(2000);

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Filled Rectangle");
display.fillRect(0, 15, 60, 40, WHITE);
display.display();
delay(2000);

Для рисования прямоугольника мы используем функцию drawRect(). Этой функции нужно пять значений: где начать рисовать на экране (координаты X и Y), ширина и высота прямоугольника, а также цвет. Эта функция рисует только контур прямоугольника с толщиной линии в 1 пиксель.

Если вы хотите, чтобы прямоугольник был полностью закрашен, используйте вместо этого fillRect().

Рисование скруглённого прямоугольника

Подключение графического OLED-дисплея к Arduino Подключение графического OLED-дисплея к Arduino
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Round Rectangle");
display.drawRoundRect(0, 15, 60, 40, 8, WHITE);
display.display();
delay(2000);

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Filled Round Rectangl");
display.fillRoundRect(0, 15, 60, 40, 8, WHITE);
display.display();
delay(2000);

Для прямоугольника со скруглёнными углами используйте drawRoundRect(). Как и drawRect(), вы передаёте координаты X и Y, ширину и высоту, а также цвет. Но здесь также нужно дополнительное число, указывающее, насколько скруглёнными должны быть углы (радиус скругления).

Опять же, если вы хотите, чтобы скруглённый прямоугольник был закрашен, используйте fillRoundRect().

Рисование круга

Подключение графического OLED-дисплея к Arduino Подключение графического OLED-дисплея к Arduino
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Circle");
display.drawCircle(20, 35, 20, WHITE);
display.display();
delay(2000);

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Filled Circle");
display.fillCircle(20, 35, 20, WHITE);
display.display();
delay(2000);

Для рисования круга используйте функцию drawCircle(). Здесь, в отличие от прямоугольников, где мы указывали верхний левый угол, мы передаём координаты X и Y центра круга вместе с радиусом и цветом. Это рисует только контур круга.

Если вы хотите нарисовать закрашенный круг, используйте fillCircle() с теми же значениями.

Рисование треугольника

Подключение графического OLED-дисплея к Arduino Подключение графического OLED-дисплея к Arduino
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Triangle");
display.drawTriangle(30, 15, 0, 60, 60, 60, WHITE);
display.display();
delay(2000);

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Filled Triangle");
display.fillTriangle(30, 15, 0, 60, 60, 60, WHITE);
display.display();
delay(2000);

Для рисования треугольника мы используем функцию drawTriangle(). Она немного отличается, поскольку нужно указать три точки — каждая точка состоит из координат X и Y. Эти три точки представляют вершины треугольника. Первая точка — верхняя вершина, а две другие — левая и правая вершины, в таком порядке. Эта функция рисует контур треугольника, соединяя три точки прямыми линиями. Цвет передаётся так же, как и раньше.

Если вы хотите закрашенный треугольник, используйте fillTriangle() и передайте те же координаты и цвет.

Пример 3 для Arduino — Отображение изображения

В этом последнем примере мы научимся отображать изображение на OLED-экране. Это может быть очень полезно, когда вы хотите показать логотипы, иконки, игровые спрайты или даже простую инфографику.

Для отображения изображения на OLED сначала нужно преобразовать его в формат, понятный OLED — специальный байтовый массив. Этот массив состоит из чисел, представляющих каждый отдельный пиксель изображения.

Чтобы упростить задачу, мы разработали простой инструмент, который поможет преобразовать ваше изображение в массив, который OLED-дисплей сможет использовать.

Конвертер изображений для OLED

1. Select image

Choose a file

2. Image Settings

x
128

3. Preview

Only images file type are allowed No file selected

4. Output

Как использовать конвертер?

Для начала загрузите изображение, которое хотите отобразить на OLED-экране.

Подключение графического OLED-дисплея к Arduino

Для этого примера мы выбрали фотографию Мэрилин Монро.

Подключение графического OLED-дисплея к Arduino

После загрузки изображения заполните поле Identifier именем, соответствующим вашему изображению. Это имя будет использоваться как название массива в итоговом коде Arduino.

Поскольку наше изображение — это Мэрилин Монро, мы ввели «MarilynMonroe» в качестве идентификатора.

Прежде чем продолжить, очень важно убедиться, что ваше изображение соответствует разрешению OLED-экрана 128×64 пикселей. Если изображение больше этого размера, оно может некорректно отображаться на экране.

Вы увидите текущий размер изображения в разделе «Image size» в настройках изображения. Чтобы изменить размер, введите 128 для ширины и 64 для высоты. Затем выберите соответствующий параметр масштабирования. Вы также можете центрировать изображение вертикально или горизонтально и даже отразить его при желании. Все изменения мгновенно отображаются в разделе предварительного просмотра.

В нашем случае оригинальное изображение Мэрилин Монро было размером 400×300 пикселей. Поэтому мы ввели 128 для ширины и 64 для высоты, выбрали «scale to fit» и центрировали изображение горизонтально для аккуратного позиционирования.

Подключение графического OLED-дисплея к Arduino

Одна из самых важных настроек — порог яркости. Эта настройка определяет, какие пиксели станут чёрными, а какие — белыми. Любой пиксель ярче порога будет отображаться белым, а всё, что темнее — чёрным. Также есть настройка, позволяющая инвертировать цвета изображения, что может быть полезно в зависимости от желаемого вида на дисплее.

Для нашего изображения мы установили порог яркости на 171, чтобы захватить больше деталей и сделать изображение чётче.

По мере изменения настроек следите за разделом предварительного просмотра — он обновляется в реальном времени, и вы можете видеть, как именно изображение будет выглядеть на OLED.

Подключение графического OLED-дисплея к Arduino

Когда вас всё устроит, просто нажмите кнопку Generate code.

Вот и всё! Ваше изображение будет преобразовано в готовый к использованию массив, который можно скопировать и вставить в скетч Arduino.

Подключение графического OLED-дисплея к Arduino

Код Arduino

Чтобы отобразить изображение на OLED-экране, вставьте сгенерированный байтовый массив в скетч Arduino ниже.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels

// Declaration for SSD1306 display connected using I2C
#define OLED_RESET -1  // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Declaration for SSD1306 display connected using software SPI:
//#define OLED_MOSI   9
//#define OLED_CLK   10
//#define OLED_DC    11
//#define OLED_CS    12
//#define OLED_RESET 13
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// Bitmap of MarilynMonroe Image
const unsigned char MarilynMonroe[] PROGMEM = {
  0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xf0, 0x41, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xf1, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x02, 0x78, 0x7f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xfe, 0x03, 0x7c, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xfe, 0x01, 0xfe, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xfd, 0xe0, 0x03, 0xff, 0xff, 0xfc, 0x00, 0xfe, 0x0f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0xe0, 0xff, 0xff, 0xfc, 0x00, 0x06, 0x07, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xf9, 0xff, 0xff, 0xfc, 0x00, 0x02, 0x07, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xc3, 0xc3, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xe0, 0x0c, 0x00, 0xe7, 0x81, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xe0, 0x02, 0x00, 0x02, 0x00, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x1e, 0x3f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0x3f, 0xf8, 0x00, 0x18, 0x7f, 0x1f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xf8, 0x01, 0x80, 0x03, 0xfc, 0x3f, 0xfc, 0x00, 0x70, 0xfe, 0x1f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xf0, 0x43, 0xff, 0xff, 0xf8, 0x7f, 0xf8, 0x00, 0x00, 0x7e, 0x1f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xf0, 0xff, 0xfc, 0x00, 0x00, 0x7c, 0x3f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xf1, 0xef, 0xf8, 0x00, 0x01, 0xfc, 0x3f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xf3, 0x80, 0xa0, 0x00, 0x07, 0xfc, 0xaf, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xec, 0x5f, 0xff, 0xff, 0xe7, 0xf0, 0x00, 0x00, 0x03, 0xfe, 0xdf, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xee, 0x7f, 0xff, 0xff, 0xc7, 0xf8, 0x00, 0x00, 0x03, 0xff, 0xdf, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xf7, 0xc7, 0xff, 0x06, 0x00, 0x03, 0xff, 0xbf, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, 0xc7, 0x07, 0xff, 0x80, 0x00, 0x07, 0xdb, 0xbf, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0x80, 0x03, 0xff, 0xc0, 0x00, 0x03, 0xc3, 0x0f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x98, 0x03, 0xff, 0xf8, 0x00, 0x07, 0xe0, 0x0f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xfc, 0x01, 0x07, 0xfc, 0x1f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xcf, 0xef, 0xff, 0xff, 0xe1, 0xff, 0xfc, 0x01, 0x07, 0xf8, 0x1f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0x7f, 0xf1, 0xff, 0xf8, 0x02, 0x07, 0x88, 0x3f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xcf, 0xef, 0xf8, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x07, 0x84, 0x3f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xe7, 0xef, 0xf0, 0x04, 0x7f, 0xff, 0xc0, 0x00, 0x07, 0x84, 0x7f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x3f, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x06, 0x04, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x3f, 0x7f, 0xe1, 0xf0, 0x07, 0xff, 0x80, 0x00, 0x07, 0x06, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xfe, 0x03, 0xff, 0x00, 0x00, 0x03, 0x80, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xf2, 0x3f, 0xc6, 0x7f, 0x81, 0xce, 0x00, 0x00, 0x01, 0xc1, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xe0, 0x3f, 0xc0, 0x07, 0xc1, 0xfe, 0x00, 0x00, 0x0d, 0xc0, 0x7f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xe0, 0x3f, 0xc0, 0x01, 0xe0, 0xfc, 0x00, 0x00, 0x0f, 0xc0, 0x7f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xc0, 0x3f, 0xc0, 0x00, 0x50, 0xfc, 0x00, 0x00, 0x0e, 0xc0, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xc0, 0x3f, 0xc0, 0x00, 0x18, 0xf8, 0x00, 0x00, 0x0e, 0xc1, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xc0, 0x3f, 0xc0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x66, 0x81, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xc0, 0x1f, 0xc7, 0x80, 0x00, 0xf8, 0x00, 0x01, 0xe0, 0x00, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xc0, 0x1f, 0xc1, 0xe0, 0x01, 0xf8, 0x00, 0x03, 0xf0, 0x01, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x80, 0x1f, 0xc0, 0x3e, 0x03, 0xf0, 0x00, 0x00, 0xe0, 0x03, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x00, 0x1f, 0xe0, 0xe0, 0x03, 0xf2, 0x00, 0x00, 0xc0, 0x03, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x80, 0x1f, 0xf0, 0x00, 0x07, 0xe6, 0x00, 0x00, 0xc0, 0x03, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0x00, 0x1f, 0xee, 0x00, 0x00, 0x80, 0x07, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xb8, 0x0f, 0xff, 0xf0, 0x3f, 0xdc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xbc, 0x0f, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x9e, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x08, 0x0f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x00, 0x0b, 0xff, 0xff, 0xfe, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x00, 0x0b, 0xff, 0xff, 0xf9, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x3c, 0x09, 0xff, 0xff, 0xf1, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x1e, 0x08, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x1f, 0x08, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x80, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xce, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xfe, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff
};

void setup() {
  Serial.begin(9600);

  // initialize the OLED object
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ;  // Don't proceed, loop forever
  }

  // Uncomment this if you are using SPI
  //if(!display.begin(SSD1306_SWITCHCAPVCC)) {
  //  Serial.println(F("SSD1306 allocation failed"));
  //  for(;;); // Don't proceed, loop forever
  //}

  // Clear the buffer.
  display.clearDisplay();

  // Display bitmap
  display.drawBitmap(0, 0, MarilynMonroe, 128, 64, WHITE);
  display.display();
}

void loop() {
}

После загрузки этого скетча на Arduino ваше изображение появится на OLED-экране точно так же, как в предварительном просмотре конвертера.

Подключение графического OLED-дисплея к Arduino

Попробуйте и получайте удовольствие, экспериментируя с вашими любимыми изображениями!

Объяснение кода

Этот скетч начинается так же, как предыдущие примеры, с настройки OLED-дисплея. Мы подключаем необходимые библиотеки и инициализируем дисплей с помощью функции begin(). Когда настройка завершена, мы добавляем пользовательское изображение на экран.

Для этого мы сначала размещаем данные изображения — байтовый массив — в глобальной секции кода, над функцией setup(). Этот массив генерируется с помощью нашего конвертера изображений, который преобразует картинку в формат, понятный OLED-экрану. В нашем примере массив называется MarilynMonroe.

В функции setup(), после очистки дисплея, мы используем новую функцию drawBitmap() для отрисовки изображения на экране. Эта функция является ключом к отображению изображений и требует шесть параметров.

Первые два значения — это координаты X и Y, определяющие, где на экране начнётся изображение. В нашем случае оба установлены в 0, что означает, что изображение начинается с верхнего левого угла дисплея. Третье значение — это имя массива изображения, который мы хотим отрисовать, в нашем примере это MarilynMonroe. Следующие два значения — ширина и высота изображения в пикселях. Наш OLED-экран имеет разрешение 128 пикселей в ширину и 64 пикселя в высоту, и наше изображение именно такого размера, поэтому мы передаём 128 и 64. Последний параметр — цвет. Поскольку мы работаем с монохромным экраном, используем WHITE для отображения изображения белыми пикселями на тёмном фоне.

Таким образом, полная строка выглядит так:

// Display bitmap
display.drawBitmap(0, 0,  MarilynMonroe, 128, 64, WHITE);

Однако, хотя эта функция подготавливает изображение к отображению, оно фактически не появится на экране, пока мы не вызовем display.display();. Эта строка отправляет всё, что мы подготовили в памяти, на реальный OLED-экран.

display.display();

Поскольку изображение не нужно менять или повторять в этом примере, мы оставляем функцию loop() пустой.