OLED-дисплей (Troyka-модуль)

OLED-дисплей пригодится для отображения показаний сенсоров и модулей в виде текста, графиков и диаграмм.

Видеообзор

Примеры для Arduino

Схема устройства

Подключите дисплей к Arduino Uno к пинам шины I²C — SDA и SCL.

Для быстрой сборки используйте Troyka Shield. С Troyka Slot Shield провода не понадобятся вовсе.

Для упрощения работы с OLED-дисплеем скачайте и установите библиотеку TroykaOLED.

Библиотека подходит для всех платформ Arduino — как с AVR-контроллерами, так и с ARM.

Вывод текста

Для вывода первой программы приветствия, воспользуйтесь кодом вроде этого:

printText.ino
// библиотека для работы с OLED-дисплеем
#include <TroykaOLED.h>
// создаём объект для работы с дисплеем
// и передаём I²C адрес дисплея
TroykaOLED myOLED(0x3C);
 
void setup() {
  // инициализируем дисплей
  myOLED.begin();
  // выбираем шрифт 6×8
  myOLED.setFont(font6x8);
  // печатаем строку
  myOLED.print("Hello world!", 25, 0);
  // выбираем шрифт 12×10
  myOLED.setFont(font12x10);
  // печатаем строку
  myOLED.print("Amperka", 20, 20);
  // инвертируем последующий текст
  myOLED.invertText("true");
  myOLED.print("OLED", 40, 40);
}
 
void loop() {
 
}

Вывод кириллицы

Для вывода кириллицы используйте соответствующий шрифт с поддержкой русского языка.

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

printTextRus.ino
// библиотека для работы с OLED-дисплеем
#include <TroykaOLED.h>
// создаём объект для работы с дисплеем
// и передаём I²C адрес дисплея
TroykaOLED myOLED(0x3C);
 
void setup() {
  // инициализируем дисплей
  myOLED.begin();
  // выбираем кодировку символов: CP866, TXT_UTF8 или WIN1251
  myOLED.setCoding(TXT_UTF8);
  //myOLED.setCoding(TXT_CP866);
  //myOLED.setCoding(TXT_WIN1251);
  // выбираем шрифт 6×8 с поддержкой кириллицы
  myOLED.setFont(fontRus6x8);
  // печатаем строку с координатами начала текста
  myOLED.print("Привет мир!", OLED_CENTER, 10);
  // выбираем шрифт 12×10 с поддержкой кириллицы
  myOLED.setFont(fontRus12x10);
  // печатаем строку с координатами начала текста
  myOLED.print("Амперка", OLED_CENTER, 20);
}
 
void loop() {
 
}

Вывод геометрических фигур

Методы библиотеки также позволяют выводить геометрические фигуры.

drawGeometricFigures.ino
// библиотека для работы с OLED-дисплеем
#include <TroykaOLED.h>
// создаём объект для работы с дисплеем
// и передаём I²C адрес дисплея
TroykaOLED myOLED(0x3C);
 
void setup() {
  // инициализируем дисплей
  myOLED.begin();
  // получаем ширину и высоту дисплея
  int width = myOLED.getWidth();
  int height = myOLED.getHeigth();
  // рисуем две диагонали
  myOLED.drawLine(0, 0, width - 1, height - 1);
  myOLED.drawLine(0, height - 1, width - 1, 0);
  // рисуем окружность в центре дисплея и радиусом 30
  myOLED.drawCircle(width / 2, height / 2, 30);
  // рисуем диск (закрашенную окружность) в центре дисплея и радиусом 20
  myOLED.drawCircle(width / 2, height / 2, 20, true);
}
 
void loop() {
 
}

Вывод встроенных изображений

drawDefaultImages.ino
// библиотека для работы с OLED-дисплеем
#include <TroykaOLED.h>
// создаём объект для работы с дисплеем
// и передаём I²C адрес дисплея
TroykaOLED myOLED(0x3C);
 
void setup() {
  // инициализируем дисплей
  myOLED.begin();
  // выводим изображение сигнала связи
  myOLED.drawImage(signal4, OLED_LEFT, OLED_TOP);
  // выводим изображение антенны
  myOLED.drawImage(antenna, 12, OLED_TOP);
  // выводим изображение bluetooth
  myOLED.drawImage(bluetooth, 24, OLED_TOP);
  // выводим изображение батарейки
  myOLED.drawImage(battery3, OLED_RIGHT, OLED_TOP);
  // выводим изображение письма
  myOLED.drawImage(mesege, OLED_CENTER, OLED_CENTER);
}
 
void loop() {
 
}

Вывод собственных изображений

Для начала подготовьте картинку для вывода её на экран — преобразуйте в массив чисел. Для этого понадобится графический редактор GIMP и программа для создание массива символов из изображения LCDAssistant.

Подготовка изображения

  1. В графическом редакторе «GIMP» откройте интересующую картинку.
  2. Преобразуйте изображение в разрешение дисплея, не более 128×64.

    Высота картинки должна быть кратна восьми.

  3. В настойках цветов переконвертируйте из цветного изображения в чёрно-белое.
  4. Возьмите карандаш и подредактируйте изображение. Должно остаться только два цвета: никаких 50 оттенков серого, только чёрное и белое.
  5. Экспортируйте изображение в формате .bmp.
  6. В программе «LCDAssistant» откройте битовое изображение.
  7. В настройке ориентация байтов выставьте по вертикали, а размер изображения должен автоматически выставиться при загрузке картинки.
  8. Нажмите File Save output и сохраните файл с расширением .h.
  9. Откройте полученный файл текстовым редактором. Если вы всё сделали верно в файле должен содержаться массив шестнадцатеричных чисел.
  10. Добавьте в начала массива два элемента: ширина и высота изображения.
  11. Скопируйте весь массив и вставьте в начала кода программы «Arduino IDE».

Повторимся ещё раз, каждый символ в массиве это байт, в котором храниться информация о том, какие пиксели (биты) закрашивать в данном байте. И так по очереди все байты на каждой странице.

Код программы

drawImages.ino
// библиотека для работы с OLED-дисплеем
#include <TroykaOLED.h>
// создаём объект для работы с дисплеем
// и передаём I²C адрес дисплея
TroykaOLED myOLED(0x3C);
 
// массив изображения
const unsigned char alina [] PROGMEM = { 128, 64,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFC, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xC0, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0x7F, 0x3F, 0x1F, 0x8F, 0x8F, 0xCF, 0x8F, 0xCB, 0x8F, 0x9B, 0x8B, 0x1B, 0x13, 0x03, 0x01,
  0x01, 0x01, 0x00, 0x01, 0xC3, 0xE5, 0xDF, 0xDF, 0xDF, 0xEF, 0xCF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x07, 0x03, 0x01, 0x01,
  0x00, 0x00, 0x02, 0x03, 0x03, 0x03, 0x07, 0x03, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0x27, 0x6B, 0x83, 0x00, 0x03, 0x03, 0x03, 0x07, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0x12, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x1C, 0xA4, 0x88, 0x00, 0x80, 0xF0, 0xFF, 0xFF, 0xFF,
  0xFF, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA0, 0x80, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0C,
  0x14, 0x0E, 0x0E, 0x1E, 0x0E, 0x1E, 0x0F, 0x2A, 0x81, 0xE0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFE, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2A, 0x04, 0x00, 0x01, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
  0x00, 0x80, 0x80, 0x80, 0x80, 0x20, 0x30, 0x3E, 0x3F, 0x7F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
  0x7F, 0x3F, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
 
void setup() {
  // инициализируем дисплей
  myOLED.begin();
  // инвертируем экран для наглядности изображение
  myOLED.invertDisplay(true);
  // выводи изображение с координатами верхнего левого угла
  myOLED.drawImage(alina, 0, 0);
}
 
void loop() {
 
}

Примеры для Espruino

Схема устройства

Подключите дисплей к Iskra JS к пинам шины I²C — SDA и SCL.

Для быстрой сборки используйте Troyka Shield. С Troyka Slot Shield провода не понадобятся вовсе.

Вывод текста

Для вывода первой программы приветствия, воспользуйтесь скриптом вроде этого:

printText.js
// настраиваем шину I²C
PrimaryI2C.setup({sda: SDA, scl: SCL, bitrate: 100000});
// подключаем библиотеку для работы с графическим дисплеем
var screen = require("SSD1306").connect(PrimaryI2C);
// выбираем размер шрифта
screen.setFontVector(15);
// записываем строку в буфер дисплея
screen.drawString("Hello world!", 18, 0);
// отображаем содержимое буфера на экране
screen.flip();

Вывод геометрических фигур

Методы библиотеки также позволяют выводить геометрические фигуры.

geometricFigures.js
// настраиваем шину I²C
PrimaryI2C.setup({sda: SDA, scl: SCL, bitrate: 100000});
// подключаем библиотеку для работы с графическим дисплеем
var screen = require("SSD1306").connect(PrimaryI2C);
// получаем ширину и высоту дисплея
var width = screen.getWidth();
var height = screen.getHeight();
// рисуем две диагонали
screen.drawLine(0, 0, width - 1, height - 1);
screen.drawLine(0, height - 1, width - 1, 0);
// рисуем окружность в центре дисплея и радиусом 30
screen.drawCircle(width / 2, height / 2, 30);
// рисуем диск (закрашенную окружность) в центре дисплея и радиусом 20
screen.fillCircle(width / 2, height / 2, 20);
// отображаем содержимое буфера на экране
screen.flip();

Примеры для WiFi Slot

Схема устройства

Подключите дисплей к платформе WiFi Slot к пинам шины I²C — SDA и SCL. Для этого установите модуль в соответствующий слот.

Платформа WiFi Slot программируется двумя способами:

Соответственно после настройки платформы выберите код из примера Arduino или код для JavaScript.

Элементы платы

OLED-дисплей

Дисплей модуля выполнен по технологии OLED с разрешением 128×64. Методика OLED (organic light-emitting diode) — это матрица точек, где каждый пиксель является отдельным светодиодом. Благодаря таким светящимся пикселям — OLED-дисплей обладает высокой контратсностью, углом обзора более 160° и не нуждается в подсветке.

Пользовательские кнопки

На модуле по бокам расположены две тактовых кнопки S1 и S2.

Пока кнопка отпущена — на сигнальном пине S присутствует логическая единица, а при нажатии на кнопку — логический ноль.

Troyka-контакты

На модуле выведено две пары Troyka-контактов.

Нижняя группа

  • Питание (V) — соедините с рабочим напряжением микроконтроллера.
  • Земля (G) — Соедините с землёй микроконтроллера.

Верхняя группа

  • Сигнальный (D) — пин данных шины I²C. Подключите к SDA пину микроконтроллера.
  • Сигнальный (C) — пин тактирования шины I²C. Подключите к SCL пину микроконтроллера.

Смена адреса модуля

Иногда в проекте необходимо использовать несколько дисплеев. Для смена адреса капните каплей припоя на отведённую контактную площадку на обратной стороне модуля. После чего адрес дисплея сменится с 0x3C на 0x3D.

Понижающий регулятор напряжения

Линейный понижающий регулятор напряжения NCP582 с выходом 3,3 вольта, обеспечивает питание дисплейного модуля. Максимальный выходной ток составляет 150 мА.

На плате так же присутствует необходимая обвязка для сопряжения устройств с разными питающими напряжениями.

В нашем случае это может быть управляющая плата Arduino с 5 вольтовой логикой и OLED-дисплей с 3,3 вольтовой логикой.

Принципиальная и монтажная схемы

Характеристики

  • Диагональ: 0,96 дюйма
  • Разрешение: 128×64
  • Технология: OLED (Organic Light Emitting Diode)
  • Драйвера матрицы: SSD1306
  • Цвет: монохромный
  • Угол обзора: более 160°
  • Напряжение питания: 3.3–5 В
  • Интерфейс: I²C
  • Адрес модуля: 0x3C (по умолчанию) / 0x3D
  • Дополнительно: две пользовательских кнопки
  • Габариты: 50,8×25,4 мм

Ресурсы