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

Программа и библиотеки
Для поддержки OLED-дисплеев доступно множество библиотек, но мы можем выделить две наиболее популярные:
- Adafruit_SSD1306 – позволяет работать в основном с дисплеями на основе контроллера SSD1306;
- U8glib — имеет гораздо больший список поддерживаемых контроллеров.
Из-за универсальности библиотеки U8glib мы поработаем именно с ней. После того, как мы загрузим библиотеку, можно перейти к примеру “Hello World”.
Но сейчас мы сосредоточимся не на написании программных или библиотечных функций, которые позволяют отображать элементы на матрице, а на строках примера кода, которые позволяют нам выбрать соответствующий дисплей, а их действительно много.
Для этого нам нужно найти строку, соответствующую разрешению нашего дисплея:
U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI
В принципе, все остальные строк конфигурации, мы можем оставить в качестве комментария, но лично я всегда их удаляю, чтобы код был визуально меньше и более приятный для глаз.
Когда наш скетч будет выглядеть, как показано ниже, мы можем перейти к размещению всей схемы на макетной плате и загрузке программы в Ардуино.
#include "U8glib.h" U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI void draw(void) { u8g.setFont(u8g_font_unifont); u8g.drawStr( 0, 22, "Hello World!"); } void setup(void) { if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); } else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) { u8g.setColorIndex(3); } else if ( u8g.getMode() == U8G_MODE_BW ) { u8g.setColorIndex(1); } else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255,255,255); } } void loop(void) { u8g.firstPage(); do { draw(); } while( u8g.nextPage() ); delay(50); }
Расположение элементов на макетной плате
Само подключение дисплея к Ардуино не представляет особой сложности, всего 4 провода, два — силовая часть, следующие два — провода для подключения шины I2C. Макет должен выглядеть, как показано ниже.
Когда мы соберем всю систему, мы сможем загрузить программу в Ардуино. После загрузки на нашем дисплее должно появиться слово «Hello World!».
Модификация кода для наших проектов
Когда мы хотим проверить, работает ли дисплей или правильно ли он подключен к плате, нам достаточно примера «Hello World!». Но когда мы хотим создать проект или устройство, которое будет отображать информацию на OLED дисплее, стоит научиться использовать его и отображать информацию так, как это нам необходимо.
Из-за того, что дисплей не самый большой, мы немного уменьшим размер шрифта и выведем текст в виде нескольких слайдов, последний исчезнет за экраном.
В библиотеке мы не можем уменьшить шрифт с помощью команды, как в HTML. Мы выбираем только определенный шрифт для наших нужд, каждый шрифт имеет только один размер, и мы не можем его масштабировать.
#include "U8glib.h" U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI void setup(void) {} void loop(void) { u8g.firstPage(); //очистить экран и подготовить к отображению новой страницы do { u8g.setFont(u8g_font_7x14); //выбор шрифта u8g.drawStr(0,10,"Вот как это выглядит"); //текст отображается с позиции x0 z10 u8g.drawStr(0,22,"первая страница"); //отобразить текст с позиции x0 z22 } while( u8g.nextPage()); delay(5000); u8g.firstPage(); do { int odczyt = analogRead(A0); //создание переменной u8g.setFont(u8g_font_helvR08); //выбор шрифта u8g.drawStr(0,8,"Здесь мы можем"); u8g.drawStr(0,20,"читать статус"); u8g.drawStr(0,30,"пина A0"); u8g.setPrintPos(55,30); //установка места отображения данных u8g.print(odczyt); //отображение данных } while( u8g.nextPage()); delay(5000); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(0,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(10,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(20,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(30,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(40,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(50,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(60,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(70,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(80,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(90,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(100,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(110,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(120,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_helvR08); u8g.drawStr(130,8,"НАДПИСЬ"); } while( u8g.nextPage()); delay(4000); }
После загрузки программы в Ардуино, должна появиться программа, которую мы определили ранее. На экране мы увидим первую страницу, вторую страницу с данными с пина A0 и третью страницу с движущейся надписью.
Обладая знаниями из сегодняшнего руководства, мы можем свободно использовать OLED-дисплеи и чрезвычайно обширную библиотеку u8glib.
