Описание библиотеки oled i2c. Создание растровых изображений

Описание библиотеки oled i2c. Создание растровых изображений
Описание библиотеки oled i2c. Создание растровых изображений

Введение: Знакомство с OLED I2C дисплеем 128*64 / 128*32.

Привет! Будучи любителем - энтузиастом электроники, я уверен, что всё что мы делаем – радиоэлектронные игрушки – самоделки, или большие проекты, все это от любопытства и лени. Любопытство стремится понять и постичь необъятное, не познанное, разобраться, как оно там работает, чего делает, как двигается. А лень изобретает, чтобы такого придумать, чтобы не вставать, не подходить, не поднимать, не запачкаться или еще чего ни будь важное.

Так как видеть информацию, это лучше, чем разбираться чего там сейчас должно произойти в нашем устройстве, или уже произошло, или происходит, мы обязательно захотим получить эту самую полезную информацию от наших микроконтроллеров, датчиков, или прочих устройств. А получать, я во всяком случае, хочу какие-либо сообщения, вроде вопросов, предупреждений, напоминаний, смайликов, звездочек, сердечек и тому подобное.

Для тех, у кого тоже возникло подобное желание, - вот краткое руководство по подключению и проверке маленьких и не дорогих дисплеев OLED.
Далее речь пойдет об одной из широко доступных для радиолюбителей моделях OLED дисплеев, управляемых чипом SSD1306, с размером экрана 0,96-дюймов и разрешением 128*64 или 128*32 точки. Эти дисплеи идеально подходят для не больших радиолюбительских конструкций и самоделок.

Шаг 1: Основные понятия

Подключать мы его будем к Arduino UNO / NANO, ну и программировать, соответственном мы его будем тоже через Arduino.
  • OLED это Organic Light-Emitting Diode, т.е., полупроводниковый прибор из органических соединений, который начинает излучать свет при прохождении через него электрического тока.
  • ARDUINO - это платформа для обучения и построения систем автоматики и робототехники.
  • ArduinoIDE - среда разработки. Это бесплатная программа для программирования Arduino.
  • I2C – Inter-Integrated Circuits, межмикросхемная линия связи.
  • Скетч, он же, код, он же программа - терминология Arduino.
Следуйте инструкциям, чтобы понять, как правильно подключить и настроить OLED дисплей к Arduino и как отобразить собственное сообщение на его дисплее.
Делаем все по шагам.

Шаг 2: Комплектующие

Нам потребуются всего четыре вещи:
  • 1. Сам OLED дисплей 0,96” (можно купить на Aliexpress или Ebay, - долго, но дешево!).
  • 2. Arduino UNO / Nano (там же где дисплей).
  • 3. Соединительные провода (там же).
  • 4. Компьютер или ноутбук с установленной ArduinoIDE.


Вообще покупка деталей для различных проектов на Aliexpress и Ebay очень прикольная штука, пока занимаешься одним проектом, детали к другому уже на подходе. Главное не забыть сделать заказ.

Шаг 3: Подключение дисплея

Управление дисплеем осуществляет чип SSD1306, который поддерживает пять протоколов связи и один из которых I2C. Данные по этому протоколу передаются всего по двум проводам, а чем меньше проводов в корпусе, тем лучше, так что нам он вполне подходит. Но! Встречаются модули с протоколом SPI и даже с переключением протоколов, так что будьте внимательны при покупке данного модуля.


Используемые выводы:
OLED дисплей - SCL/SCK (clock) и SDA (data), «Плюс» питания (VCC) и «Минус» питания (GND).


Используемые выводы:
Arduino UNO - SCL/SCK на A5 и SSD на A4, «Плюс» питания (+5V) и «Минус» питания (GND).
Подсоединяем дисплей к Arduino:
  • Vcc - 5V
  • GND - GND
  • SDA - A4
  • SCL - A5

Шаг 4: Сканер I2C

Каждое устройство на шине I2C имеет шестнадцатеричный адрес, поменять нельзя, он вшит намертво, каждый ответственный производитель должен где-то на корпусе или в инструкции указать его. Бывают модули с переключателями и перемычками, которыми можно изменить адрес, но… если устройства дешевые, до безобразия, то производитель может и не удосужиться заниматься такой мелочью, поэтому его придется определять самостоятельно.

Всего на шине может использоваться до 127 адресов - 119 для устройств и 8 адресов служебных. Общение ведется по этим адресам. Есть главный, он же Master, а есть ведомый, он же Slave, - Мастера запрашивают, ведомые отвечают, все просто.
Поскольку на нашем OLED-дисплей используется протокол связи I2C, а адрес может быть и не указан, мы сами попробуем узнать этот самый адрес.

Это можно сделать, загрузив коротенький скетч на свою плату Arduino с подключенным OLED. НО!
Не торопитесь сразу заливать скетч в Arduino! Давайте для начала загрузим «драйвера», т.е. подключим библиотеки, а для этого сразу перейдем к «Шагу №5», а затем вернемся и продолжим.

Шаг 4: Продолжение:

Скачать КОД Finder_I2C_Hex_Address.ino, загрузить в Arduino.
Открыть «Монитор порта», выставить скорость 9600 и если все правильно подключено, программа покажет адрес устройства, в моем случаи OLED с адресом 0x3F.

Шаг 5: Загрузка и подключение библиотек

Для того чтобы все правильно заработало, а вам не пришлось изобретать велосипед, нужно подключить пару библиотек в среду ArduinoIDE, а именно: ADAFRUIT GFX и ADAFRUIT SSD1306, они необходимы для того чтобы Arduino смогла самостоятельно общаться с OLED дисплеем.
Вы можете подключить эти библиотеки, выполнив следующие шаги.
  • 1. В ArduinoIDE идем в меню Скетч / Sketch.
  • 2. Выбираем «Включить библиотеки» / Include Libraries.
  • 3.Выбираем «Управление библиотеками» / Managed Libraries.
  • 4. Находим ADAFRUIT GFX и устанавливаем их.
  • 5. Находим ADAFRUIT SSD1306 и устанавливаем их.
Со свежими версиями библиотек, дисплей у меня работал криво, может конечно это обусловлено кривизной рук, но после того, как я установил самые первые версии этих библиотек, все стало показываться ровненько и красиво. В памяти почему-то всплывают строчки Пушкина:
...и опыт, сын ошибок трудных,
и гений, парадоксов друг.

Другой способ установки библиотек – найти, скачать и установить эти библиотеки самостоятельно.
Для примера Github:
https://github.com/adafruit/Adafruit-GFX-Library
https://github.com/adafruit/Adafruit_SSD1306

Это те же Adafruit – библиотеки, но подобные библиотеки легко ищутся в поисковиках, по запросу OLED I2C. Многие энтузиасты пишут библиотеки «под себя», а затем выкладывают их в паутину. Какую библиотеку использовать, - решать вам.
Для того чтобы дисплей отображал русские буквы, тоже нужны специальные библиотеки, но это уже отдельная тема для отдельной статьи.
После того как библиотеки установлены, можно вернуться к выполнению 4-го шага, и узнать наконец шестнадцатеричный адрес вашего дисплея.

Шаг 6: Тестирование дисплея

Чтобы проверить, работает ли все так, как ожидалось, запустите пример для проверки из ArduinoIDE.
Для этого:
Перейти ФАЙЛ> ПРИМЕРЫ> SSD 1306> Выбрать 128x64 i2c
Если вы получите «Ошибку», попробуйте выбрать SSD 1306> 128x32 i2c.
Если снова «Ошибка» попробуйте изменит адрес I2C в строке 61, демонстрационного кода, и замените его адресом вашего дисплея, который вы определили на шаге №4.
Если снова ошибка, можно попробовать отредактировать файл Adafruit_SSD1306.h, он находится в папке с библиотеками Arduino.


Откройте файл Adafruit_SSD1306.h в текстовом редакторе и найдите строки:
//#define SSD1306_128_64 #define SSD1306_128_32 // #define SSD1306_96_16
Раскомментируйте строчку:
#define SSD1306_128_64.
Должно получиться так:
#define SSD1306_128_64 //#define SSD1306_128_32 // #define SSD1306_96_16
Если снова ошибка – необходимо проверить правильность соединений.
После окончания загрузки вы увидите тестовую анимацию на экране, это означает, что вы успешно настроили свой OLED дисплей.

Когда вы вдоволь насладитесь сей анимацией, можете переходить к следующему шагу.

Шаг 7: Пишем свое собственное сообщение

Для написания собственного сообщения, сначала создадим новый скетч в среде программирования ArduinoIDE.
В заголовке мы подключаем 4 библиотеки:
#include #include #include #include
Затем пишем протокол сброса:
#define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET);
В VOID SETUP указываем шестнадцатеричный адрес нашего дисплея 0x3C, который мы узнали на «Шаге №4».
Затем, инициализируем дисплей и очищаем его:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay();
Далее в VOID LOOP пишем основной код, то есть наше сообщение, которое хотим отобразить на дисплее.
Для этого описываем размер текста, цвет текста, позицию курсора, и наконец, выводим сообщение с помощью команды println:
display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Well done!"); display.display();
В конце не забудьте написать display.display , чтобы изображение вывелось на экран, иначе получите пустоту.
Если вы все сделали правильно, то на дисплеи появится сообщение.

В статье рассмотрены монохромные OLED дисплеи с разрешением 128x64 и 128x32 пикселей.

Это небольшие экранчики, их диагональ составляет всего около 1”. Основное их преимущество – удобство чтения благодаря высокой контрастности OLED дисплея. Каждый OLED дисплей изготавливается из отдельных 128x64 или 128x32 белых органических (OLED) светодиодов. Каждый светодиод включается/выключается с помощью чипа управления. Так как дисплей сам является источником света, дополнительная подсветка не требуется. Во-первых, это обеспечивает высокую контрастность дисплея, а во-вторых – значительно снижает энергозатраты, необходимы для его питания.

В качестве драйвера в дисплее используется чип SSD1306, который позволяет передавать данные по протоколам I2C, SPI и 8-битному параллельному протоколу. Как правило, столь широкий выбор интерфейсов предоставляет дисплей с разрешающей способностью 128x64 пикселей. В OLED дисплеях с разрешающей способностью 128x32, доступен только протокол SPI. В статье ниже используется именно SPI для подключения, так как он наиболее универсальный и требует малого количества контактов.

Питание OLED дисплеев

OLED дисплею и драйверу необходимо питание 3.3 В и 3.3 В на питание логики, для передачи данных. Питание дисплеев зависит от того, как именно загружен экран, но в основном он тянет около 20 мА и требует напряжение питания 3.3 В. Встроенный драфвер представляет из себя простой переключатель, который преобразует 3.3 В – 5 В в управляющий сигнал для OLED дисплея. Вы можете запускать дисплей от одного источника питания 3.3 В или использовать 3.3 В для питания чипа и до 4.5 В для самого экрана. Или вы можете подключить 3.3 В к чипу и подать 7-9 В непосредственно на контакт питания OLED дисплея.

OLED 128x64 и 128x32 с готовым выходом 5 В

Если у вас версия OLED дисплея, которая старше v1 128x64, можете не ознакамливаться со следующим подразделом. У вас уже есть возможность запитать 5 В. Все 1.3" 128x64 и меленькие 128x32 SPI и I2C имеют на борту 5 В. Если у вас модель v2 0.96" 128x64 OLED дисплей с отметкой 5 В на передней части, его тоже можно подключать к 5 В. Если у вас более старая версия OLED дисплея - 0.96" (смотрите ниже), вам надо быть аккуратнее при подключении к мекроконтроллеру 5 В. OLED дисплей разработан таким образом, что он совместим с питанием 5 В. То есть вы можете подать питание в диапазоне 3-5 В, а встроенный регулятор сделает всю остальную «черную работу» за вас.

Все OLED экраны можно использовать с питанием и логикой 3.3 В.


Просто подключите контакт GND к «земле», а контакт Vin к источнику питания в диапазоне 3-5 В. В результате на контакте 3Vo будет 3.3 В.

0.96 128x64 OLED

Более старые версии OLED дисплеев 0.96" 128x64 использовать сложнее, так как по умолчанию они не совместимы с питанием 5 В. То есть, вам надо обеспечивать для них питание 3.3 В.


  • VDD - для питания логики 3.3 В. Значение напряжения должно быть 3 или 3.3 В.
  • VBAT – это вход для изменения напряжения в диапазоне от 3.3 до 4.2 В.
  • VCC – это контакт значения напряжения high для OLED экрана. Если вы используете встроенный преобразователь напряжения, этот контакт подключать не надо. Если вы не используете внутренний преобразователь, подключите его к источнику питания 7-9 В – постоянный ток.

Библиотека Arduino и примеры

Для использования небольших монохромных OLED дисплеев вам надо будет установить библиотеки Arduino. Код из библиотеки, которая приведена ниже поддерживает работу с любыми моделями плат Arduino . Кроме того, его можно легко адаптировать и под другие микроконтроллеры. Для передачи данных используется SPI стандарт передачи данных.

Скачать библиотеку для работы OLED дисплея можно на Github - библиотека Adafruit SSD1306 . Кликните кнопку DOWNLOAD в левом верхнем углу, извлеките архив и переименуйте папку в Adafruit_SSD1306. Проверьте, чтобы в папке содержались файлы Adafruit_SSD1306.cpp и Adafruit_SSD1306.h, а также папка examples.

Переместите папку Adafruit_SSD1306 в папку Arduino /libraries. Если папка не существует, вам надо ее создать. В Windows путь будет следующим: (home folder)\My Documents\Arduino\libraries, а для Mac или Linux: (home folder)/Documents/Arduino/libraries. Если у вас возникли трудности с библиотеками, ознакомьтесь с полным гайдом по работе и установке библиотек на нашем сайте сайт.

Аналогичную процедуру вам надо будет провести с Github - библиотека Adafurit_GFX .

После установки библиотек Adafruit_SSD1306 и Adafruit_GFX, перезапустите Arduino IDE. Загрузить пример скетча можно через меню: File→Sketchbook→Libraries→Adafruit_SSD1306→SSD1306...

После того как вы завершили подключение дисплея в соответствии с рекомендациями, которые приведены выше, можете загружать скетч на ваш Arduino.

Библиотека не сможет определить размер экрана на уровне кода. Указать размер надо в header файле. Перейдите в папку с библиотекой и откройте файл Adafruit_SSD1306.h. Сверху в нем есть пояснения по адаптации библиотеки к различным дисплеям.



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

Вы можете легко создать растровые изображения для отображения на OLED дисплее с помощью LCD assistant software . Сначала создайте изображение с помощью любого фоторедактора (Photoshop, Paint и т.п.). Сохраните это изображение в формате Monochrome Bitmap (bmp):


Установите следующие параметры:


И импортируйте ваше монохромное растровое изображение. Сохраните его (Save output) в cpp файл:

Код, который приведен в примере можно использовать для обработки полученного рисунка


Подключение OLED дисплея 128x64

Паяем контакты

Перед подключением надо установить и спаять контакты на OLED дисплее. Контакты не будут работать без распайки!

Начните с установки рельсы на 8 контактов на вашу монтажную плату. Рельса устанавливается в макетку своими длинными ногами.


Сверху установите ваш OLED дисплей таким образом, чтобы короткие ноги рельсы попали в отверстия дисплея


Теперь спаяйте 8 контактов с 8-ю отверстиями!


I2C или SPI

Одна из хороших особенностей OLED экранов 128x64 – это то, что они могут использовать I2C или SPI протоколы. SPI отрабатывает быстрее, чем I2C, но для подключения надо больше контактов. Кроме того, наладить SPI на некоторых микроконтроллерах проще, чем I2C.

Подключение OLED по I2C

Экран может подключаться по I2C протоколу к любому микроконтроллеру, который поддерживает этот формат. Так как I2C интерфейс используется только для "соединения" дисплея, у вас останется 512 байт RAM памяти на микроконтроллере. Но передать данные с OLED дисплея не получится.

Для начала вам надо соединить два контакта на задней части платы OLED экрана. Оба контакта должны быть "замкнуты" (с помощью распайки), чтобы I2C начал работать!


  • GND идет к GND(земля)
  • Vin идет к 5V
  • Data к I2C SDA (на Uno - это A4, на Mega - это 20, а на Leonardo - digital 2)
  • Clk к I2C SCL (на Uno - это A5, на Mega - это 21, а на Leonardo - digital 3)
  • RST к 4 (позже вы можете изменить этот пин в коде программы)

Это подключение совпадает с примером, который есть в библиотеке. После того как предложенный вариант отработает, вы можете попробовать другой контакт для Reset (вы не можете поменять контакты SCA и SCL).

Пример находится в: File→Sketchbook→Libraries→Adafruit_SSD1306→SSD1306_128x64_i2c example

Подключение OLED по SPI

По умолчанию плата предусматривает использование SPI, но если вы до этого использовали I2C, вам надо разомкнуть контакты, которые вы замыкали в предыдущем пункте!


После этого подключите контакты к Arduino

  • GND идет к ground (земля)
  • Vin идет к 5V
  • Data к digital 9
  • CLK к digital 10
  • D/C к digital 11
  • RST к digital 13
  • CS к digital 12

Это подключение совпадает с примером скетча, который предложен в библиотеке. После запуска и проверке, можете менять пины и программу.

Пример находится в: File→Sketchbook→Libraries→Adafruit_SSD1306→SSD1306_128x64_spi example

Подключение OLED дисплея 128x32

Подключение OLED экрана 128x32 по SPI

OLED экран 128x32 очень просто подключается по SPI так как в нем есть встроенный модуль согласования уровней. Сначала возьмите рельсу 0.1" с 8 контактами.


Установите контакты на макетной плате длинной стороной, а сверху OLED экран. После этого припаяйте рельсу к OLED PCB.


После этого подключите Arduino - GND подключается к ground (земля), Vin подключается к 5V, DATA к digital 9, CLK к digital 10, D/C к digital 11, RST к digital 13 и CS к digital 12.

Скетч соответствует тому, как вы подключили экран к Arduino. После проверки работоспособности можете попробовать подключить другие контакты.

Пример находится в: File→Sketchbook→Libraries→Adafruit_SSD1306→SSD1306_128x32_SPI example

Если вы используете OLED экран 128x32, убедитесь, что вы раскомментировали строку "#define SSD1306_128_32" в верхней части скетча Adafruit_SSD1306.h. Раскомментировав эту строку, вы изменяете размер буфера.

Подключение OLED экрана 128x32 по I2C

OLED экран 128x32 можно легко подключить и по I2C. Опять-таки, причина в наличии модуля согласования уровней и регулятора. Сначала возьмите рельсу 0.1" на 6 контактов.

Установите рельсу длинными контактами на макетной плате


Сверху установите OLED экран


Припаяйте рельсу к OLED PCB


Теперь подключите контакты к Arduino

  • GND к GND
  • Vin к 5V
  • SDA к I2C Data (на Uno - это A4, на Mega - это 20, а на Leonardo - digital 2)
  • SCL к I2C Clock(на Uno - A5, на Mega - это 21, а на Leonardo - digital 3)
  • RST к 4 (вы можете изменить эти контакты в скетче дальше)

Это подключение соответствует тому, которое требуется для работы скетча примера. После того, как пример отработал, вы можете изменить пин RST. Вы не можете изменить контакты I2C, так как они "зафиксированы" на уровне электросхемы.

Пример находится в: File→Sketchbook→Libraries→Adafruit_SSD1306→SSD1306_128x32_i2c example

Подключение старого 128x64 OLED экрана V 1.0

Эта схема подключения рассчитана на более старые 0.96" OLED экраны, которые поставляются с модулем согласования уровней. Если у вас V2.0, то используйте другую схему подключения.

Версия V1 128x64 OLED экрана работает от 3.3 В и не имеет встроенного модуля согласования уровней, так что для использования этого экрана с 5 В микроконтроллером, вам понадобится внешний модуль согласования. Если ваш микроконтроллер поддерживает 3.3 В, вы можете пропустить дальнейшие шаги.

Предполагается, что вы будете использовать монтажную плату. Возьмите рельсу 0.1" с 10 контактами


Установите контакты длинными ногами на макетную млату, а потом сверху – левую рельсу контактов OLED экрана.


Припаяйте контакты


Соедините VDD и VBAT (они подключатся к 3.3 В). GND подключается к GND.


Установите модуль согласования уровней CD4050 таким образом, чтобы пин 1 был сверху


Подключите пин 10 к пину D/C, пин 12 к CLK (SPI время) и пин 15 к DAT (SPI данные).


Подключите пин 2 к RES (сброс) и пин 4 к CS (выбор чипа). Пин 1 идет к 3.3 В, а пин 8 к земле.


Вы можете подключить входы модуля согласования уровней к любым контактам, но в данном случае мы подключили digital 13 к контакту 3 модуля согласования, 12 к пину 5, 11 к пину 9, 10 к пину 11 и 9 к пину 14. Это подключение соответствует скетчу-примеру. После того как, приведенное подключение отработает, можете поэксперементировать с другими контактами/пинами.


Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

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

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE .

Схема подключения:

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

#include // Подключаем библиотеку iarduino_OLED_txt. iarduino_OLED_txt myOLED(0x78); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x78 (если учитывать бит RW=0). // extern uint8_t SmallFontRus; // Подключаем шрифт SmallFontRus. // void setup(){ // myOLED.begin(); // Инициируем работу с дисплеем. myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. // myOLED.setCoding(TXT_UTF8); // Указываем кодировку текста в скетче. Если на дисплее не отображается Русский алфавит, то... } // раскомментируйте функцию setCoding и замените параметр TXT_UTF8, на TXT_CP866 или TXT_WIN1251. // void loop(){ // myOLED.clrScr(); // Чистим экран. myOLED.print("Большие буквы:" , 0, 0); // Выводим текст начиная с 0 столбца 0 строки. myOLED.print("ABCDEFGHIJKLM" , OLED_C, 2); // Выводим текст по центру 2 строки. myOLED.print("NOPQRSTUVWXYZ" , OLED_C, 3); // Выводим текст по центру 3 строки. myOLED.print("АБВГДЕЁЖЗИЙКЛМНОП" , OLED_C, 5); // Выводим текст по центру 5 строки. myOLED.print("РСТУФХЦЧШЩЪЫЬЭЮЯ" , OLED_C, 6); // Выводим текст по центру 6 строки. delay(3000); // Ждём 3 секунды. // myOLED.clrScr(); // Чистим экран. myOLED.print("Маленькие буквы:" , 0, 0); // Выводим текст начиная с 0 столбца 0 строки. myOLED.print("abcdefghijklm" , OLED_C, 2); // Выводим текст по центру 2 строки. myOLED.print("nopqrstuvwxyz" , OLED_C, 3); // Выводим текст по центру 3 строки. myOLED.print("абвгдеёжзийклмноп" , OLED_C, 5); // Выводим текст по центру 5 строки. myOLED.print("рстуфхцчшщъыьэюя" , OLED_C, 6); // Выводим текст по центру 6 строки. delay(3000); // Ждём 3 секунды. // myOLED.clrScr(); // Чистим экран. myOLED.print("Символы:" , 0, 0); // Выводим текст начиная с 0 столбца 0 строки. myOLED.print("{}()<>?!#$%&*" , OLED_C, 3); // Выводим текст по центру 3 строки. myOLED.print("~`"\"^_-+=,.:;|/" , OLED_C, 5); // Выводим текст по центру 5 строки. delay(3000); // Ждём 3 секунды. // myOLED.clrScr(); // Чистим экран. myOLED.print("Цифры:" , 0, 0); // Выводим текст начиная с 0 столбца 0 строки. myOLED.print("1234567890" , 6, 2); // Выводим текст начиная с 6 столбца 2 строки. myOLED.print(1234567890 , 6, 3); // Выводим число начиная с 6 столбца 3 строки. myOLED.print(-1234567890 , 0, 4); // Выводим число начиная с 0 столбца 4 строки. myOLED.print(12345.7890 , 6, 5); // Выводим число начиная с 6 столбца 5 строки. delay(3000); // Ждём 3 секунды. } //

Алгоритм работы программы:

В коде setup() происходит инициализация дисплея (подготовка дисплея к работе) и подключение шрифта «SmallFontRus» (в библиотеке имеется несколько предустановленных шрифтов, которые подключаются перед использованием). Со списком шрифтов и описанием всех функций библиотек iarduino_OLED и iarduino_OLED_txt , можно ознакомиться в разделе Wiki - OLED экран 128×64 / 0,96” .

Код loop() разбит на 4 части. Каждая часть начинается с очистки экрана функцией clrScr(), после чего следуют несколько функций print() для вывода текста или чисел на экран дисплея. Все части выполняются друг за другом с 3 секундной задержкой выполняемой функциями delay().

В результате на дисплее поочерёдно будут появляться: большие буквы (включая Русские), маленькие буквы (включая Русские), символы и цифры.

Проблемы при выводе Русских букв:

Кодировка:

Первая и основная проблема это кодировка в которой скетч передаётся компилятору. Разные версии Arduino IDE хранят скетч в различных кодировках. Даже последняя версия Arduino IDE 1.8.5 (на момент написания данного урока) для ОС Windows, передаёт компилятору скетч в кодировке UTF-8 (если скетч был сохранён в файл *.ino) или в кодировке Windows-1251 (если скетч не был сохранён). Но ни скетч, ни библиотеки используемые в нём, не знают в какой кодировке они будут переданы компилятору. Вот и получается что один и тот же скетч, оперируя Русскими буквами, может работать по разному.

Примечание:

Что такое кодировка?
Компьютер, как и контроллер (в т.ч. Arduino) хранит, получает и передаёт данные в виде 1 и 0. Из набора 1 и 0 можно точно составить числа, но нельзя однозначно составить буквы. Кодировка это представление букв числами (по их порядковому номеру), которыми уже может оперировать компьютер или контроллер. Например, «А» - 1, «Б» - 2, «В» - 3 и т.д., тогда слово «ПРИВЕТ» можно передать, принять или сохранить, как набор чисел: 17,18,10,3,6,20. Так как буквы можно располагать по разному (сначала символы или числа, или буквы другого языка и т.д.), то и порядковые номера (числа) у букв будут разные, вот и получилось, что придумано множество кодировок. Исторически сложилось что Латинские буквы имеют одинаковые порядковые номера в большинстве кодировок: «A»...«Z» = 65...90, «a»...«z» = 97...122, а Кириллические буквы не только имеют различные номера, но могут быть разбросаны, или вообще отсутствуют в кодировках.

В библиотеках iarduino_OLED и iarduino_OLED_txt , мы предусмотрели функцию setCoding(), которая может принимать в качестве единственного аргумента, одно из значений: TXT_UTF8, TXT_CP866, TXT_WIN1251, определяющее текущую кодировку скетча. Эта функция закомментирована в 3 строке кода setup программы данного урока. Если Русский текст на дисплее отображается некорректно, то раскомментируйте строку с функцией setCoding и замените параметр TXT_UTF8, на TXT_CP866 или TXT_WIN1251. В большинстве случаев это решит проблему кодировок.

MyOLED.setCoding(TXT_WIN1251); // Указываем что текст скетча представлен в кодировке Windows-1251.

Если функция setCoding() Вам не помогла, тогда вызовите функцию setCoding() с параметром false, а Русские буквы указывайте их кодом, как это показано в следующем разделе данного урока: «Недостаточно памяти». При желании укажите в комментариях к уроку свою версию ОС, версию Arduino IDE и какую кодировку использует Ваша Arduino IDE (если Вы не знаете какую кодировку использует Arduino IDE, то напишите какие символы отображаются на дисплее вместо строчных и прописных Русских букв). Мы постараемся добавить Вашу кодировку в библиотеки.

Недостаточно оперативной памяти:

Вторая, но не менее важная проблема заключается в том, что строки занимают много оперативной памяти. Каждая буква строки занимает минимум 1 байт. Особенно актуальна эта проблема при создании различных пунктов меню.

Решение:

Наиболее эффективным решением данной проблемы является хранение строк не в области оперативной памяти, а в области памяти программ, так как объем памяти программ гораздо больше. Для этого указывайте строки в качестве аргумента функции F(). Строки указанные таким образом будут храниться в области памяти программ:

MyOLED.print(F("Строка для дисплея")); // Вывод строки на дисплей. Serial.print(F("Строка для монитора")); // Вывод строки в монитор последовательного порта.

Недостаточно оперативной памяти или памяти программ:

Если Вы работаете со строками на Русском языке в Arduino IDE, которая хранит скетч в кодировке UTF-8. Вы уже храните строки в области памяти программ (или оставили строки в области оперативной памяти). Вы все равно можете освободить до половины памяти занимаемой строками!

Дело в том, что в кодировке UTF-8 каждая Русская буква занимает целых 2 байта. Если указывать Русские символы кодом в той кодировке, где они занимают 1 байт, можно освободить половину памяти занимаемой строками, вне зависимости от того, в каком типе памяти они хранятся.

Символы в шрифтах для библиотек iarduino_OLED и iarduino_OLED_txt располагаются в соответствии с кодировкой CP866, значит хранить и выводить Ваши строки на экран дисплея можно в этой кодировке:

MyOLED.setCoding(false); // Отменяем текущую кодировку, так как Русские буквы будем указывать кодом. myOLED.print("\200\340\244\343\250\255\256 iArduino"); // Выводим текст "Ардуино iArduino". Вместо Русских букв используем их код в кодировке CP866.

Примечание:

Как указывать символ или букву по его коду в строках скетчей?
Для начала нужно узнать коды всех символов той кодировки, в которой Вы желаете их указывать, таблицы символов различных кодировок можно найти в интернете. Для кодировки CP866, Русские символы имеют следующие коды:

А 128
\200
И 136
\210
Р 144
\220
Ш 152
\230
а 160
\240
и 168
\250
р 224
\340
ш 232
\350
Ё 240
\360
Б 129
\201
Й 137
\211
С 145
\221
Щ 153
\231
б 161
\241
й 169
\251
с 225
\341
щ 233
\351
ё 241
\361
В 130
\202
К 138
\212
Т 146
\222
Ъ 154
\232
в 162
\242
к 170
\252
т 226
\342
ъ 234
\352

242
\362
Г 131
\203
Л 139
\213
У 147
\223
Ы 155
\233
г 163
\243
л 171
\253
у 227
\343
ы 235
\353

243
\363
Д 132
\204
П 140
\214
Ф 148
\224
Ь 156
\234
д 164
\244
м 172
\254
ф 228
\344
ь 236
\354

244
\364
Е 133
\205
Н 141
\215
Х 149
\225
Э 157
\235
е 165
\245
н 173
\255
х 229
\345
э 237
\355

245
\365
Ж 134
\206
О 142
\216
Ц 150
\226
Ю 158
\236
ж 166
\246
о 174
\256
ц 230
\346
ю 238
\356

246
\366
З 135
\207
П 143
\217
Ч 151
\227
Я 159
\237
з 167
\247
п 175
\257
ч 231
\347
я 239
\357

247
\367

Для вывода любого символа нужно указать его код в 8-ричной системе счисления , которому должен предшествовать обратный слеш «\ ». Данное правило действует для любых строк в Arduino IDE. В строке «Ардуино iArduino» из примера выше, первая буква - «A», имеет код 128. Если перевести 128 в 8-ричную систему счисления, получится (200) 8 . Значит букву «А» можно записать как «\200», букву «р» как «\340», букву «д» как «\244» и т.д.

Введение: Знакомство с OLED I2C дисплеем 128*64 / 128*32.

Привет! Будучи любителем — энтузиастом электроники, я уверен, что всё что мы делаем – радиоэлектронные игрушки – самоделки, или большие проекты, все это от любопытства и лени. Любопытство стремится понять и постичь необъятное, не познанное, разобраться, как оно там работает, чего делает, как двигается. А лень изобретает, чтобы такого придумать, чтобы не вставать, не подходить, не поднимать, не запачкаться или еще чего ни будь важное.

Так как видеть информацию, это лучше, чем разбираться чего там сейчас должно произойти в нашем устройстве, или уже произошло, или происходит, мы обязательно захотим получить эту самую полезную информацию от наших микроконтроллеров, датчиков, или прочих устройств. А получать, я во всяком случае, хочу какие-либо сообщения, вроде вопросов, предупреждений, напоминаний, смайликов, звездочек, сердечек и тому подобное.

Для тех, у кого тоже возникло подобное желание, — вот краткое руководство по подключению и проверке маленьких и не дорогих дисплеев OLED.

Далее речь пойдет об одной из широко доступных для радиолюбителей моделях OLED дисплеев, управляемых чипом SSD1306, с размером экрана 0,96-дюймов и разрешением 128*64 или 128*32 точки. Эти дисплеи идеально подходят для не больших радиолюбительских конструкций и самоделок.

Шаг 1: Основные понятия

Подключать мы его будем к Arduino UNO / NANO, ну и программировать, соответственном мы его будем тоже через Arduino.

  • OLED это Organic Light-Emitting Diode, т. е., полупроводниковый прибор из органических соединений, который начинает излучать свет при прохождении через него электрического тока.
  • ARDUINO — это платформа для обучения и построения систем автоматики и робототехники.
  • ArduinoIDE — среда разработки. Это бесплатная программа для программирования Arduino.
  • I2C – Inter-Integrated Circuits, межмикросхемная линия связи.
  • Скетч, он же, код, он же программа — терминология Arduino.

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

Делаем все по шагам.

Шаг 2: Комплектующие

Нам потребуются всего четыре вещи:

  • 1. Сам OLED дисплей 0,96” (можно купить на Aliexpress или Ebay, — долго, но дешево!).
  • 2. Arduino UNO / Nano (там же где дисплей).
  • 3. Соединительные провода (там же).
  • 4. Компьютер или ноутбук с установленной ArduinoIDE.

Вообще покупка деталей для различных проектов на Aliexpress и Ebay очень прикольная штука, пока занимаешься одним проектом, детали к другому уже на подходе. Главное не забыть сделать заказ.

Шаг 3: Подключение дисплея

Управление дисплеем осуществляет чип SSD1306, который поддерживает пять протоколов связи и один из которых I2C. Данные по этому протоколу передаются всего по двум проводам, а чем меньше проводов в корпусе, тем лучше, так что нам он вполне подходит. Но! Встречаются модули с протоколом SPI и даже с переключением протоколов, так что будьте внимательны при покупке данного модуля.

Используемые выводы:

OLED дисплей — SCL/SCK (clock) и SDA (data), «Плюс» питания (VCC) и «Минус» питания (GND).

Используемые выводы:

Arduino UNO — SCL/SCK на A5 и SSD на A4, «Плюс» питания (+5V) и «Минус» питания (GND).

Подсоединяем дисплей к Arduino:

  • Vcc — 5V
  • GND — GND
  • SDA — A4
  • SCL — A5

Шаг 4: Сканер I2C

Каждое устройство на шине I2C имеет шестнадцатеричный адрес, поменять нельзя, он вшит намертво, каждый ответственный производитель должен где-то на корпусе или в инструкции указать его. Бывают модули с переключателями и перемычками, которыми можно изменить адрес, но… если устройства дешевые, до безобразия, то производитель может и не удосужиться заниматься такой мелочью, поэтому его придется определять самостоятельно.

Всего на шине может использоваться до 127 адресов — 119 для устройств и 8 адресов служебных. Общение ведется по этим адресам. Есть главный, он же Master, а есть ведомый, он же Slave, — Мастера запрашивают, ведомые отвечают, все просто.

Поскольку на нашем OLED-дисплей используется протокол связи I2C, а адрес может быть и не указан, мы сами попробуем узнать этот самый адрес.

Это можно сделать, загрузив коротенький скетч на свою плату Arduino с подключенным OLED. НО!

Не торопитесь сразу заливать скетч в Arduino! Давайте для начала загрузим «драйвера», т. е. подключим библиотеки, а для этого сразу перейдем к «Шагу №5», а затем вернемся и продолжим.

Шаг 4: Продолжение:

Скачать КОД Finder_I2C_Hex_Address.ino, загрузить в Arduino.

Открыть «Монитор порта», выставить скорость 9600 и если все правильно подключено, программа покажет адрес устройства, в моем случаи OLED с адресом 0x3F.

Шаг 5: Загрузка и подключение библиотек

Для того чтобы все правильно заработало, а вам не пришлось изобретать велосипед, нужно подключить пару библиотек в среду ArduinoIDE, а именно: ADAFRUIT GFX и ADAFRUIT SSD1306, они необходимы для того чтобы Arduino смогла самостоятельно общаться с OLED дисплеем.

Вы можете подключить эти библиотеки, выполнив следующие шаги.

  • 1. В ArduinoIDE идем в меню Скетч / Sketch.
  • 2. Выбираем «Включить библиотеки» / Include Libraries.
  • 3. Выбираем «Управление библиотеками» / Managed Libraries.
  • 4. Находим ADAFRUIT GFX и устанавливаем их.
  • 5. Находим ADAFRUIT SSD1306 и устанавливаем их.

Со свежими версиями библиотек, дисплей у меня работал криво, может конечно это обусловлено кривизной рук, но после того, как я установил самые первые версии этих библиотек, все стало показываться ровненько и красиво. В памяти почему-то всплывают строчки Пушкина:

… и опыт, сын ошибок трудных,

и гений, парадоксов друг.

Другой способ установки библиотек – найти, скачать и установить эти библиотеки самостоятельно.

Это те же Adafruit – библиотеки, но подобные библиотеки легко ищутся в поисковиках, по запросу OLED I2C. Многие энтузиасты пишут библиотеки «под себя», а затем выкладывают их в паутину. Какую библиотеку использовать, — решать вам.

Для того чтобы дисплей отображал русские буквы, тоже нужны специальные библиотеки, но это уже отдельная тема для отдельной статьи.

После того как библиотеки установлены, можно вернуться к выполнению 4-го шага, и узнать наконец шестнадцатеричный адрес вашего дисплея.

Шаг 6: Тестирование дисплея

Чтобы проверить, работает ли все так, как ожидалось, запустите пример для проверки из ArduinoIDE.

Для этого:

Перейти ФАЙЛ> ПРИМЕРЫ> SSD 1306> Выбрать 128×64 i2c

Если вы получите «Ошибку», попробуйте выбрать SSD 1306> 128×32 i2c.

Если снова «Ошибка» попробуйте изменит адрес I2C в строке 61, демонстрационного кода, и замените его адресом вашего дисплея, который вы определили на шаге №4.

Если снова ошибка, можно попробовать отредактировать файл Adafruit_SSD1306.h, он находится в папке с библиотеками Arduino.

Откройте файл Adafruit_SSD1306.h в текстовом редакторе и найдите строки:

//#define SSD1306_128_64

#define SSD1306_128_32

// #define SSD1306_96_16

Раскомментируйте строчку:

#define SSD1306_128_64.

Должно получиться так:

#define SSD1306_128_64

//#define SSD1306_128_32

// #define SSD1306_96_16

Если снова ошибка – необходимо проверить правильность соединений.

После окончания загрузки вы увидите тестовую анимацию на экране, это означает, что вы успешно настроили свой OLED дисплей.

Когда вы вдоволь насладитесь сей анимацией, можете переходить к следующему шагу.

Шаг 7: Пишем свое собственное сообщение

Для написания собственного сообщения, сначала создадим новый скетч в среде программирования ArduinoIDE.

В заголовке мы подключаем 4 библиотеки:

#include <SPI.h >

#include <Wire.h >

#include <Adafruit_GFX.h >

#include <Adafruit_SSD1306.h >

Затем пишем протокол сброса:

#define OLED_RESET 4 Adafruit_SSD1306 display (OLED_RESET ) ;

В VOID SETUP указываем шестнадцатеричный адрес нашего дисплея 0x3C, который мы узнали на «Шаге №4».

Затем, инициализируем дисплей и очищаем его:

display.begin (SSD1306_SWITCHCAPVCC, 0x3C) ;

Для этого описываем размер текста, цвет текста, позицию курсора, и наконец, выводим сообщение с помощью команды println:

display.setTextSize (2) ;

display.setTextColor (WHITE) ;

display.setCursor (0,0) ;

display.println ("Well done!") ;

display.display () ;

В конце не забудьте написать display.display , чтобы изображение вывелось на экран, иначе получите пустоту.

Если вы все сделали правильно, то на дисплеи появится сообщение.

OLED — дисплей являются одним из самых привлекательным и современным дисплеем, при небольших размерах и незначительном энергопотребление OLED дисплей, обеспечивает насыщенную контрастность. Дисплеи в основном доступны на чипе SSD1306, работающим на интерфейсе I2C, для работы которого необходимо только 2 провода, что позволяет быстро подключить и начать использовать. В этом статье расскажу, как подключить OLED дисплей, диагональю 0.96 дюйма и расширением 128 х 64 пикселя.

Технические параметры

Технология дисплея: OLED
Разрешение дисплея: 128 на 64 точек
Диагональ дисплея: 0,96 дюйма
Уол обзора: 160°
Напряжение питания: 2.8 В ~ 5.5 В
Мощность: 0,08 Вт
Габариты: 27.3 мм х 27.8 мм х 3.7 мм

Общие сведения OLED дисплея

А что же такое, технология OLED? Расшифровывается как Organic Light-Emitting Diode, состоит дисплей из большого числа органических светодиодов, главное отличие от LCD дисплея, в том, что каждый светодиод светится сам и не нуждается в отдельной подсветки. Благодаря этому, дисплей обладает значительными преимуществом по сравнению с обычными LCD, такими как контрастностью, углом обзора и малая потребляемая мощность, конечно есть и недостатки, небольшой срок службы и дороговизна.

OLED модуль с расширением 128×64 (0.96 дюйма) состоит из двух частей, из самого дисплея, который в свою очередь можно разделить на две части, графический дисплей и контроллер SSD1306 от которого идет гибкий шлейф на обратную сторону платы. Вторая часть, модуля, представляет собой печатную плату (которая по сути является переходником), на которой установлена минимальная электрическая обвязка, однорядный разъем шаг 2.54 мм и четырьмя крепежными отверстиями.
OLED модули, выпускаются с различным расширением 128×64, 128×32 и 96×16 (в статье и примере используется дисплей с расширением 128×32), сам контроллер SSD1306 может работать с OLED матрицами с максимальным расширение 128×64, так-же, модули бывают белые, синие и сине-желтые (сверху, желтая полоса, шириной 15 пикселя). Каждый производитель, выпускают свою печатные плату с различной компоновкой электронных компонентов и выведенным интерфейсом, так-как контроллер SSD1306 поддерживает сразу три протокола работы:

8-bit 6800/8080-series parallel interface
3 /4 wire Serial Peripheral Interface
I2C

Для изменения протокола работы, предусмотрены три линии BS0, BC1 и BS2 с помощью которых, контроллер дисплея определяет по какому протоколу ему работать. В моем случаи, OLED дисплей разработан для работы по одному протоколу I2C, в других вариантов, возможно смена протокола работы с помощью нулевых резисторах или DIP переключателей.

Ниже приведена принципиальная схема OLED дисплея на микросхеме SSD1306, работающая по интерфейсу I2C, из нее видно, что микросхема U2 выполняет функцию стабилизатора напряжение (3.3В), конденсатор C8 необходим для сглаживания выходного напряжения. Резисторы R6 и R7 выполняют функцию подтяжки линии SCL и SAD, если к шине I2C, подключено не одно устройство, необходимо использовать подтягивающие резисторы только на одном устройстве. С помощью резистора на 0 Ом (без обозначении), можно произвести смену адреса 0x78 или 0x7A.

Назначение контактов J2:
SCL: линия тактирования (Serial CLock)
SDA: линия данных (Serial Dфta)
VCC: «+» питание
GND: «-» питание

Подключение к Arduino

Необходимые детали:
Arduino UNO R3 x 1 шт.
LCD-дисплей 1602A (2×16, 5V, Синий) x 1 шт.
Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
Кабель USB 2.0 A-B x 1 шт.

Подключение :
В примере буду использовать плату Arduino UNO R3 и OLED дисплей (расширением 128×64), как говорил ранее, используемый интерфейс I2c, для подключения необходимо всего два провода, подключаем SDA дисплея к выводу A4 (Arduino), а SCL к выводу A5 (Arduino). При использовании, других платформ Mega или Nano необходимо использовать другие порты, для удобства приведу таблицу, подключения для различных плат. Далее, необходимо подключить питание, GND к GND, а VCC к 5 В или 3.3В, схема собрана, теперь осталось загрузить скетч.


Таблица подключений

Для работы с OLED дисплеем необходима библиотека, так-как библиотек несколько, пример работы покажу через библиотеку OLED_I2C (скачать библиотеку можно в конце статьи)
Программа только отображает текст на дисплей и больше не какого функционала не несет, скачиваем скетч и загружаем ее в плату Arduino UNO R3.

/* Тестировалось на Arduino IDE 1.8.0 Дата тестирования 27.01.2017г. */ #include // Подключаем библиотеку OLED_I2C OLED myOLED(SDA, SCL, 8); // Выбор порта, UNO это SDA 8 pin, SCL - 9 pin. extern uint8_t SmallFont; // Подключаем шрифт void setup() { myOLED.begin(); // инициализация экрана myOLED.setFont(SmallFont); } void loop() { myOLED.clrScr(); // Очищаем экран myOLED.print("Hello!", CENTER, 24); // Выводим текст: в центре, строка 24 myOLED.print("www.robotchip.ru", CENTER, 40); // Выводим текст: в центре, строка 40 myOLED.update(); // delay (500); // пауза 0.5 с }

Тестировалось на Arduino IDE 1.8.0

Дата тестирования 27.01.2017г.

#include // Подключаем библиотеку OLED_I2C

OLED myOLED (SDA , SCL , 8 ) ; // Выбор порта, UNO это SDA 8 pin, SCL - 9 pin.

extern uint8_t SmallFont ; // Подключаем шрифт

void setup ()

myOLED . begin () ; // инициализация экрана

myOLED . setFont (SmallFont ) ;

void loop ()

myOLED . clrScr () ; // Очищаем экран

myOLED . print ("Hello!" , CENTER , 24 ) ; // Выводим текст: в центре, строка 24

myOLED . print ("www.robotchip.ru" , CENTER , 40 ) ; // Выводим текст: в центре, строка 40

myOLED . update () ; //

delay (500 ) ; // пауза 0.5 с

Скачать скетч