Мы уже познакомились с разными видами дисплеев, включая популярный символьный 1602 и не менее популярный графический ЖК дисплей от телефона Nokia 5110. Они хороши для решения своих утилитарных задач. На первом можно легко вывести показания различных датчиков, и организовать меню настройки какого-нибудь прибора. На втором дисплее, от Nokia 5110, можно рисовать графики, геометрические фигуры, даже вывести черно-белую картинку.
Сегодня речь пойдет еще об одном типе цифровых индикаторов, которые основаны на технологии OLED. В отличие от ЖК дисплеев, в OLED каждый пиксель изображения светится сам, что делает ненужным подсветку. По сути, OLED матрица состоит из множества органических светодиодов. Благодаря таким светящимся пикселям, эти дисплеи обладают запредельными показателями контрастности. А еще, OLED технология позволяет делать гибкие матрицы!
Еще лет 10 назад, когда технология только-только начала набирать обороты, у OLED было несколько проблем, самой серьезной из которых был короткий срок службы светодиодов. За последние несколько лет инженеры победили большинство «детских» болезней этой технологии, и теперь OLED дисплеи используются даже в ультрасовременных телевизорах с большой диагональю. Также OLED применяют в дисплеях для мобильных устройств, например в одной из модификаций Google Nexus.
Раз OLED дисплей такой хороший, попробуем его подключить к Ардуино, и увидеть все своими глазами!
Список необходимых компонентов
Для выполнения всех примеров с дисплеем OLED, кроме самого модуля дисплея, потребуется Ардуино-совместимый контроллер и немного проводов вилка-розетка. Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.
1. Подключение OLED дисплея к Ардуино
Мы будем экспериментировать с популярными в DIY среде монохромными OLED дисплеями на основе контроллера SSD1306. Есть разные версии, с разным цветом свечения и разным разрешением. Наш дисплейчик имеет диагональ 0.96 дюйма и разрешение 128 x 64 точек. Матрица разделена на две части с разными цветами. Верхний блок — 128×16 имеет желтый цвет, нижний — 128×48 — голубой.
Дисплейные модули OLED могут иметь разные интерфейсы для связи с контроллером. В нашем распоряжении оказался модуль с SPI шиной, у которого было распаяно шесть ног:
- GND — земля;
- VCC — питание 5 В;
- DO — синхросигнал;
- D1 — входные данные (MOSI);
- RST — сброс (Reset);
- DC — выбор режима (Data/Command select).
Схема подключения к Ардуино:
OLED дисплей 128×64 | GND | VCC | DO | D1 | RST | DC |
Ардуино Уно | GND | +5V | 10 | 9 | 13 | 11 |
2. Программа. Вывод текста
Для управления дисплеем нам потребуются две библиотеки:
1) Adafruit_GFX_Library — мы её уже ставили, когда подключали Nokia 5110
https://github.com/adafruit/Adafruit-GFX-Library/archive/master.zip
2) Adafruit_SSD1306 — библиотека для управления именно OLED дисплеями
https://github.com/adafruit/Adafruit_SSD1306
Устанавливаем обе библиотеки в Arduino IDE, и пробуем вывести наш любимый «Hello world!»:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
void setup() {
// инициализация и очистка дисплея
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
delay(1000);
display.setTextSize(1); // установка размера шрифта
display.setTextColor(WHITE); // установка цвета текста
display.setCursor(0,0); // установка курсора
display.println("Hello, world!");
display.display();
}
void loop() {
}
Загружаем программу на Ардуино Уно, и получаем вот такую яркую надпись очень мелким шрифтом:
Подробное описание функций, которые мы использовали в коде, можно найти в предыдущем уроке про Nokia 5110. Там же можно найти описание функций для вывода геометрических фигур.
3. Программа. Вывод изображения
Как и в случае дисплея Nokia 5110, для того чтобы вывести изображение нам необходимо его должным образом подготовить. На всякий случай, напомню алгоритм:
- создаем в любом графическом редакторе черно-белую картинку с разрешением 128 x 64 точки;
- сохраняем в формате BMP с 256 цветами (так умеет делать mspaint);
- конвертируем картинку в массив байт с помощью онлайн сервиса: https://tools.robotclass.ru/bmp2bin/bmp2bin.html
Осталось вставить полученный массив данных в программу:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
const unsigned char PROGMEM logoBmp[] = {
0x0,0x0,0x0,0x0,0x3,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0xe,0x3f,0xff,0x38,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x1f,0xff,0xff,0xfc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x3f,0xff,0xff,0xfe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x3f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x3f,0xf8,0x7,0xfe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x3f,0xe0,0x3,0xfe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x7f,0xf0,0x0,0x3f,0xc0,0x0,0xff,0x0,0xff,0xe0,0x0,0x1f,0xf8,0x7,0xff,0xfe,
0x7f,0xfe,0x0,0x7f,0x80,0x0,0xff,0x0,0xff,0xf8,0x0,0x7f,0xfe,0x7,0xff,0xfe,
0x7f,0xff,0x0,0x7f,0x0,0x0,0x7f,0x0,0xff,0xfc,0x1,0xff,0xff,0x7,0xff,0xfe,
0x7f,0xff,0x81,0xff,0x0,0x0,0x3f,0xe0,0xff,0xfe,0x3,0xff,0xff,0x87,0xff,0xfe,
0x7c,0x3f,0x83,0xff,0x0,0x0,0x3f,0xf0,0xf8,0x7f,0x7,0xf8,0x1f,0xc0,0x1f,0x80,
0x7c,0xf,0x83,0xfe,0x0,0x0,0x3f,0xf0,0xf8,0x3f,0x7,0xe0,0x7,0xe0,0x1f,0x80,
0x7c,0xf,0x83,0xfe,0x0,0x0,0x3f,0xf0,0xf8,0x3f,0xf,0xc0,0x7,0xe0,0x1f,0x80,
0x7c,0xf,0x83,0xfe,0x0,0x0,0x3f,0xf0,0xf8,0x3f,0xf,0x80,0x3,0xf0,0x1f,0x80,
0x7c,0x1f,0x83,0xfe,0x0,0x0,0x3f,0xf0,0xf8,0x3e,0x1f,0x80,0x3,0xf0,0x1f,0x80,
0x7c,0x3f,0x83,0xfe,0x0,0x0,0x3f,0xf0,0xf8,0xfe,0x1f,0x80,0x1,0xf0,0x1f,0x80,
0x7f,0xff,0x1,0xff,0x0,0x0,0x3f,0xe0,0xff,0xfc,0x1f,0x0,0x1,0xf0,0x1f,0x80,
0x7f,0xfe,0x0,0x7f,0x0,0x0,0x3f,0x80,0xff,0xfc,0x1f,0x0,0x1,0xf0,0x1f,0x80,
0x7f,0xfc,0x0,0x7f,0x80,0x0,0x7f,0x0,0xff,0xfe,0x1f,0x0,0x1,0xf0,0x1f,0x80,
0x7f,0xf0,0x0,0x3f,0x80,0x0,0xff,0x0,0xff,0xff,0x1f,0x0,0x1,0xf0,0x1f,0x80,
0x7d,0xf8,0x0,0x3f,0xc0,0x1,0xff,0x0,0xf8,0x3f,0x9f,0x80,0x1,0xf0,0x1f,0x80,
0x7c,0xfc,0x0,0x1f,0xf0,0x3,0xfe,0x0,0xf8,0xf,0x9f,0x80,0x1,0xf0,0x1f,0x80,
0x7c,0xfc,0x0,0x3f,0xfc,0xf,0xfe,0x0,0xf8,0xf,0x8f,0x80,0x3,0xf0,0x1f,0x80,
0x7c,0x7e,0x0,0x7f,0xff,0xff,0xff,0x0,0xf8,0xf,0x8f,0xc0,0x3,0xe0,0x1f,0x80,
0x7c,0x3f,0x0,0x7f,0xff,0xff,0xff,0x0,0xf8,0x1f,0x8f,0xe0,0x7,0xe0,0x1f,0x80,
0x7c,0x3f,0x0,0x3f,0xff,0xff,0xff,0x0,0xf8,0x1f,0x87,0xf0,0x1f,0xc0,0x1f,0x80,
0x7c,0x1f,0x80,0x1f,0xff,0xff,0xfe,0x0,0xff,0xff,0x3,0xff,0xff,0x80,0x1f,0x80,
0x7c,0xf,0xc0,0xf,0xff,0xff,0xfc,0x0,0xff,0xfe,0x1,0xff,0xff,0x80,0x1f,0x80,
0x7c,0x7,0xe0,0x6,0x3f,0xfe,0x38,0x0,0xff,0xfc,0x0,0xff,0xfe,0x0,0x1f,0x80,
0x7c,0x7,0xe0,0x0,0x7,0xf8,0x0,0x0,0xff,0xf0,0x0,0x3f,0xf8,0x0,0x1f,0x80,
0x0,0x0,0x0,0x0,0x7,0xf8,0x0,0x0,0x0,0x0,0x0,0x7,0xc0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x3,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x7c,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0x0,0x1,0xe0,0x0,0x0,0x0,0x0,
0x3,0xff,0xc1,0xf0,0x0,0x3,0xe0,0x0,0x7f,0xf0,0xf,0xfe,0x0,0x0,0x0,0x0,
0x7,0xff,0xc1,0xf0,0x0,0x7,0xe0,0x0,0xff,0xf0,0x1f,0xfe,0x0,0x0,0x0,0x0,
0xf,0xff,0xc1,0xf0,0x0,0x7,0xf0,0x1,0xff,0xf0,0x3f,0xfe,0x0,0x0,0x0,0x0,
0x1f,0xff,0xc1,0xf0,0x0,0x7,0xf0,0x1,0xff,0xf0,0x3f,0xfe,0x0,0x0,0x0,0x0,
0x3f,0x80,0xc1,0xf0,0x0,0xf,0xf0,0x3,0xf0,0x30,0x7e,0xe,0x0,0x0,0x0,0x0,
0x7e,0x0,0x1,0xf0,0x0,0xf,0xf8,0x3,0xe0,0x0,0x7c,0x0,0x0,0x0,0x0,0x0,
0x7e,0x0,0x1,0xf0,0x0,0x1f,0xf8,0x3,0xe0,0x0,0x7c,0x0,0x0,0x0,0x0,0x0,
0x7c,0x0,0x1,0xf0,0x0,0x1f,0xfc,0x3,0xf0,0x0,0x7e,0x0,0x0,0x0,0x0,0x0,
0xfc,0x0,0x1,0xf0,0x0,0x1f,0x7c,0x3,0xfc,0x0,0x7f,0x80,0x0,0x0,0x0,0x0,
0xf8,0x0,0x1,0xf0,0x0,0x3e,0x7c,0x1,0xff,0x0,0x3f,0xe0,0x0,0x0,0x0,0x0,
0xf8,0x0,0x1,0xf0,0x0,0x3e,0x3e,0x0,0xff,0xc0,0x1f,0xf8,0x0,0x0,0x0,0x0,
0xf8,0x0,0x1,0xf0,0x0,0x3e,0x3e,0x0,0x7f,0xe0,0xf,0xfc,0x0,0x0,0x0,0x0,
0xf8,0x0,0x1,0xf0,0x0,0x7f,0xff,0x0,0x1f,0xf0,0x3,0xfe,0x0,0x0,0x0,0x0,
0xf8,0x0,0x1,0xf0,0x0,0x7f,0xff,0x0,0x7,0xf8,0x0,0xff,0x0,0x0,0x0,0x0,
0xfc,0x0,0x1,0xf0,0x0,0xff,0xff,0x0,0x1,0xf8,0x0,0x3f,0x0,0x0,0x0,0x0,
0xfc,0x0,0x1,0xf0,0x0,0xff,0xff,0x80,0x0,0xf8,0x0,0x1f,0x0,0x0,0x0,0x0,
0x7e,0x0,0x1,0xf0,0x0,0xff,0xff,0x82,0x0,0xf8,0x40,0x1f,0x0,0x0,0x0,0x0,
0x7f,0x0,0x41,0xf0,0x1,0xf8,0xf,0xc3,0x80,0xf8,0x70,0x1f,0x0,0x0,0x0,0x0,
0x3f,0x83,0xc1,0xf0,0x1,0xf0,0x7,0xc3,0xe1,0xf8,0x7c,0x3f,0x0,0x0,0x0,0x0,
0x1f,0xff,0xc1,0xff,0xe3,0xf0,0x7,0xc3,0xff,0xf0,0x7f,0xfe,0x0,0x0,0x0,0x0,
0xf,0xff,0xc1,0xff,0xe3,0xe0,0x7,0xe3,0xff,0xf0,0x7f,0xfe,0x0,0x0,0x0,0x0,
0x7,0xff,0xc1,0xff,0xe3,0xe0,0x3,0xe1,0xff,0xe0,0x3f,0xfc,0x0,0x0,0x0,0x0
};
void setup() {
// инициализация и очистка дисплея
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
delay(1000);
// отрисовка изображения
display.drawBitmap(0, 0, logoBmp, 128, 64, WHITE);
display.display();
}
void loop() {
}
Результат выполнения этой программы можно найти в самом верху этой статьи. А если немного усложнить программу, и выводить по-очереди две картинки, получим простую анимацию.
Итак, OLED дисплей побежден!
Задания
Чтобы развить навыки работы с OLED дисплеем, рекомендуем выполнить несколько заданий.
- Собрать на базе акселерометра и OLED дисплея строительный электронный уровень. Ставим прибор на тестируемую поверхность, и он показывает в какую сторону и насколько градусов она наклонена. Факт наклона можно отобразить окружностью, смещенной относительно центра в виде перекрестья.
- Самые продвинутые и терпеливые могут сделать игру «змейка». Для игры потребуется дисплей, Ардуино Уно (или любая другая плата), 4 тактовые кнопки и зуммер. Инструкция по созданию игры змейка с дисплеем hx1230.
- Ещё одна игра — Alien Invaders, прямиком их 80x. Цикл уроков по созданию игры Alien Ivaders .
Хороший очень яркий дисплей, использовал такой, только не на ардуино, а с платой RW30, она на STM32 и по размеру как дисплей.
не совсем понятно, слово в слово копипаст ))) результат другой
при попытке вставить по инструкции другую картинку результат еще более странный (но в общем такой же)
отображается пол картинки если быть точнее, тк картинку не прилепить к комментам поверить