Как подключить OLED I2C дисплей к ARDUINO

Урок 9. Русский язык на OLED дисплее 128X64

Вы могли наблюдать, что в предыдущих уроках №7 и №8 уже использовался Русский шрифт. В этом уроке мы разберём некоторые проблемные моменты с которыми можно столкнуться при выводе Русских букв на OLED дисплей.

Нам понадобится:

    х 1шт. х 1шт. или Trema Set Shield х 1шт.

Для реализации проекта нам необходимо установить библиотеки:

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

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

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

Вывод Назначение OLED дисплей Arduino UNO
SCL Линия тактирования шины I2C SCL A5
SDA Линия данных шины I2C SDA A4
Vcc Питание (3,3 или 5 В) Vcc 5V
GND Общий GND GND

Подключение OLED дисплея к Arduino UNO по шине I2C

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

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

В коде 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. В большинстве случаев это решит проблему кодировок.

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

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

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

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

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

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

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

Символы в шрифтах для библиотек iarduino_OLED и iarduino_OLED_txt располагаются в соответствии с кодировкой 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» и т.д.

Для перевода чисел из 10-тичной в 8-ричную систему предлагаем воспользоваться стандартным калькулятором Windows. Откройте калькулятор, выберите вид калькулятора — «Программист» и введите число, Вы увидите его представление в разных системах счисления: HEX(16), DEC(10), OCT(8) и BIN(2).

Но если Вы желаете научиться быстро переводить числа между системами счисления 2, 4, 8, 10, 16, без калькулятора, то посмотрите Урок 32 — перевод чисел между системами счисления .

Как подключить OLED I2C дисплей к ARDUINO

Как подключить OLED I2C дисплей к ARDUINO

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

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

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

Как подключить OLED I2C дисплей к ARDUINO

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

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

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

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

Как подключить OLED I2C дисплей к ARDUINO

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

Как подключить OLED I2C дисплей к ARDUINO

Как подключить OLED I2C дисплей к ARDUINO

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

Как подключить OLED I2C дисплей к ARDUINO

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

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

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

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

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

Как подключить OLED I2C дисплей к ARDUINO

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

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

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

Как подключить OLED I2C дисплей к ARDUINO

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

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

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

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

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

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

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

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

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

OLED i2c дисплей 128х64 пикселя

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

Дисплей был куплен в магазине Banggood, ссылка на товар. Есть они и на AliExpress. Дисплей поставляется в виде модуля, размеры модуля приведены на изображении ниже (замечу что не все размеры на чертеже проставлены правильно). Толщина самого дисплея составляет всего 1,45 миллиметра, толщина модуля с учетом smd-компонентов расположенных на задней стороне печатной платы около 4 миллиметров. Размер модуля 27*27 миллиметров, размер самого дисплея 26,7*19,3 миллиметра, при этом активное рабочее поле дисплея составляет всего 10,9*21,75 миллиметра, пиксели расположены с шагом 0,17 миллиметра, размер пикселя же всего 0,154*0,154 миллиметра.

Чип SSD1306 поддерживает 5 протоколов связи:

  • I2C;
  • 3-проводной SPI;
  • 4-проводной SPI;
  • 8-bit 68XX parallel;
  • 8-bit 80XX parallel.

В данном модуле используется протокол I2C, но встречаются модули с протоколом SPI и даже с переключением протоколов.

Данная статья является не дословным изложением «датшита» на дисплей. Я рассмотрю основные команды для работы с дисплеем, приведу пример работы с ним. Для тех кто делает первые шаги в программировании микроконтроллеров (для «ардуинщиков») в конце статьи будет приведено описание библиотеки для работы с данным дисплеем. Все примеры так же выполнены в среде ArduinoIDE, ибо статья рассчитана не столько на матерых программистов микроконтроллеров (которые и без моей помощи смогут разобраться в даташите и написать библиотеку), сколько на новичков. К тому же, на мой взгляд важнее понять как работать с дисплеем, нежели увидеть реализацию в какой-то определенной среде программирования. Кроме того, существуют готовые библиотеки для других компиляторов, включая популярную библиотеку U8glib. Их я рассматривать не буду.

Как я уже упоминал, дисплей имеет разрешение 128*64 точки, но ввиду особенностей чипа SSD1306 невозможно получить доступ к каждой точке отдельно. Что бы передать дисплею значение одной точки достаточно одного бита, но данные передаются байтами. Как вы помните, в одном байте — 8 бит, и байта достаточно для изменения значения сразу 8 точек одновременно (в данном случае эти 8 точек расположены в виде вертикального столбца). Поэтому всё поле дисплея по горизонтали разбито на страницы, в каждой странице 8 строчек. Столбцы же остаются столбцами. Итого 8 страниц и 128 столбцов, а значит для изменения значений всех 8192 пикселей на дисплее необходимо передать 1024 байта.

Получается, что одним байтом мы можем изменить значения столбца из 8 пикселей, и информация в столбец записывается сверху вниз. Что бы зажечь левый верхний пиксель дисплея, необходимо в первый столбец первой страницы (не забывайте что счет начинается с 0) записать значение 0х01.

Кроме самих данных, которые необходимо вывести на дисплей, необходимо так же отдавать команды дисплею. Что бы дисплей понял, какой байт является командой, а какой данными, предварительно посылается 0x00 для команд и 0x40 для данных. Причем посылать этот указатель надо каждый раз перед отправкой команд или данных. Команды могут состоять как из одного байта, так и из нескольких. И каждый байт команды посылается отдельно.

Перед вводом данных, необходимо выбрать область дисплея, в которую будет выводиться информация. Для этого необходимо подать команду выбора страниц, затем двумя командами задать начальное и конечное значения. Если информация должна выводиться в одной странице, то начальное и конечное значения должны совпадать. Аналогично и для столбцов. После выбора столбцов и страниц можно начинать передавать данные, и после ввода одного байта в память дисплея счетчик столбцов (или страниц, в зависимости от настроек. Но поскольку мы пишем слева направо сверху вниз, то я буду рассматривать вариант вывода данных на дисплей именно так – в каждую страницу информация записывается слева на право, при заполнении страницы данные выводятся на следующую страницу, которая находится ниже.) переключается на следующее значение.

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

Но предусмотрен и другой вариант: вывод данных сверху вниз слева направо (вертикальная адресация).

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

Перед выводом информации на дисплей необходимо произвести инициализацию дисплея. Процесс инициализации подробно описан в даташите, и даже в виде блок-схемы (извиняюсь за ватермарк, не знаю как избавиться от него в файлах pdf).

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

Зачастую при работе с дисплеями, в которых поле дисплея разбито на страницы, используют «двойную буферизацию» — информацию о состоянии каждого пикселя записывают в массив, а затем одновременно переносят информацию из массива в память экрана. При этом массив будет занимать 1024 байта в памяти микроконтроллера.

Список всех команд конечно же содержится в datasheet-е на дисплей, в том числе команды скроллинга, которые я не стал рассматривать. Даташит достаточно обширный, на 65 страниц. В нем конечно же не рассматриваются примеры работы с буфером.

И наконец, рассмотрим готовую библиотеку для ардуино.

Я нашел несколько библиотек для работы с данным дисплеем, и у каждой из них свои особенности:

  • OzOLED – поддерживает вывод изображений (bitmap), текста и цифр, а так же инверсию и скроллинг. Не поддерживает графические примитивы и содержит один шрифт. Проста в освоении, но мало функциональна.
  • U8glib – пожалуй самая универсальная библиотека для различных типов дисплеев, умеет многое, но сложна в освоении. Это связано в первую очередь с тем, что сразу не понятно, какая функция будет работать с определенным дисплеем (например, как поведет себя функция выбора цвета RGB на монохромных дисплеях).
  • OLED_I2C – самая удобная на мой взгляд библиотека. Поддерживает вывод изображений, текста и чисел, графических примитивов, имеет в своем составе несколько шрифтов, в том числе есть вариант библиотеки с русским и украинским шрифтами (количество шрифтов можно расширить) и имеет двойную буферизацию изображения (что одновременно и хорошо и плохо).

Итак… Библиотека OLED_I2C , довольно простая библиотека. Открываем keywords.txt и видим перечисление всех функций библиотеки. Так же открываем OLED_I2C.h чтобы посмотреть, какие аргументы может принимать та или иная функция.

Создадим каркас скетча.

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

Функция clrScr очищает на самом деле не дисплей, а буфер. А функция update переносит информацию из буфера в дисплей. У функции clrScr есть противоположная функция fillScr, которая зажигает все точки дисплея.

Предполагается, что исходным состоянием пикселя является не активное состояние, то есть пиксель погашен. В активном состоянии пиксель светится. Таким образом вся информация на дисплей выводится «белым по черному» (мой дисплей реально черно-белый, но встречаются черно-голубые и даже черно-желто-голубые). Но можно выводить информацию наоборот, «черным по белому». При этом у каждой функции, что вводит данные в буфер, есть инверсная функция. Я буду рассматривать их в паре. Кроме того сам дисплей поддерживает инверсию цвета, «черным по белому» можно выводить информацию всегда.

Начнем с графических примитивов. Все описания функций даны в комментариях.

Данный скетч демонстрирует все доступные графические примитивы и их инверсные аналоги (в скетче я не упомянул лишь одну функцию – invPixel(int x, int y), которая изменяет цвет пикселя на противоположный). Стоит уточнить, что начало координат находится в левом верхнем углу. Координата Х располагается вдоль длинной части дисплея и принимает значения от 0 до 127, координата У вдоль короткой (значения от 0 до 63).

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

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

Пример содержит два файла: собственно сам скетч OLED_I2C_Bitmap.ino и файл в котором хранятся изображения graphics.c. Я приведу немного урезанный пример, что бы не загромождать статью.

Содержимое файла graphics.c:

И содержимое самого скетча:

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

Теперь о том, как создать такой массив из изображения. Сперва изображение нужно создать, я сделал это в обычном «пейнте».

В свойствах изображения задал размер изображения и перевел программу в черно-белый режим.

Изображение сохранил в виде монохромного bmp-файла. Не обязательно переводить программу в монохромный режим, да и сохранить можно даже в jpeg, но результат перевода изображения в массив может быть непредсказуемым.

Далее необходимо использовать программу LCDAssistant. Что бы открыть изображение в меню выбираем File – Load image появившемся диалоговом окне выбираем необходимое изображение. Настройки в программе оставляем по умолчанию, размер устанавливается автоматически, остается ввести только имя массива в Table name. Далее File – Save output, в диалоговом окне вводим имя с расширением файла (я рекомендую расширение txt) и сохраняем файл. Из полученного файла необходим только массив, переносим его в скетч, не забывая поместить его в const uint8_t name[] PROGMEM=<…>; .

Несколько замечаний по выводу изображений на экран:

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

Отрицательные значения размера изображения не допустимы, изображение в этом случае не будет выведено на дисплей;

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

9

И наконец расскажу о выводе текста и цифр.

Шрифты содержатся в файле библиотеки DefaultFonts.c и представляют собой массив, так же как массив изображения. По сути в одном шрифте содержатся много изображений каждого символа шрифта.

Рассмотрим пример программы, выводящей текст, целые и дробные числа. Объяснение по каждой функции даны в комментариях.

Библиотека пригодится и тем, кто программирует микроконтроллеры в настоящих взрослых IDE, так как из библиотеки можно почерпнуть готовые алгоритмы как по работе с дисплеем, так и по работе с буфером.

Пожалуй на этом всё. Если описывать все возможности дисплея (например, скроллинг изображения), рассмотреть подробно работу с буфером, ввод в этот буфер графических примитивов, изображения и текста, то размер статьи будет превышать даже объем даташита. Для изучения всех этих возможностей рекомендую «поковырять» библиотеку OLED_I2C.

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

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

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

DSC00905_sm

Еще лет 10 назад, когда технология только-только начала набирать обороты, у OLED было несколько проблем, самой серьезной из которых был короткий срок службы светодиодов. За последние несколько лет инженеры победили большинство «детских» болезней этой технологии, и теперь OLED дисплеи используются даже в ультрасовременных телевизорах с большой диагональю. Также OLED применяют в дисплеях для мобильных устройств, например в одной из модификаций Google Nexus.

Раз 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!»:

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

DSC00907_sm

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

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

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

  1. создаем в любом графическом редакторе черно-белую картинку с разрешением 128 x 64 точки;
  2. сохраняем в формате BMP с 256 цветами (так умеет делать mspaint);
  3. конвертируем картинку в массив байт с помощью онлайн сервиса: http://git.robotclass.ru/tools/bmptobin.html

Осталось вставить полученный массив данных в программу:

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

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

Задания

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

OLED-дисплей (Troyka-модуль)

OLED-дисплей пригодится для отображения показаний сенсоров и модулей в виде текста, графиков и диаграмм.

Видеообзор

Примеры для Arduino

Схема устройства

Подключите дисплей к Arduino Uno к пинам шины I²C — SDA и SCL .

Для быстрой сборки используйте Troyka Shield. С Troyka Slot Shield провода не понадобятся вовсе.

Для упрощения работы с OLED-дисплеем скачайте и установите библиотеку TroykaOLED.

Библиотека подходит для всех платформ Arduino — как с AVR-контроллерами, так и с ARM.

Вывод текста

Для вывода первой программы приветствия, воспользуйтесь кодом вроде этого:

Вывод кириллицы

Для вывода кириллицы используйте соответствующий шрифт с поддержкой русского языка.

В зависимости от версии операционной системы, среды программирования и даже сохранён ли был скетч — может использоваться разная кодировка. Если вместо кириллический символов вы видите не читаемый текст — попробуйте изменить кодировку функцией setCoding .

Вывод геометрических фигур

Методы библиотеки также позволяют выводить геометрические фигуры.

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

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

Для начала подготовьте картинку для вывода её на экран — преобразуйте в массив чисел. Для этого понадобится графический редактор GIMP и программа для создание массива символов из изображения LCDAssistant.

Подготовка изображения

Высота картинки должна быть кратна восьми.

Повторимся ещё раз, каждый символ в массиве это байт, в котором храниться информация о том, какие пиксели (биты) закрашивать в данном байте. И так по очереди все байты на каждой странице.

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

Примеры для Espruino

Схема устройства

Подключите дисплей к Iskra JS к пинам шины I²C — SDA и SCL .

Для быстрой сборки используйте Troyka Shield. С Troyka Slot Shield провода не понадобятся вовсе.

Вывод текста

Для вывода первой программы приветствия, воспользуйтесь скриптом вроде этого:

Вывод геометрических фигур

Методы библиотеки также позволяют выводить геометрические фигуры.

Примеры для WiFi Slot

Схема устройства

Подключите дисплей к платформе WiFi Slot к пинам шины I²C — SDA и SCL . Для этого установите модуль в соответствующий слот.

Платформа WiFi Slot программируется двумя способами:

Соответственно после настройки платформы выберите код из примера Arduino или код для JavaScript.

Элементы платы

OLED-дисплей

Дисплей модуля выполнен по технологии OLED с разрешением 128×64. Методика OLED (organic light-emitting diode) — это матрица точек, где каждый пиксель является отдельным светодиодом. Благодаря таким светящимся пикселям — OLED-дисплей обладает высокой контратсностью, углом обзора более 160° и не нуждается в подсветке.

Пользовательские кнопки

На модуле по бокам расположены две тактовых кнопки S1 и S2 .

Пока кнопка отпущена — на сигнальном пине S присутствует логическая единица, а при нажатии на кнопку — логический ноль.

Troyka-контакты

На модуле выведено две пары Troyka-контактов.

Смена адреса модуля

Иногда в проекте необходимо использовать несколько дисплеев. Для смена адреса капните каплей припоя на отведённую контактную площадку на обратной стороне модуля. После чего адрес дисплея сменится с 0x3C на 0x3D .

Понижающий регулятор напряжения

Линейный понижающий регулятор напряжения NCP582 с выходом 3,3 вольта, обеспечивает питание дисплейного модуля. Максимальный выходной ток составляет 150 мА.

На плате так же присутствует необходимая обвязка для сопряжения устройств с разными питающими напряжениями.

В нашем случае это может быть управляющая плата Arduino с 5 вольтовой логикой и OLED-дисплей с 3,3 вольтовой логикой.

Подключение OLED-дисплея к Arduino

В этом уроке вы познакомитесь с интерфейсом Arduino OLED. В первой части настроим OLED-дисплей так, что он будет показывать нам данные датчика температуры и влажности, а во второй части отобразим логотипы iPhone, Samsung и LG.

OLED-дисплеи, что это такое?

OLED – что же это за аббревиатура? Она в переводе с английского означает, органический светоизлучающий диод. OLED-дисплеи очень маленькие и имеют высокое разрешение. Эти дисплеи не имеют подсветки, они излучают свой собственный свет. Вот почему эти дисплеи очень экономны и практичны для использования в разных электронных устройствах.

Почти в любом магазине, где продают бытовую электронику, можно увидеть хотя бы один телевизор с OLED-дисплеем. Именно из-за такой особой технологии изготовления такое устройство будет очень дорого. Но почему? Каковы особенности такого дисплея?

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

OLED в работе

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

На границе между проводящим и излучающим слоями создаются электронные дыры. Эти дыры заполнены электронами, и OLED излучает свет. Цвет дисплея зависит от используемых органических молекул.

OLED и Arduino

OLED-дисплей, который мы собираемся использовать, имеет 128×64 белых OLED-пикселей. Это 0,96 » (25 мм X 14 мм). OLED-дисплеи других размеров также доступны. OLED, используемый в этом руководстве, является монохромным (имеет только один цвет), но вы также можете приобрести OLED-дисплей, который имеет несколько цветов.

Этот дисплей использует SPI для связи с Arduino. Связь SPI быстрее, чем связь I2C, поэтому именно этот вид связи сделает наш дисплей быстрее.

Принципиальная электрическая схема

OLED работает с напряжением 3,3 V, поэтому не рекомендуем подключать его к 5 V Arduino. Данная схема сможет работать, но срок службы OLED-уменьшится.

Выполните все соединения для OLED и DHT22 с Arduino следующим образом

OLED+Arduino

DHT22+Arduino

Если вы хотите узнать больше о взаимодействии DHT22 с Arduino, много информации имеется в интернете.

Скачать библиотеку можно по ссылке ниже.

Объяснение про код

Для OLED мы использовали библиотеку U8glib. Посмотрим, как работает библиотека.

Данные отображаются на OLED в виде петель изображения. First Page () показывает начало цикла показа изображений. Кроме того, нам нужно создать цикл «делать пока». Все, что мы хотим показать на дисплее, должно быть записано в цикле «do while». Цикл «do while» будет продолжаться до тех пор, пока nextpage () не вернется к «1».

Команда u8g.setFont (u8g_font_helvB10) установит заданный шрифт. Эта библиотека имеет разные размеры шрифтов и дизайн, которые вы можете найти по ссылке ниже.

Команда u8g.drawStr (30, 10, «Welcome») выведет «welcome» в позиции X, Y. Значение «30» для горизонтального положения (X), а значение «10» для вертикального положения (Y). Другие команды рисования работают также.

Команда u8g.setPrintPos (75, 15), используемая в коде, установит указатель в положение X (75), Y (15). Затем вы можете распечатать выходные данные датчика с помощью команды u8g.print ().

Как показывать растровые изображения на OLED

Теперь давайте отобразим растровые изображения на OLED. Нам надо показать логотипы iPhone, Samsung и LG на OLED. Принципиальная схема для этого примера показана ниже.

Максимальный размер изображения, отображаемого на OLED, не должно превышать 128X64 пикселей, а само изображение должно быть черно-белым, потому что наш OLED является монохромным, что означает, дисплей имеет только один цвет. Если у вас многоцветный OLED, конечно же вы можете отображать цветные картинки.

В качестве примера приведены черно-белые логотипы, измененные в размере. Paint имеет опцию изменения размера в главном меню, как выделено желтым цветом на изображении ниже. Если опция не работает, вы также можете перетащить изображения область рисования из маленьких прямоугольников, как показано на рисунке ниже.

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

После того как вы измените размер изображений, вам не обходимо будет установить программное обеспечение LCD Assistant. Скачать программное обеспечение LCD Assistant можно по ссылке ниже.

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

Теперь откройте меню файлов и нажмите «Сохранить вывод». Сохраните имя файла с «.c» в конце, как «logo.c». Затем откройте сохраненный файл в текстовом редакторе и скопируйте код оттуда.

Это будет код для создания растрового изображения на OLED. Затем вставьте его в код Arduino, как в приведенном ниже коде.

Этот код может показаться слишком большим, но именно он будет отображать логотип IPhone, логотип Samsung и логотип LG один за другим на OLED-дисплее. Синтаксис команды bitmap, которую мы использовали в коде, выглядит следующим образом.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: