Малогабаритные SPI/I2C OLED-дисплеи Simair и Genyu: рабочий проект за один вечер

8 июня

потребительская электроникаавтоматизациялабораторные приборыинтернет вещейSIMAIRGENYUстатьяоптоэлектроникаArduinoOLEDДисплеи

Александр Калачев (г. Барнаул)

Основные характеристики OLED-дисплеев – высокая контрастность, читаемость при разном освещении и работа без замедления на морозе. Рассмотрим миниатюрные дисплеи Simair и Genyu с драйверами SSD1306, SSD1309, SSD1315 и SH1106, а также библиотеки для быстрого запуска проекта.

За последние годы OLED-дисплеи превратились из новинки в практически обыденное явление: их можно встретить в самых разных устройствах, а сами дисплеи могут иметь разнообразные размеры, форм-факторы и цвет. Из основных технических преимуществ OLED-дисплеев обычно отмечают высокую контрастность изображения, его различимость при разных условиях освещения и отсутствие замедления работы при низких температурах. При этом они потребляют достаточно мало энергии: да, они проигрывают простейшим LCD-дисплеям, но гораздо более универсальны.

Одними из широко распространенных вариантов OLED-дисплеев являются монохромные, или двухцветные (часть дисплея одного цвета, часть другого), со встроенными драйверами диодной матрицы и последовательными интерфейсами – обычно это I2C или SPI. Такие варианты применяются как в серийных изделиях, так и в радиолюбительской практике. Платы дисплейных модулей обычно предусматривают установку штыревых разъемов с шагом 2,54 мм, что позволяет их легко размещать на макетных платах любых вариантов: с монтажом или без него.

Еще одним плюсом серийных OLED-дисплеев является их совместимость между собой по крайней мере в программном плане, но не обязательно по выводам. Как и в случае с текстовыми LCD-дисплеями, в основе OLED лежит ограниченное количество микросхем драйверов: SSD1306, SSD1309, SSD1315 и SH1106, поддержка которых уже включена во многие программные библиотеки с открытым исходным кодом, в том числе под различные популярные аппаратные платформы на нескольких языках программирования.

Основные различия между драйверами SSD1306, SH1106, SSD1309 и SSD1315 заключаются в их функциональных возможностях, совместимости и нюансах применения. В таблице 1 приведены сводные характеристики каждого драйвера.

Таблица 1. Различия OLED-драйверов

Параметр SSD1306 SSD1309 SSD1315 SH1106
Разрешение, точек 128×64 128×64 128×64 128×64
Интерфейс I²C, SPI I²C, SPI I²C I²C, SPI
Питание, В 3,3/5 3,3/5 3,3/5 3,3/5
Встроенная RAM Да Да Да Да
Генератор тактовой частоты Да Да Да Да
Регулятор заряда (charge pump) Да Нет Да Да
Настраиваемый I²C‑адрес Да (обычно 0x3C или 0x3D) Да (обычно 0x3C или 0x3D) Да (обычно 0x3C или 0x3D) Да (часто фиксированный, но может быть настраиваемым, в зависимости от модуля)
Улучшенная энергоэффективность Нет Да Да Средняя
Расширенные команды управления Базовые Да Базовые Да
Широкая библиотечная поддержка Да Частично Да
(с нюансами)
Да
Типовое применение Универсальное Промышленные/энергоэффективные Универсальное, IoT, Grove‑модули Универсальное
  • SSD1306 – «золотой стандарт» для небольших OLED‑дисплеев, имеющий максимальную совместимость, обилие примеров и библиотек;
  • SSD1309 – улучшенная версия с акцентом на надежность I²C и энергоэффективность, подходящая для ответственных применений. Не имеет встроенного DC/DC преобразователя;
  • SSD1315 – упрощенная и унифицированная реализация с настраиваемым I²C‑адресом, часто работающая с кодом для SSD1306, но может требовать небольших правок;
  • SH1106 имеет буфер памяти на 132 столбца, но активно использует только 128, что может дать небольшую гибкость при скроллинге. Остальные контроллеры – строго 128×64.

OLED-дисплеи от Simair и Genyu

Малогабаритные дисплеи с интерфейсами I2C/SPI могут применения в портативных устройствах, приборах различного назначения, отладочных платах и других решениях.

Компании Simair и Genyu выпускают достаточно широкий ассортимент миниатюрных OLED-дисплеев, работающих в коммерческом диапазоне температур, что вполне достаточно для большинства возможных применений. Они представлены в вариантах синего и белого свечений, есть варианты и с I2C, и с SPI (таблицы 2, 3, 4). В документации заявлен широкий диапазон напряжения питания, что позволяет применять данные дисплеи с микроконтроллерами как 3 В, так и 5 В.

Таблица 2. Дисплеи Genyu с интерфейсом I2C

Наименование Диагональ, дюйм Разрешение, пиксель Драйвер Цвет Питание, мин/макс., В Размер, ДхШхВ, мм Температура, °C
GY091BD01-B 0,91 128×32 SSD1306 Синий 3,5/4,2 30х11,5х3,7 -40…70
GY12864-109-KSBG4P096 0,96 128×64 SSD1306 Синий 3,3/4,2 27,5х27,8х2,61 -40…85
GY12864-301-KSBG4P096 0,96 128×64 SSD1315 Синий 3,3/4,2 27,5х27,8х2,61 -40…85
GY12864-90S_blue_4IIC 1,54 128×64 SSD1309 Синий 3/5 42,3х36х3 -40…70
GY12864-90S_white_4IIC 1,54 128×64 SSD1309 Белый 3/5 42,3х36х3 -40…70
GY12864-99-KSWG4P096 0,96 128×64 SSD1306 Белый 3,3/5 27,5х27,8х2,61 -40…85

Таблица 3. Дисплеи Genyu с интерфейсом SPI

Наименование Диагональ, дюйм Разрешение, пиксель Драйвер Цвет Питание, мин./макс., В Размер, ДхШхВ, мм Температура, ⁰C
GY12864-91S_blue_7SPI 1,54 128×64 SSD1309 Синий 3/5 42,4х38х2,65 -40…70
GY12864-91S_white_7SPI 1,54 128×64 SSD1309 Белый 3/5 42,4х38х2,65 -40…70

Таблица 4. Дисплеи Simair

Наименование Диагональ, дюйм Разрешение, пиксель Драйвер Интерфейс Питание,  мин./макс., В Размер, ДхШхВ, мм
SER0.91-B 0,91 128×32 SSD1306 I²C 3/5 37,8х11,8х2,8
SER0.91-D 0,91 128×32 SSD1306 SPI 3/5 32,5х20,5х2,6
SER0.96-A 0,96 128×64 SSD1315 I²C 3/5 27,5х27,8х3
SER0.96-B 0,96 128×64 SSD1306 I²C/SPI 3/5 27,3х27,3х3,5
SER0.96-K 0,96 128×64 SSD1312 I²C 3/5 40х14,2х2,42
SER1.3-A 1,3 128×64 SH1106 I²C 3/5 35,4х33,5х3,1
SER1.3-B 1,3 128×64 SH1106 I²C/SPI 3/5 35,4х33,5х2,6
SER1.54-С 1,54 128×64 SSD1309 I²C/SPI 3/5 45,24х37х3,5

Библиотеки для работы с OLED-дисплеями

Простой поиск с запросом «библиотеки для драйверов SSD1306, SSD1309, SH1106…» выдает большое количество ссылок. Большинство из них, конечно же, библиотеки для Arduino-совместимых платформ – С, С++, Wiring, много на Python (CircuitPython, MicroPython), есть экзотические варианты: Rust, JavaScript.

Библиотеки для SSD1306:

  • Adafruit_SSD1306 – популярная библиотека для Arduino, которая поддерживает дисплеи на базе SSD1306 с разрешением 128×64 и 128×32 пикселя. Она предоставляет базовые функции для управления дисплеем: вывод текста, рисование примитивов (линий, кругов, прямоугольников) и работу с буфером памяти. Библиотека поддерживает работу как через I2С, так и через SPI. Установить ее можно через менеджер библиотек Arduino [3].
  • GyverOLED – легкая и быстрая библиотека для Arduino, разработанная AlexGyver. Поддерживает русский шрифт, имеет два режима работы: с буфером, что позволяет накладывать новые данные на старые, и без буфера, когда информация выводятся сразу, заменяя текущее отображение. Устанавливается через менеджер библиотек Arduino по названию GyverOLED [4].
  • Matiasus/SSD1306 – библиотека для работы с SSD1306 через I2 Поддерживается дисплеями с разрешением 128×64 и 128×32 пикселя. Включает в себя функции для инициализации дисплея, очистки экрана, установки нормального и инверсного режимов отображения, установки позиции курсора, вывода символов и строк, а также обновления содержимого экрана [5].
  • SillyOled – библиотека, которая поддерживает интерфейсы I2C и SPI, написана на Python для Raspberry Pi и фактически может работать на всех платформах, поддерживающих CircuitPython/MicroPython. Дает возможность использовать кириллицу, масштабирование текста, автоматический перенос и отрисовку таких фигур, как линии, прямоугольники, круги и треугольники [6].

Библиотеки для SSD1309:

  • LibDriver SSD1309 – полноценная библиотека общего назначения, совместимая с большинством микроконтроллеров. Предоставляет возможности рисования отдельных точек, заполнения блоков, отображения изображений и дополнительные функции. Соответствует стандарту MISRA [7].
  • Adafruit_SSD1309 – библиотека от Adafruit для монохромных OLED-дисплеев на базе SSD Требует установки дополнительной библиотеки Adafruit_GFX для работы с графическими примитивами. Поддерживает интерфейсы I2C и SPI [8].
  • SparkFun HyperDisplay SSD1309 – стандартная библиотека для управления дисплеями с драйвером SSD1309. Имеет расширение HyperDisplay, включает заглушки для SPI и I2C, поддерживает расширение для пользовательских интерфейсов [9].
  • ssd1309 – драйвер для SSD1309, написанный на Rust. Совместим с интерфейсом display-interface [10].

Библиотеки для SSD1315:

  • LibDriver SSD1315 – полноценная библиотека для SSD1315, совместимая с MCU и Linux. Предоставляет возможности рисования отдельных точек, заполнения блоков, отображения изображений и дополнительные функции. Соответствует стандарту MISRA [11].
  • kapojko/SSD1315 – кроссплатформенная библиотека для SSD1315, написанная на C. Для генерации изображений используется инструмент lcd-image-converter [12].
  • lynniemagoo/adafruit-ssd1315-library – Node.js-библиотека, основанная на C/C++ версии Adafruit_SSD1306 [13].

Библиотеки для SH1106:

  • SH1106Lib – библиотека для Arduino, предназначенная для работы с SH1106 через I2C. Оптимизирована для устройств с ограниченными ресурсами. Не использует буфер, что экономит память [14]. Поддерживает дисплеи с разрешением 128×64 и 128×32 пикселя, имеет функции для инициализации дисплея, очистки экрана, установки позиции курсора, вывода текста и символов. Позволяет реализовать базовые графические операции: рисование точек, линий, прямоугольников и кругов.
  • Sitron_Labs_SH1106_Arduino_Library – библиотека от Sitron Labs для Arduino [15]. Работает через I2C (с буферизацией и без), совместима с PlatformIO.
  • Adafruit_SH1106 – библиотека, совместимая с Adafruit_SSD1306, но адаптированная для SH1106. Существует версия, оптимизированная для работы с STM32 в рамках Arduino-фреймворка [16]. Совместима с другими библиотеками Adafruit. Требует изменений в процессе инициализации для функции display().
  • SH1106 от Laura Kirsch – библиотека, совместимая с Adafruit GFX [17]. Поддерживает дисплеи с разрешением 128×32, 128×64 и 96×16 пикселей (размеры задаются через макросы SH1106_LCDWIDTH и SH1106_LCDHEIGHT). Имеет только I2C-интерфейс. Адрес дисплея задается через макрос SH1106_I2C_ADDRESS.
  • Adafruit Circuitpython DisplayIO_SH1106 [18] – библиотека для CircuitPython, совместимая с DisplayIO. Поддерживает работу через SPI и I2C, позволяет создавать группы отображаемых элементов, например, для анимации.

Переходим к практике

Для практических опытов были использованы следующие модели дисплеев:

  • GY091BD01-B (SSD1306): 0,91”, интерфейс I2C, цвет синий;
  • SER0.91-D (SSD1306): 0,91”, SPI, синий;
  • SER1.3-B (SH1106): 1,3”, SPI (по умолчанию)/I2C, белый;
  • GY12864-90S_white_4IIC (SSD1309): 1,54”, I2C, белый.

Модели с диагональю 0,91” действительно малогабаритные (рисунок 1).

Рис. 1. Пример OLED-дисплеев Genyu и Simar

Рис. 1. Пример OLED-дисплеев Genyu и Simar

Таким образом, мы имеем четыре дисплея (два миниатюрных и два побольше) на базе трех различных драйверов, хотя и частично совместимых: два с интерфейсом I2C и два – с SPI.

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

Начиная с Arduino версии примерно 2.0 и далее, установка библиотек для IDE – достаточно простая процедура (рисунки 2, 3). Нужная ищется по ключевым словам или названию в менеджере библиотек и устанавливается. Также можно посмотреть ее детальное описание, перейдя по ссылке в меню менеджера. Такая схема работает для основных популярных библиотек, размещенных в основном на платформе GitHub (в случае ее отсутствия в поиске менеджера можно в настройках IDE указать путь вручную).

Библиотека u8g2 также интересна тем, что позволяет выводить в том числе и текст на кириллице, а также предлагает несколько вариантов шрифтов различного размера.

Рис. 2. Установка библиотеки в Arduino IDE

Рис. 2. Установка библиотеки в Arduino IDE

Рис. 3. Указание типа дисплея при работе с библиотекой u8g2 (модификация примера «HelloWorld»)

Рис. 3. Указание типа дисплея при работе с библиотекой u8g2 (модификация примера «HelloWorld»)

Приступаем к тестированию

В первом проекте рассмотрим применение дисплея GY12864-90S_white_4IIC для отображения показаний климатических датчиков, показанных ниже на рисунке 5. В состав устройства входят I2C-сенсоры температуры и влажности воздуха, датчик UART углекислого газа, аналоговый датчик угарного газа. Работает под управлением Arduino Mini Pro. Oled-дисплей и датчик температуры вполне хорошо уживаются на одной I2C- шине.

Несмотря на то, что в библиотеке u8g2 отсутствует поддержка драйвера SSD1309, можно пользоваться подходящим по размеру дисплея вариантом набора функций библиотеки для драйвера SSD1306. Одновременно в приложении можно использовать несколько вариантов шрифтов – все ограничивается только возможностями памяти микроконтроллера (рисунок 4). Так, для Arduino Mini Pro в памяти умещается не более двух наборов шрифтов при небольшом объеме самого исполнимого кода.

Рис. 4. Особенность вывода кириллического текста в библиотеке u8g2

Рис. 4. Особенность вывода кириллического текста в библиотеке u8g2

Рис. 5. Макет монитора климата

Рис. 5. Макет монитора климата

Второй интересной и легкой библиотекой для OLED является GyverOLED, имеющая такие характеристики, как:

  • поддержка OLED-дисплеев на SSD1306/SSH1106 с разрешением 128х64 и 128х32 и подключением по I2C и SPI;
  • динамический буфер выбранного размера (вся геометрия, текст, байты);
  • вывод текста – латиница, кириллица;
  • координаты вне дисплея для возможности прокрутки;
  • вывод текста в любую точку (попиксельная адресация);
  • полноэкранный вывод с удалением лишних пробелов;
  • 4 размера символов на базе одного шрифта;
  • быстрая инверсия всего дисплея;
  • изменение ориентации дисплея (зеркально по вертикали и горизонтали);
  • вывод графики (контур, заливка, очистка, точки, линии, геометрические фигуры);
  • пиксельные изображения;
  • программа для конвертации изображений.

Установка библиотеки аналогична предыдущей: все делается просто через менеджер IDE (рисунок 6).

Рис. 6. Установка библиотеки GyverOLED

Рис. 6. Установка библиотеки GyverOLED

Дальнейшие примеры рассматривались на базовых схемах подключения дисплеев (рисунок 7) без дополнительных внешних модулей или датчиков.

Рис. 7. Подключение OLED к платам Arduino (в данном случае – Arduino Mini Pro) по интерфейсам: а) I2C; б) SPI

Рис. 7. Подключение OLED к платам Arduino (в данном случае – Arduino Mini Pro) по интерфейсам: а) I2C; б) SPI

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

Рис. 8. Варианты примеров библиотеки GyverOLED

Рис. 8. Варианты примеров библиотеки GyverOLED

Выбор дисплеев в библиотеке также достаточно прост: можно выбирать вариант и с SPI, и с I2C (рисунок 9).

Рис. 9. Выбор нужного варианта OLED-дисплея при работе с библиотекой GyverOLED

Рис. 9. Выбор нужного варианта OLED-дисплея при работе с библиотекой GyverOLED

В случае неверно указанного в программе библиотеки типа драйвера (разумеется, при верно указанном интерфейсе) фатальных последствий не происходит: дисплей или не запускается совсем, или отображается рандомный вывод (рисунок 10).

Рис. 10. Результат несоответствия типа драйвера дисплея и варианта, инициированного в программе микроконтроллера

Рис. 10. Результат несоответствия типа драйвера дисплея и варианта, инициированного в программе микроконтроллера

На рисунке 11 показаны варианты вывода данных на экраны дисплеев.

Рис. 11. Пример вывода текста и графики на дисплеи: а) SER1.3-B; б) GY091BD01-B; в) SER0.91-D

Рис. 11. Пример вывода текста и графики на дисплеи: а) SER1.3-B; б) GY091BD01-B; в) SER0.91-D

Энергопотребление

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

Также потребляемый ток, конечно же, зависит от заполненности дисплея: чем бóльшая часть дисплея засвечена, тем выше будет значение потребляемого тока. Также этот параметр зависит от размера матрицы дисплея. В таблице 5 приведены примерные результаты представленных образцов.

Таблица 5. Энергопотребление дисплеев с разными диагоналями в зависимости от количества информации, выведенной на экран

Заполнение экрана Потребляемый ток, мА
0,91” 1,3”…1,54”
Малое 2,5…4 5…8
Среднее (например, текстом) 15…25 20…30
Практически полная заливка дисплея 40 60…80

Потребление энергии в некотором диапазоне можно регулировать, управляя контрастностью (рисунок 12). Эта опция также может быть использована и для настройки отображения в зависимости от окружающего света (хотя визуально различие минимальной яркости и полной не сильно велико).

Рис. 12. Изменения яркости/контрастности дисплеев: слева минимальная, справа максимальная

Рис. 12. Изменения яркости/контрастности дисплеев: слева минимальная, справа максимальная

Все опробованные модели работали и при напряжении 3,3 В, а также в режимах вывода текста (малая интенсивность команд по интерфейсу) и анимированной графики (интенсивный поток команд FPS порядка 45…55 кадров в секунду).

Беглый осмотр плат OLED-дисплеев показывает, что на них установлены LDO-стабилизаторы (рисунок 13), что, собственно, и позволяет им успешно работать в эшелонах питания как 5 В, так и 3,3 В. Маркировка — 662K, по данным поиска — линейный стабилизатор напряжения в корпусе SOT-23-3 (падение напряжения около 0,2…0,4 В при 90…150 мА, защита от перегрузки по току).

На работе логических выводов дисплеев напряжение питания никак не сказывается.

Рис. 13. LDO-стабилизатор на плате OLED-дисплея

Рис. 13. LDO-стабилизатор на плате OLED-дисплея

Отдельно стоит упомянуть следующий факт, присущий всем OLED-дисплеям: со временем яркость их пикселей при работе падает – они «выгорают». Так, при выводе статической картинки, не меняющейся достаточно долгое время, яркость светившихся и не светившихся точек будет различаться, что особенно заметно при сплошной или близкой к ней засветке дисплея. Пример такого эффекта приведен на рисунке 14.

Рис. 14. Эффект «выгорания» пикселей OLED-дисплея при длительном статическом выводе

Рис. 14. Эффект «выгорания» пикселей OLED-дисплея при длительном статическом выводе

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

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

Дополнительные материалы

  1. Новые миниатюрные OLED-дисплеи Genyu
  2. Миниатюрные OLED-дисплеи SIMAIR поступили на склад КОМПЭЛ
  3. Подключение OLED-дисплея SSD1306 128х32 к Arduino
  4. Библиотека GyverOLED
  5. Библиотека Matiasus/SSD1306
  6. Библиотека SillyOled
  7. Библиотека LibDriver SSD1309
  8. Библиотека Adafruit_SSD1309
  9. Библиотека SparkFun HyperDisplay SSD1309
  10. Библиотека ssd1309
  11. Библиотека LibDriver SSD1315
  12. Библиотека kapojko/SSD1315
  13. Библиотека lynniemagoo/adafruit-ssd1315-library
  14. Библиотека SH1106Lib
  15. Библиотека Sitron_Labs_SH1106_Arduino_Library
  16. Библиотека Adafruit_SH1106
  17. Библиотека SH1106
  18. Библиотека Adafruit Circuitpython DisplayIO_SH1106
•••

Наши информационные каналы

Товары
Наименование