Схема включения oled display bl12864g
В данной статье будет описан процесс подключение oled дисплея с контроллером ssd1306 разрешением 128x64 к микроконтроллеру stm32f103C8T6 по интерфейсу SPI. Также мне хотелось добиться максимальной скорости обновления дисплея, поэтому целесообразно использовать DMA, а программирование микроконтроллера производить с помощью библиотеки CMSIS.
Обзор модуля
SSD1306 – контроллер, на котором построено несколько вариаций дисплейных модулей. Часто встречаются также подключающиеся по интерфейсу I²C, но наш сегодняшний вариант подключается по более скоростному SPI.
Сам дисплей, установленный на модуле, выполнен по технологии OLED, что гарантирует низкое потребление, высокую скорость переключения (как следствие, большая возможная частота обновления экрана). Экран двухцветный, что не позволяет выводить точные картинки, зато помогает снизить размер буфера для видеопамяти всего до 1 Кб, так как 8 точек кодируются сразу одним байтом.
Подключение по SPI обеспечивает скорость соединения до 20 Мбит/с, с чем интерфейс I²C с его запросами и сложной структурой конкурировать неспособен. Доступно также подключение по параллельным интерфейсам, но модули с таким подключением мало распространены.
Питание модуля – 3.3 В, но на плате установлен стабилизатор с низким падением напряжения, что позволяет питать дисплей как от 5 В, так и от 3.3 В напрямую. Лучше использовать 5 В питание – этим вы разгружаете и без того не сильно мощный 3.3 В стабилизатор, установленный на Arduino.
Максимальное потребление (когда включены все пиксели дисплея) порядка 20 мА, поэтому при необходимости его можно питать прямо от пина микроконтроллера.
Схема подключения
Всего у дисплея 4 пина – VCC, GND, SDA, SCL. VCC и GND подключаются к VCC и GND Arduino соответственно (чтобы перестраховаться, лучше питать дисплей от пина 3.3В – не на всех модулях стоят понижающие преобразователи), а линии данных находятся у каждой версии Arduino на разных пинах. У Uno (Nano, Pro Mini и других платах на ATMega328/168) SDA – A4, SCL – A5. У Mega – SDA – 20, SCL – 21.
На платах 3 ревизии контакты интерфейса выведены перед 13 пином на гребёнке и подписаны соответственно.
Здравствуйте, MySku`вчане! Сегодня расскажу вам о графическом OLED дисплее на контроллере SSD1306. Похожий дисплей уже обозревался на муське, я постараюсь дополнить обзор, а также покажу, как его подключить к Digispark на базе ATtiny 85. Возможно, эта информация пригодится вам в ваших проектах.
Данный дисплей был куплен в магазине Gearbest за свои деньги.
Заказ был сделан 02.12.2015, посылка дошла на удивление быстро, перед самым новым годом я забрал её на почте. Сейчас данный лот стоит на 47 центов дороже.
Упаковка была стандартная для китайских магазинов, желтый пакет с пупырками внутри. Сам дисплей находился в запаянном антистатическом пакете.
На сам дисплей наклеена защитная пленка от царапин.
Тут видно, что отсутствует резистор с нулевым сопротивлением в качестве перемычки BS1. Когда перепаивал её в другое положение, спружинил пинцет, и потерялась такая красивая перемычка, запаял обычную проволочную.
Технические характеристики дисплея:
— Тип дисплея: OLED монохромный, в данном дисплее 2 цвета, желтый и голубой
— Драйвер дисплея: SSD1306
— Разрешение: 128 х 64 пикселей
— Размер дисплея: 0,96 дюйма
— Углы обзора: >160°
— Интерфейс подключения: 3-wire SPI, 4-wire SPI, I2C
— Напряжение питания: 3,3 В
— Потребляемый ток на пиксел: 100 мкА
— Размеры: 33 мм х 33.5 мм
Даташит на драйвер SSD1306.
Подключать данный дисплей будем к Digispark.
Что это такое и как его настроить на работу в Arduino IDE, можно прочитать в этом обзоре. От себя лишь сделаю ремарку. Настоятельно рекомендую использовать версию Arduino IDE 1.6.5. Сейчас на официальном сайте доступна версия 1.6.7, но с ней у меня постоянно сыпались ошибки. Теперь все собираем на одной макетке.
Подключается Digispark к дисплею следующим образом:
— Т.к. подключать будем по шине I2C, необходимо перепаять перемычку BS1 в положение «1».
— Vcc это питание дисплея, подаем 3,3В
— GND тут понятно, это земля
— DIN (SDA) подключаем к контакту P0 на Digispark (и подтягиваем к +5В резистором 4,7 К)
— CLK (SCL) подключаем к контакту P2 на Digispark (и подтягиваем к +5В резистором 4,7 К)
— CS подключаем к земле
— D/C тут нюанс, если на этот вывод подать «низкий» уровень, т.е. землю, то адрес дисплея будет 0x3C, если подать «высокий» уровень, т.е. подключить к 3,3В, то адрес дисплея будет 0x3D. Я подключил к земле.
— RES подтягиваем к питанию т.е. 3,3В
Теперь загружаем стандартный скетч DigisparkOLED из папки примеров. Тут замечание, при необходимости нужно изменить адрес дисплея в файле DigisparkOLED.h на ваш. Вносите изменения в строку:
По умолчанию там указан 0x3D.
При попытке загрузить данный пример в ATtiny 85 вываливалась ошибка о нехватке памяти мк. Закомментируйте или удалите «картинки» в скетче, т.е. строчки:
и подправьте скетч, у меня получилось так:
В итоге на дисплее увидим
Как видно, вывод 2 строчек текста на экран занимает 4062 байт, что составляет 67% памяти мк. Библиотека довольно прожорливая, если даже пожертвовать загрузчиком, памяти мк останется процентов 50, маловато однако.
Решено было найти или написать библиотеку «полегче». На просторах интернета была найдена библиотека TinySSD1306. Скачивал с этого сайта. Распакуйте библиотеку в папку libraries ( если вы ставили Arduino IDE по умолчанию, то данная папка будет находится по такому пути: «C:\Users\имя_пользователя\AppData\Roaming\Arduino15\packages\digistump\hardware\avr\1.6.5\libraries» ). После перезапуска Arduino IDE, в папке примеров загружаете скетч ssd1306_demo.
Немного подправил данный скетч, чтобы просто вывести одну строку.
Как видно, вывод одной строки у нас занял 2 138 байт, что занимает 35% памяти мк. Это совсем другое дело :) Если убрать загрузчик и использовать «голый» мк, то остается уйма места.
Также я провел некоторые электрические тесты.
Потребляемый дисплеем ток составил 5,6 мА.
Совместно с Digispark потребляемый ток составил 28,2 мА.
Решил понизить частоту ATtiny до 1 Мгц. Потребляемый ток конструкции составил 16,5 мА.
Думаю, что уменьшить ток потребления можно еще раза в 2, если использовать «голый» мк, т.к. на плате Digispark есть еще и светодиод, потребляющий ток. А также можно понизить напряжение для ATtiny до 1,8В.
В итоге:
Дисплеем остался доволен. Высокие углы обзора, высокая контрастность, низкое энергопотребление. Для увеличения быстродействия есть возможность подключить по шине SPI.
Из минусов могу отметить отсутствие стабилизатора 3,3В на плате дисплея, хотя места там полно. В интернете читал, что данные дисплеи толерантны и к 5 Вольтам, но экспериментировать не стал, т.к. в даташит к контроллеру указано, что питание «логики» от 1,65 до 3,3В.
На этом все, постараюсь ответить на ваши вопросы, если будут таковые.
Обычно для вывода информации сигнального дисплея на HD44780 более чем достаточно. Но иногда нужно нарисовать картинку, график или хочется сделать красиво, с модными менюшками. Тут на помощь приходят графические дисплеи. Одним из самых простых и доступных является дисплей на контроллере KS0107 или аналоге. Например, WG12864A от Winstar. Сам дисплей вполне свободно достается, имеет довольно большой размер (диагональ около 80мм) и разрешение 128х64 пикселя. Монохромный. Цена вопроса 400-500р.
Подключение
Управление дисплеем параллельное. Есть шина данных и линии задания направления и вида данных. Это, кстати, один из минусов — требует очень много проводов управления. Занимает почти 16 линий. Но зато и очень прост в работе.
Итак, если взять тот, что у меня WG12864A-TGH-VNW то у него следующая распиновка:
- Vdd и Vss это питание, оно у него пятивольтовое.
- Vee — источник отрицательного напряжения. Там примерно минус 5 вольт. Есть не на всех моделях этих дисплеев, у Winstar о наличии такой фенечки говорит буква V в маркировке. WG12864A-TGH-VNW
- Vo — напряжение регулировки контраста. Туда подается либо 0…5 вольт, либо от -5 до 5, в зависимости от модели и температурного диапазона. Обычно более морозостойкие дисплеи требуют отрицательное напряжение. Схема включения простая:
- D/I — Данные/команда. Логический уровень на этом выводе определяет предназначение кода на шине данных. 1 — данные, 0 — команда.
- R/W — Чтение/Запись. Уровень на этой ноге задает тип действия. 1 чтение, 0 запись.
- Е — Строб, синхронизирующий импульс. Дрыг этой вожжи вверх-вниз проворачивает шестеренки в интерфейсе контроллера.
- DB0..7 — Шина данных, на которую мы выдаем нужный нам код.
- CS1 и CS2 — выбор контроллера.
- RST — сигнал сброса. Ноль на этой линии сбрасывает контроллеры в ноль. Но не сбрасывает видеопамять, только текущую адресацию.
- A и K — питание светодиодной подсветки. Там, как правило, обычные светодиоды, так что напрямую туда 5 вольт подавать нельзя. Только через ограничительный резистор. Ток потребления подсветки весьма велик, около 200мА, падение напряжения в районе 4 вольт. На пяти вольтовом питании ограничетельный резистор должен быть порядка 5-10 Ом.
К контроллеру (ATMega16 на Pinboard) я подключил все следующим образом.
Данные полностью легли на PORTA, а управление на PORTB. В качестве резистора подстройки контраста я взял многооборотный переменник, что так кстати стоит рядом для подобных случаев. Питание подсветки взял с колодки от дисплеяя. Благо там все уже готово, даже управление от транзистора есть :) Правда я ее просто включил.
Двое из ларца, одинаковых с лица. Адресация
Контроллер CS0107 он может организовать матрицу только 64х64. А у нас в дисплее вдвое большая 128х64. Значит стоят два контроллера. Один отвечает за правую половину экрана, другой за левую.
Он представляет собой этакую микросхему памяти, где все введенные данные отображаются на дисплее. Каждый бит это точка. Кстати, для отладки удобно юзать, выгружая туда разные данные, а потом разглядывая этот дамп). Карта дисплея выглядит так:
Байты укладываются в два контроллера страницами по 64 байта. Всего 8 страниц на контроллер.
Протокол обмена
Тут все просто, без каких либо изысков. Выставляем на линиях RW, DI что мы хотим сделать, линиями CS1 и CS2 выставляем к кому обращаемся. На шину данных выдаем нужное число и поднимаем-опускаем линию строба. Опа! Впрочем, есть одна тонкость. Для чтения данных строб нужно дернуть дважды, т.к. предварительно данные должны попасть в регистр-защелку. Для чтения же флага состояния такой изврат не нужен. Вот примеры временных диаграм для разных режимов.
И запись. Причем запись, в отличии от чтения, можно делать сразу в оба контроллера. Конечно одновременно писать данные в контроллер смысла имеет мало, разве что захочишь двойную картику получить :) А вот команды обычно пишут срзау в оба.
Кстати, еще есть одна особенность — выводы CS могут быть инверсными. Это зависит от модели дисплея. Так что это надо учитывать.
Временные диаграммы, т.е. сдвиг фронтов между собой по времени может быть разным у разных контроллеров. Где то быстрей, где то медленней. Но в целом 1мкс обычно хватает. В реале обычно меньше. Лучше поглядеть в даташите на конкретный контроллер (не дисплей, в ДШ на дисплей обычно редко есть описание самого контроллера). Там обычно есть таблица вида:
Где указаны максимально допустимые временные интервалы. Если они будут меньше или больше, то дисплей скорей всего не будет работать. Или будет работать с ошибками. Если у вас на дисплей в процедуре заливки или очистки экрана полезли всякие левые пиксели и прочие артефакты — значит тайминги не выполняются. Также рекомендую проверять тайминги на чтение и на запись. Делается это просто — гоним последовательно сначала чтение, а потом запись обратно. Если ничего не изменилось — значит все ок. Появились искажения? Крутите временные задержки. Только рекомендую читать не пустоту вида 0х00, а что нибудь более веселое залить, например, шахматную доску из пикселей. По очереди 0х55 и 0хАА.
Система команд.
Она тут простейшая.
Инициализация дисплея элементарная, в отличии от HD44780, где надо переключать режимы, включать-выключать разные курсоры и отображения.
Надо после сброса задать начальные координаты (адрес точки и страница), значение скролинга (обычно 0) и включить отображение. При включении на дисплее может быть мусор. Поэтому отображение обычно включают после очистки видеопамяти.
У меня ициализация, по командам, выглядит так:
Ну и потом еще заливка сразу в оба контроллера.
Код
Итак, приступим к коду. Чтобы было наглядней я все операции с ногами расписал в виде макросов. Заодно будет гораздо проще все перенести на другую архитектуру. Просто написав другие макросы, не правя сам код :)
Весь код можно поглядеть в нашей кодосвалке:
lcd_wg128.h
lcd_wg128.c
Покажу тут лишь характерные моменты работы с дисплеем.
Записью команд и данных занимаются следующие функции:
Чтение слова состояния делать не стал. Т.к. дисплей работает весьма шустро, что на круг ожидания можно не уходить, а просто подождать несколько тактов. Собственно этих трех функций уже достаточно для работы :) Остальное все свистоперделки и удобства.
Вроде заливки экрана:
Или установки пикселя. Причем можно загонять его в трех режимах. Просто установить, стереть или инвертировать. Координаты задаются глобальные, а вычисление адреса идет в функции:
Но работа с пикселями медленная штука. Это же каждый надо считать, изменить, закинуть обратно. Куча мороки. На обновление всего экрана в попиксельном режиме уйдет прорва времени. Я подсчитывал, при полной загрузке проца только на это, на заливку попиксельно всего экрана уходит чуть ли не треть секунды.
Куда эффективней работать с дисплеем блоками. Т.е. берем и последовательно записываем сразу куски страниц, на глубину в несколько байт. Например, таким образом удобно рисовать текст. Правда при попиксельном выводе, когда текст попадает между страницами получается неудобно, приходится делать вдвое больше работы. Но все равно намного быстрей чем попиксельно. На порядок!
// Запись сразу блока. Удобно для вывода строк или картинок, постранично. // На входе страница Х и колонка У. А также длина блока и адрес откуда брать данные. u08 BLOCK(u08 x,u08 y, u08 len, u16 addr) < u08 CSS,i,col; if(y>63) // Сначала вычисляем нужные нам сегмент (чип) < CSS = 1else < CSS = 1SET_ADDR(x,col,CSS); // Ставим адрес // А дальше в цикле гоним байты. Не забывая увеличивать адрес, чтобы была выборка из // памяти. Счетчик, чтобы не сбиться со счета. И номер колонки, чтобы не вылезти за границы // И вообще понимать где мы находимся. for(i=0;i!=len;i++,addr++,col++) < if(64==col) // Попутно проверяем за границы выхода из сегмента < if(CSS == (1<
Блочный вывод легко превращается в текстовый вывод. Надо лишь совместить таблицу символов с печаталкой блоков. И гнать данные из флеша напрямую.
// Процедура вывода строки. На входе строка, и координаты. Х в страницах, а У в точках. void LCD_putc(u08 x,u08 y,u08 *string) < u08 sym; while (*string!='\0') // Пока первый байт строки не 0 (конец ASCIIZ строки) < if(127
Для еще большего ускорения можно немного оптимизировать функции ввода вывода. Убрав из хвостов возврат сигналов в первоначальное положение. У меня они больше для красоты. Да чтобы на экране анализатора было лучше видно :)
Ну и чтение-модификацию-запись делать тоже большими блоками. Загоняя, скажем, страницу в буфер, правя его там и быстро выгружая обратно.
Ну и, традиционно, архив с примером. Сделано все на ATmega16 под WinAVR GCC на Pinboard
Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!
А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.
Настройка SPI
Как говорилось выше, подключать дисплей будем к SPI1 микроконтроллера STM32F103C8.
Для удобства написания кода объявим некоторые константы и создадим функцию для инициализации SPI.
Включим тактирование и произведем настройку выходов GPIO, как показано в таблице выше.
Далее произведем настройку SPI в режим master и частотой 18 Мгц.
Далее напишем функцию отправки данных по SPI (пока без DMA). Процесс обмена данными заключается в следующем:
- Ожидаем, пока SPI освободится
- CS=0
- Отправка данных
- CS=1
Также напишем функцию непосредственно отправки команды экрану (Переключение линии DC производим только при передаче команды, а затем возвращаем ее в состояние «данные», так как команды передавать будем не так часто и в производительности не потеряем).
Далее займемся функциями для работы непосредственно с DMA, для этого объявим буфер в памяти микроконтроллера и создадим функции для начала и остановки циклической отправки этого буфера в память экрана.
Краткий обзор модуля
OLED-экраны на базе контроллера SSD1306 популярны благодаря простому подключению, относительно низкой цене и высокому разрешению – для экрана диагональю 0.96 дюйма разрешение составляет аж 128×64! У того же Nokia 3310 разрешение составляет 84×48 пикселей при диагонали 1.5”.
Важным плюсом OLED-экранов является работа без подсветки – каждый пиксель – сам себе подсветка. За счёт такой системы, экран потребляет крайне мало тока (фактически, его можно запитать от пина Arduino). Есть и один минус – при постоянном использовании отдельные пиксели начинают выгорать и терять яркость, но до наступления этого состояния вы успеете отладить и вывести всё, что только можно.
Дисплей подключается по высокоскоростному интерфейсу I2C (относительно высокоскоростному – до 400Кбод) и использует всего 2 сигнальных провода. Это ещё один неоспоримый плюс! Несмотря на то, что интерфейс последовательный, да ещё и данные в обе стороны идут по одной линии, на рядовой Arduino можно достичь порядка 15-20fps, чего более чем достаточно для проектов.
Стоит заметить, что дисплей монохромный – цветные картинки на него не выведешь, а для текста или графика хватит и двух цветов.
Частота обновления дисплея
Так как буфер отправляется в память дисплея циклически, для приблизительного определения частоты обновления дисплея достаточно будет узнать время, за которое DMA осуществляет полную передачу данных. Для отладки в реальном времени воспользуемся библиотекой EventRecorder из Keil.
Для того, чтобы узнать момент окончания передачи данных, настроим прерывание DMA на окончание передачи.
Промежуток времени будем отслеживать с помощью функций EventStart и EventStop.
Получаем 0.00400881-0.00377114=0.00012767 сек, что соответствует частоте обновления 4.2 Кгц. На самом деле частота не такая большая, что связано с неточностью способа измерения, но явно больше стандартных 60 Гц.
Вывод информации из микроконтроллера зачастую создаёт больше сложностей, чем непосредственно работа основной программы – ведь необходимо и “отдать” несколько пинов для подключения, и некоторое количество памяти для библиотеки обработки графики.
Новички часто допускают ошибку, либо пытаясь запихнуть большое количество данных на маленький экран (вроде Nokia 3310), либо наоборот – в любой, даже самый маленький проект добавляют гигантский дисплей, требующий большой производительности.
Мы рассмотрим компромиссное решение – небольшой по размеру (0.96”), но с достаточным разрешением (128×64) экран с подключением всего по 3 проводам!
Инициализация экрана и вывод данных
Теперь создадим функцию для инициализации самого экрана.
Для начала настроим CS, RESET и линию DC, а также произведем сброс контроллера дисплея.
Далее отправим последовательность команд для инициализации (Более подробно о них можно узнать в документации на контроллер ssd1306).
Создадим функции для заполнения всего экрана выбранным цветом и отображения одного пикселя.
Далее в теле основной программы инициализируем SPI и дисплей.
Функция RccClockInit() предназначена для настройки тактирования микроконтроллера.
Зальем весь дисплей белым цветом и посмотрим результат.
Нарисуем на экране в сетку шагом в 10 пикселей.
Функции работают корректно, буфер непрерывно записывается в память контроллера дисплея, что позволяет при отображении графических примитивов пользоваться декартовой системой координат.
115 thoughts on “Работа с графическим дисплеем WG12864 на базе контроллера KS0107”
Зачетно
Надо бы свой прикрутить, попробовать, а то валяется на полке.
Цены на них откровенно безбожные, учитывая, что TFT 2.4″ у китайцев стоят 20$.
Кстати, удобно еще генерить массив какой-нибудь прогой, потом просто выводить на экран. Я с tic-ами там делал. Для статичной фигни.
TFT так просто не обработаешь, под него нужен мощный контроллер, а лучше ПЛИС и видеопамять. Так что не все так просто.
Можно да, но его надо гдето в памяти держать. Тут получается килобайт только фреймбуфер.
Контроллер обычно в таком дисплее есть.
Видеопамяти все равно не напасешься, особенно с двойным буфером.
К примеру, для 7″ (800х480) дисплея с глубиной цвета 24 бит, нужен мегабайт с лишним памяти. RAMа больше 128К я вроде не видел в МК.
Но в целом да, ресурсы все равно нужны свободные.
Мощный то и не нужен, lpc2478 или lh79520 отлично справятся, только если хранить картинки нужно, то лучше прикрутить внешний nand мега на 4
Ди, нескромный вопросик, а с чем у тебя связана работа? :)
Я уже три года как безработный О_о
А последняя работа была какая?
Ди. Раз ты тут. Скажи своей жене чтобы она занялась моим заказом :) 701 вроде.
Последний раз я был наладчиком лабораторного оборудования. До этого наладчиком станков ЧПУ, а до этого я был студентом :)
Схема подключения к Arduino
- CS – любой пин Arduino
- SCK – 13 пин (Arduino UNO)
- MOSI – 11 пин
- Vcc – 3.3…5В
- GND – GND
Распиновку интерфейса для других плат можно найти на официальном сайте.
Организация памяти контроллера дисплея
Перед тем, как выводить что-либо на экран, необходимо разобраться как в контроллере ssd1306 организована память.
При таком методе адресации есть очень неприятная особенность — невозможность записать в память 1 бит информации, так как запись происходит по сегменту (по 8 бит). А так как для корректного отображения единичного пикселя на экране, необходимо знать состояние остальных пикселей в сегменте, целесообразно создать в памяти микроконтроллера буфер размером 1 Кбайт и циклически загружать его в память дисплея (тут и пригодится DMA), соответственно, производя его полное обновление. При использовании такого метода возможно пересчитать положение каждого бита в памяти на классические координаты x,y. Тогда для вывода на экран точки с координатами x и y воспользуемся следующим способом:
А для того, чтобы стереть точку
Подключение
Подключать дисплей к микроконтроллеру будем по интерфейсу SPI1 по следующей схеме:
Передача данных происходит по возрастающему фронту сигнала синхронизации по 1 байту за кадр. Линии SCK и SDA служат для передачи данных по интерфейсу SPI, RES — перезагружает контроллер дисплея при низком логическом уровне, CS отвечает за выбор устройства на шине SPI при низком логическом уровне, DS определяет тип данных (команда — 1/данные — 0) которые передаются дисплею. Так как с дисплея ничего считать нельзя, вывод MISO использовать не будем.
Подключение
Подключать дисплей к микроконтроллеру будем по интерфейсу SPI1 по следующей схеме:
Передача данных происходит по возрастающему фронту сигнала синхронизации по 1 байту за кадр. Линии SCK и SDA служат для передачи данных по интерфейсу SPI, RES — перезагружает контроллер дисплея при низком логическом уровне, CS отвечает за выбор устройства на шине SPI при низком логическом уровне, DS определяет тип данных (команда — 1/данные — 0) которые передаются дисплею. Так как с дисплея ничего считать нельзя, вывод MISO использовать не будем.
Подключение в Arduino IDE
Для дисплея существует множество библиотек, причём никто не запрещает вам написать свою – протокол описан в даташите. Но для упрощения задачи мы возьмём готовую библиотеку U8gLib. Она поддерживает большое количество контроллеров экрана, в числе которых и SSD1306.
После подключения дисплея к вашей отладочной плате открывайте среду Arduino IDE (желательно новой версии) и ищите Менеджер библиотек (Скетч-Добавить библиотеку-Менеджер библиотек). В поиске введите u8glib и устанавливаете любую версию – чем новее, тем лучше.
Откройте любой пример. В начале скетча будет большое количество закомментированных строк инициализации для разных контроллеров. Найдите среди них SSD1306, подключающийся по SPI и имеющий разрешение 128×64, после чего раскомментируйте эту строчку и можете загружать скетч!
В небольших устройствах тоже бывает нужно вывести какую-либо полезную информацию, сохраняя компактные габариты. Обычные экраны, вроде Nokia 3310, не обеспечивают достаточного разрешения, к тому же их не видно в темноте. В различных плеерах, электронных сигаретах и прочем давно уже используют компактные OLED-дисплеи с большим для их габаритов разрешением – так чем наши проекты хуже?
Читайте также: