Графический OLED-дисплей умеет выводить показания сенсоров и модулей в виде текста, графиков и диаграмм. Каждый пиксель дисплея является отдельным OLED-светодиодом и не нуждается в подсветке.
Дисплей работает на интерфейсе I2C, для его подключения достаточно двух проводов.
В качестве примера возьмём Arduino Uno. Подключите дисплей к пинам шины I²C — SDA
и SCL
. Для быстрой сборки используйте Troyka Shield.
С Troyka Slot Shield провода вообще не понадобятся — просто вставьте дисплей в слоты
A
и B
.
Для работы с OLED-дисплеем скачайте и установите библиотеку TroykaOLED. Библиотека подходит для всех платформ Arduino и работает как с AVR-контроллерами, так и с ARM.
Выведем на дисплее текст приветствия. Для этого напишем код, в котором зададим размеры шрифта и координаты вывода текста:
// библиотека для работы с 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() { }
Для вывода кириллицы выберите шрифт с поддержкой русского языка. Библиотека по умолчанию использует кодировку UTF-8, но в некоторых случаях вместо кириллических символов может появиться нечитаемый текст. Например, если скетч не был сохранён перед загрузкой. В таком случае вызовите функцию setCoding
и смените кодировку.
// библиотека для работы с 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); }
На дисплей можно вывести точку, линию, прямоугольник, круг и другие фигуры. Координаты фигуры — обязательные параметры, без них ничего не нарисовать. Заливка фигуры — дополнительный параметр. Если его не указывать, фигура выводится без заливки.
// библиотека для работы с 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() { }
В библиотеку загружен набор готовых изображений, которые лежат в отдельном файле. Чтобы изображение появилось на экране, нужно указать его название и координаты.
// библиотека для работы с 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, который кодирует изображение в байты.
Высота картинки должна быть кратна восьми, поскольку перекрашивается целый байт. Один байт равен восьми битам.
.bmp
и откройте в программе LCDAssistant.File
нажмите Save output
и сохраните файл с расширением .h
.Каждый символ в массиве — это байт. Он хранит информацию о том, какие пиксели (биты) закрашивать в байте. Экран модуля двухцветный, поэтому 8 точек кодируются сразу одним байтом. Это помогает снизить размер буфера для видеопамяти до 1 Кб.
// библиотека для работы с 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() { }
В качестве примера возьмём Iskra JS. Подключите дисплей к пинам шины I²C — SDA
и SCL
. Для быстрой сборки используйте Troyka Shield.
С Troyka Slot Shield провода вообще не понадобятся — просто вставьте дисплей в слоты
A
и B
.
Для Espruino не нужно скачивать библиотеку — код подгрузится автоматически при прошивке.
Для вывода первой программы приветствия, воспользуйтесь скриптом вроде этого:
// настраиваем шину 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();
Методы библиотеки также позволяют выводить геометрические фигуры.
// настраиваем шину 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. Используйте пины шины I²C — SDA
и SCL
. Для этого установите модуль в соответствующий слот.
Платформа WiFi Slot программируется двумя способами:
После настройки платформы загрузите код из примера для Arduino или код для JavaScript.
Экран модуля выполнен по технологии OLED с разрешением 128×64. OLED (organic light-emitting diode) — это матрица точек, где каждый пиксель является отдельным органическим светодиодом. Благодаря светящимся пикселям дисплей не нуждается в подсветке, а чёрный цвет — действительно чёрный и не светится в темноте. Изображение остаётся насыщенным и контрастным даже при углах обзора более 160°.
На модуле по бокам расположены две тактовых кнопки S1
и S2
. Пока кнопка отпущена, на сигнальном пине S
присутствует логическая единица. При нажатии на кнопку возникает логический ноль.
На модуле выведены две пары Troyka-контактов.
Нижняя группа
Верхняя группа
SDA
пину микроконтроллера.SCL
пину микроконтроллера.
Иногда в проекте необходимо использовать несколько дисплеев. Для смены адреса капните припоем на контактную площадку с обратной стороны модуля. Адрес дисплея изменится с 0x3C
на 0x3D
.
Линейный понижающий регулятор напряжения NCP582 с выходом 3,3 В позволяет питать дисплей как от 5 В, так и напрямую от 3,3 В. Максимальный выходной ток — 150 мА.
На плате есть необходимая обвязка для подключения устройств к любым платам. Это значит, что трёхвольтовая плата не сгорит, если к ней подключить пятивольтовый датчик.