Ардуино: графический OLED дисплей SPI

Мы уже познакомились с разными видами дисплеев, включая популярный символьный 1602 и не менее популярный графический ЖК дисплей от телефона Nokia 5110. Они хороши для решения своих утилитарных задач. На первом можно легко вывести показания различных датчиков, и организовать меню настройки какого-нибудь прибора. На втором дисплее, от Nokia 5110, можно рисовать графики, геометрические фигуры, даже вывести черно-белую картинку.

Сегодня речь пойдет еще об одном типе цифровых индикаторов, которые основаны на технологии OLED. В отличие от ЖК дисплеев, в OLED каждый пиксель изображения светится сам, что делает ненужным подсветку. По сути, OLED матрица состоит из множества органических светодиодов. Благодаря таким светящимся пикселям, эти дисплеи обладают запредельными показателями контрастности. А еще, OLED технология позволяет делать гибкие матрицы!

DSC00905_sm

Еще лет 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×64GNDVCCDOD1RSTDC
Ардуино УноGND+5V1091311

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() {
}

Загружаем программу на Ардуино Уно, и получаем вот такую яркую надпись очень мелким шрифтом:

DSC00907_sm

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

3. Программа. Вывод изображения

Как и в случае дисплея Nokia 5110, для того чтобы вывести изображение нам необходимо его должным образом подготовить. На всякий случай, напомню алгоритм:

  1. создаем в любом графическом редакторе черно-белую картинку с разрешением 128 x 64 точки;
  2. сохраняем в формате BMP с 256 цветами (так умеет делать mspaint);
  3. конвертируем картинку в массив байт с помощью онлайн сервиса: 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-l

Итак, OLED дисплей побежден!

Задания

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

  1. Собрать на базе акселерометра и OLED дисплея строительный электронный уровень. Ставим прибор на тестируемую поверхность, и он показывает в какую сторону и насколько градусов она наклонена. Факт наклона можно отобразить окружностью, смещенной относительно центра в виде перекрестья.
  2. Самые продвинутые и терпеливые могут сделать игру «змейка». Для игры потребуется дисплей, Ардуино Уно (или любая другая плата), 4 тактовые кнопки и зуммер. Инструкция по созданию игры змейка с дисплеем hx1230.
  3. Ещё одна игра — Alien Invaders, прямиком их 80x. Цикл уроков по созданию игры Alien Ivaders .


Изменено:

Ардуино: графический OLED дисплей SPI: 2 комментария

  1. Хороший очень яркий дисплей, использовал такой, только не на ардуино, а с платой RW30, она на STM32 и по размеру как дисплей.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.