Универсальная основа для контроллера с графическим интерфейсом на atmega8 c oled дисплеем

Работа с графическим дисплеем WG12864 на базе контроллера KS0107

Обычно для вывода информации сигнального дисплея на 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 страниц на контроллер.
 

Так что для того, чтобы выставить точку с координатами на экране, например, Х = 10, Y=61 надо вычислить в каком контроллере она находится. Первый до 63, второй после, если адрес во втором контроллере, то надо вычесть 64 из координаты.

Затем вычислить страницу и номер бита. Страница это Х/8, а номер бита остаток от деления (Х%8). Потом нам надо считать нужный байт из этой страницы (если мы не хотим затронуть остальные точки), выставить в нем наш бит и вернуть байт на место.

 

Протокол обмена Тут все просто, без каких либо изысков. Выставляем на линиях RW, DI что мы хотим сделать, линиями CS1 и CS2 выставляем к кому обращаемся. На шину данных выдаем нужное число и поднимаем-опускаем линию строба.

Опа! Впрочем, есть одна тонкость. Для чтения данных строб нужно дернуть дважды, т.к. предварительно данные должны попасть в регистр-защелку. Для чтения же флага состояния такой изврат не нужен.

Вот примеры временных диаграм для разных режимов.

Чтение

И запись. Причем запись, в отличии от чтения, можно делать сразу в оба контроллера. Конечно одновременно писать данные в контроллер смысла имеет мало, разве что захочишь двойную картику получить 🙂 А вот команды обычно пишут срзау в оба.
 

Временные диаграммы, т.е. сдвиг фронтов между собой по времени может быть разным у разных контроллеров. Где то быстрей, где то медленней. Но в целом 1мкс обычно хватает. В реале обычно меньше. Лучше поглядеть в даташите на конкретный контроллер (не дисплей, в ДШ на дисплей обычно редко есть описание самого контроллера). Там обычно есть таблица вида:

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

Также рекомендую проверять тайминги на чтение и на запись. Делается это просто — гоним последовательно сначала чтение, а потом запись обратно. Если ничего не изменилось — значит все ок. Появились искажения? Крутите временные задержки.

Только рекомендую читать не пустоту вида 0х00, а что нибудь более веселое залить, например, шахматную доску из пикселей. По очереди 0х55 и 0хАА.
 

 

Система команд.
Она тут простейшая.

Команда D/I R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Назначение
Отображение ВКЛ/ВЫКЛ L L L L H H H H H L/H Управляет вкл/выкл отображения. Не влияет на внутреннее состояние и данные ОЗУ изображения.L: ВЫКЛH: ВКЛ
Установить Адрес L L L H Адрес Y (0 ~ 63) Заносит адрес Y в счётчик адреса Y
Установить Страницу (адрес Х) L L H L H H H Страница (0 ~ 7) Заносит адрес X в регистр адреса X
Начальная Строка Отображения L L H H Начальная строка отображения (0 ~ 63) Скроллинг вверх. На сколько пикселей сдвинуть адресное пространство. При этом уехавшее вверх, за экран, вылезет снизу, словно мы провернули экранную область как барабан
Чтение Состояния L H BUSY L ON/OFF RESET L L L L Чтение состояния.BUSYL: ГотовностьH: Выполняется команда ON/OFFL: Отображение ВКЛH: Отображение ВЫКЛRESETL: Нормальный режимH: Сброс
Запись Данных Изображения H L Данные для записи Записывает данные (DB0:7) в ОЗУ данных изображения. После записи инструкции, адрес Y увеличивается на 1 автоматически.
Чтение Данных Изображения H H Данные для чтения Читает данные (DB0:7) из ОЗУ данных изображения на шину данных. После чтения адрес Y сам увеличивается на 1 автоматически

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

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

У меня ициализация, по командам, выглядит так:
 

  • 0x3F — включить
  • 0x40 — Адрес Y=0
  • 0xB8 — Страница Х=0
  • 0xC0 — Скролл = 0 (т.е. с самого верха)

Ну и потом еще заливка сразу в оба контроллера.
 

Код Итак, приступим к коду. Чтобы было наглядней я все операции с ногами расписал в виде макросов. Заодно будет гораздо проще все перенести на другую архитектуру. Просто написав другие макросы, не правя сам код 🙂 Весь код можно поглядеть в нашей кодосвалке:

lcd_wg128.h

lcd_wg128.c
 

Покажу тут лишь характерные моменты работы с дисплеем.
 

Записью команд и данных занимаются следующие функции:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Пишем команду в выбранный контроллер
void LCD_WR_COM(u08 cmd,u08 CSC)
{ // Поднятие сигналов:
LCD_SET_CMD; // Команда
LCD_SET_W; // Запись
 
ON_CS(CSC); // Выбор чипа
 
LCD_DATA_INS(cmd); // Команду на шину данных
 
NOPS; // Подождем
LCD_PUL_E; // Дрыгнем стробом
NOPS; // Подождем
 
LCD_OFF_CS1; // Выключим
LCD_OFF_CS2; // выбор кристалла
}
 
// Пишем данные в контроллер
void LCD_WR_DATA(u08 cmd, u08 CSC)
{ // Поднятие сигналов
LCD_SET_DAT; // Данные
LCD_SET_W; // Запись
 
ON_CS(CSC); // Выбор чипа
 
LCD_DATA_INS(cmd); // Данные на шину данных
 
NOPS; // Подождем
LCD_PUL_E; // Дрыгнем стробом
NOPS; // Подождем
 
LCD_OFF_CS1; // Выключим выбор
LCD_OFF_CS2; // Чипа.
}
 
// Чтение данных из байта, адрес которого уже должен быть установлен. Надо только выбрать
// контроллер.
u08 LCD_RD_DATA(u08 CSC)
{
u08 outv; // Выставляем линии управления
LCD_SET_DAT; // Данные
LCD_SET_R; // Чтение
 
ON_CS(CSC); // Выбираем чип (только один!)
 
NOPS; // Ждем
LCD_PUL_E; // Дрыг стробом – пустое чтение, активация защелки
NOPS; // Ждем
 
LCD_UP_E; // Строб вверх
NOPS; // Ждем
outv = LCD_DATA_PIN; // Контроллер выдал данные на шину. Читаем их
LCD_DN_E; // Строб вниз
 
LCD_OFF_CS1; // Все свободны!
LCD_OFF_CS2;
 
return outv; // Возвращаем считанное
}

// Пишем команду в выбранный контроллер void LCD_WR_COM(u08 cmd,u08 CSC) { // Поднятие сигналов: LCD_SET_CMD; // Команда LCD_SET_W; // Запись ON_CS(CSC); // Выбор чипа LCD_DATA_INS(cmd); // Команду на шину данных NOPS; // Подождем LCD_PUL_E; // Дрыгнем стробом NOPS; // Подождем LCD_OFF_CS1; // Выключим LCD_OFF_CS2; // выбор кристалла } // Пишем данные в контроллер void LCD_WR_DATA(u08 cmd, u08 CSC) { // Поднятие сигналов LCD_SET_DAT; // Данные LCD_SET_W; // Запись ON_CS(CSC); // Выбор чипа LCD_DATA_INS(cmd); // Данные на шину данных NOPS; // Подождем LCD_PUL_E; // Дрыгнем стробом NOPS; // Подождем LCD_OFF_CS1; // Выключим выбор LCD_OFF_CS2; // Чипа. } // Чтение данных из байта, адрес которого уже должен быть установлен. Надо только выбрать // контроллер. u08 LCD_RD_DATA(u08 CSC) { u08 outv; // Выставляем линии управления LCD_SET_DAT; // Данные LCD_SET_R; // Чтение ON_CS(CSC); // Выбираем чип (только один!) NOPS; // Ждем LCD_PUL_E; // Дрыг стробом – пустое чтение, активация защелки NOPS; // Ждем LCD_UP_E; // Строб вверх NOPS; // Ждем outv = LCD_DATA_PIN; // Контроллер выдал данные на шину. Читаем их LCD_DN_E; // Строб вниз LCD_OFF_CS1; // Все свободны! LCD_OFF_CS2; return outv; // Возвращаем считанное }

Чтение слова состояния делать не стал. Т.к. дисплей работает весьма шустро, что на круг ожидания можно не уходить, а просто подождать несколько тактов. Собственно этих трех функций уже достаточно для работы 🙂 Остальное все свистоперделки и удобства.
 

Вроде заливки экрана:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Заливка экрана
void LCD_FILL(u08 byte)
{ for(u08 i=0; i

Источник: http://easyelectronics.ru/rabota-s-graficheskim-displeem-wg12864-na-baze-kontrollera-ks0107.html

Наручные часы на Atmega328 и OLED дисплее

Дата публикации: 14 ноября 2013.

Рейтинг:  5 / 5

Будильники– Активация до 10 будильников.- Количество будильников ограничено только количеством доступных EEPROM и RAM.

– У каждого будильника настраиваются часы, минуты и в какие дни недели он должен быть активным.

Игры

Побег АвтомобильDodge

Приложения

Фонарик. Включаетвсе пикселиOLEDисветодиоды, а также имеетрежимстробоскопа Стопкадр

Некоторые возможности:– 3 канала регулировки громкости для:Основного режима;Будильника;

Почасового сигнала.

– Режим ожидания- Регулировка яркости дисплея

– Анимация

Вы же не собираетесь, от этого отказываться, или может g shock купить спб ?

Энергосбережение

В активном режиме микроконтроллер пытается уйти в режим сна при каждой возможности.

В режиме сна контроллер просыпается на миллисекунду чтобы посмотреть нуждается устройство в обновлении, если нет, то он возвращается в режим сна, это обычно занимает менее 100 us, если дисплей не нуждается в обновлении. В этом режиме ток потребления может быть примерно от 0,8 мА до 2 мА, в зависимости от того, как долго высвечивается кадр.

В режиме сна микроконтроллер отключает OLED дисплей и уходит в спящий режим, где его разбудит только нажатие кнопки, сигнал от RTC или при подключении к USB. В этом состоянии микроконтроллер потребляет ничтожные 100 nА.

В спящем режиме общий ток потребления часов 6 uA. В активном режиме ток может варьироваться от 2 мА до более чем 70 мА, средний ток потребления 10 mA.

Общее потребление тока, емкость аккумулятора: 150mAh

Минимальный(В режиме сна) Нормальный(Индикация главных часов) Высокий(Фонарик)
6uA2.85 years 10mA15 hours 64mA2 hours, 20 minutes

Если часы находятся в активном режиме в среднем 1 минуту в день (с 5-секундный тайм-аутом сна и проверкой времени 12 раз в день), то они должны работать около 1 года 4 месяцев на одной зарядке. (30 дней, если часы просыпаются на 1 минуту в час).

Потребление тока для отдельных компонентов

Компонент Потребление тока
ATmega328P (сон/активный) 100nA / 1.5mA
OLED (сон/активный) 500nA / 8.5mA
DS3231M RTC 2.5uA
Диод Шоттки (D1) (ток обратной утечки) 1uA
Регулятор (ток покоя) 1uA
Другие (MOSFET и конденсаторы и т.п. утечки) 1uA
Всего (сон/активный) 6.1uA / 10mA

Дальнейшее совершенствование проекта– Программирование через USB. На данный момент используются 4 провода для SPI программирования, при частом подключении к разъему программирования, боюсь что он расшатается.- Добавить другой метод измерения заряда батареи.

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

Текущая прошивка использует примерно 28 KB из 32 KB свободного места памяти  ATmega328P, при использовании других микроконтроллеров с большим объемом памяти, необходимо будет добавить больше возможностей, например калькулятор.

Тем не менее, ATmega328P имеет самое большое количество памяти для AVR в 32 контактных TQFP корпусах, чтобы иметь больше памяти я должен был бы использовать 44 контактный AVR. ATmega1284 выглядит очень интересно.- Импульсный стабилизатор, регулятор подкачки заряда или может быть гибридное решение?

Линейный регулятор который используется в данный момент не является особо эффективным, импульсный регулятор, кажется, не очень хорош при низком токе. Может есть возможность использования регулятора подкачки заряда или гибридное решение – линейным регулятор для неактивного режима и импульсный стабилизатор для активного режима?

Может кто знает?

Фотогалерея проекта

Источник: https://radioparty.ru/all-files/finish/5/505

Графический OLED дисплей

Здравствуйте, 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 на ваш. Вносите изменения в строку: #define SSD1306 0x3C // Slave address. По умолчанию там указан 0x3D. При попытке загрузить данный пример в ATtiny 85 вываливалась ошибка о нехватке памяти мк. Закомментируйте или удалите «картинки» в скетче, т.е. строчки: #include “img0_128x64c1.h” #include “digistump_128x64c1.h” и подправьте скетч, у меня получилось так:В итоге на дисплее увидим
Как видно, вывод 2 строчек текста на экран занимает 4062 байт, что составляет 67% памяти мк. Библиотека довольно прожорливая, если даже пожертвовать загрузчиком, памяти мк останется процентов 50, маловато однако.

Решено было найти или написать библиотеку «полегче». На просторах интернета была найдена библиотека TinySSD1306. Скачивал с этого сайта.

Распакуйте библиотеку в папку libraries ( если вы ставили Arduino IDE по умолчанию, то данная папка будет находится по такому пути: «C:Usersимя_пользователяAppDataRoamingArduino15packagesdigistumphardwareavr1.6.

5libraries» ). После перезапуска 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В.

На этом все, постараюсь ответить на ваши вопросы, если будут таковые.

Еще раз всех с Новым годом и Рождеством!!

Источник: https://mysku.ru/blog/china-stores/37346.html

Обзор OLED-дисплея 0.96,128х64 на SSD1306 – RobotChip

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 мм
  Рабочая температура: –30 °С ~ +70 °С

Общие сведения

А что же такое, технология 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, подключено не одно устройство, необходимо использовать подтягивающие резисторы только на одном устройстве. Резистор на 4.

7кОм, без обазнечени, необходим для смены адреса, 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_I2COLED  myOLED(SDA, SCL, 8);                  // Выбор порта, UNO это SDA 8 pin, SCL – 9 pin.extern uint8_t SmallFont[];                 // Подключаем шрифт  myOLED.begin();                           // инициализация экрана  myOLED.setFont(SmallFont);  myOLED.clrScr();                          // Очищаем экран  myOLED.print(“Hello!”, CENTER, 24);       // Выводим текст: в центре, строка 24  myOLED.print(“www.rchip.ru”, CENTER, 40); // Выводим текст: в центре, строка 40  delay (500);                              // пауза 0.5 с

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

Ссылки
  Библиотека OLED_I2C

Купить на Aliexpress
  Контроллер Arduino UNO R3
  Провода DuPont, 2,54 мм, 20 см
  OLED-дисплей 0.96,128х64, белый, DC 3.3-5B, SPI, IIC

Купить в Самаре и области
  Купить контроллер Arduino UNO R3 в г. Самаре
  Купить провода DuPont, 2,54 мм, 20 см в г. Самаре
  Купить часы реального времени OLED-дисплей 0.96 в г. Самаре

Источник: http://blog.rchip.ru/obzor-oled-displey-na-ssd1306/

Графический OLED дисплей

Здрaвcтвуйтe, MySku`вчaнe! Сeгoдня рaccкaжу вaм o грaфичecкoм OLED диcплee нa кoнтрoллeрe SSD1306. Пoxoжий диcплeй ужe oбoзрeвaлcя нa муcькe, я пocтaрaюcь дoпoлнить oбзoр, a тaкжe пoкaжу, кaк eгo пoдключить к Digispark нa бaзe ATtiny 85. Вoзмoжнo, этa инфoрмaция пригoдитcя вaм в вaшиx прoeктax.

Дaнный диcплeй был куплeн в мaгaзинe Gearbest зa cвoи дeньги.

Скрины зaкaзa

Зaкaз был cдeлaн 02.12.2015, пocылкa дoшлa нa удивлeниe быcтрo, пeрeд caмым нoвым гoдoм я зaбрaл ee нa пoчтe. Сeйчac дaнный лoт cтoит нa 47 цeнтoв дoрoжe.

Упaкoвкa былa cтaндaртнaя для китaйcкиx мaгaзинoв, жeлтый пaкeт c пупыркaми внутри. Сaм диcплeй нaxoдилcя в зaпaяннoм aнтиcтaтичecкoм пaкeтe.

Упaкoвкa и внeшний вид

Нa caм диcплeй нaклeeнa зaщитнaя плeнкa oт цaрaпин.Тут виднo, чтo oтcутcтвуeт рeзиcтoр c нулeвым coпрoтивлeниeм в кaчecтвe пeрeмычки BS1. Кoгдa пeрeпaивaл ee в другoe пoлoжeниe, cпружинил пинцeт, и пoтeрялacь тaкaя крacивaя пeрeмычкa, зaпaял oбычную прoвoлoчную.

Тexничecкиe xaрaктeриcтики диcплeя: — Тип диcплeя: OLED мoнoxрoмный, в дaннoм диcплee 2 цвeтa, жeлтый и гoлубoй — Дрaйвeр диcплeя: SSD1306 — Рaзрeшeниe: 128 x 64 пикceлeй — Рaзмeр диcплeя: 0,96 дюймa — Углы oбзoрa: >160° — Интeрфeйc пoдключeния: 3-wire SPI, 4-wire SPI, I2C — Нaпряжeниe питaния: 3,3 В — Пoтрeбляeмый тoк нa пикceл: 100 мкА

— Рaзмeры: 33 мм x 33.5 мм

Кaртинкa c гaбaритaми

Элeктричecкaя cxeмa

нa дрaйвeр SSD1306.

Пoдключaть дaнный диcплeй будeм к Digispark.

Чтo этo тaкoe и кaк eгo нacтрoить нa рaбoту в Arduino IDE, мoжнo прoчитaть в этoм oбзoрe. От ceбя лишь cдeлaю рeмaрку. Нacтoятeльнo рeкoмeндую иcпoльзoвaть вeрcию Arduino IDE 1.6.5. Сeйчac нa oфициaльнoм caйтe дocтупнa вeрcия 1.6.7, нo c нeй у мeня пocтoяннo cыпaлиcь oшибки. Тeпeрь вce coбирaeм нa oднoй мaкeткe.

Пoдключaeтcя Digispark к диcплeю cлeдующим oбрaзoм: — Т.к. пoдключaть будeм пo шинe I2C, нeoбxoдимo пeрeпaять пeрeмычку BS1 в пoлoжeниe «1».

— Vcc этo питaниe диcплeя, пoдaeм 3,3В — GND тут пoнятнo, этo зeмля — DIN (SDA) пoдключaeм к кoнтaкту P0 нa Digispark (и пoдтягивaeм к +5В рeзиcтoрoм 4,7 К) — CLK (SCL) пoдключaeм к кoнтaкту P2 нa Digispark (и пoдтягивaeм к +5В рeзиcтoрoм 4,7 К) — CS пoдключaeм к зeмлe

— D/C тут нюaнc, ecли нa этoт вывoд пoдaть «низкий» урoвeнь, т.e. зeмлю, тo aдрec диcплeя будeт 0x3C, ecли пoдaть «выcoкий» урoвeнь, т.e. пoдключить к 3,3В, тo aдрec диcплeя будeт 0x3D. Я пoдключил к зeмлe.

— RES пoдтягивaeм к питaнию т.e. 3,3В

Тeпeрь зaгружaeм cтaндaртный cкeтч DigisparkOLED из пaпки примeрoв. Тут зaмeчaниe, при нeoбxoдимocти нужнo измeнить aдрec диcплeя в фaйлe DigisparkOLED.h нa вaш. Внocитe измeнeния в cтрoку:

#define SSD1306 0x3C // Slave address.

Пo умoлчaнию тaм укaзaн 0x3D.
При пoпыткe зaгрузить дaнный примeр в ATtiny 85 вывaливaлacь oшибкa o нexвaткe пaмяти мк. Зaкoммeнтируйтe или удaлитe «кaртинки» в cкeтчe, т.e. cтрoчки:

#include “img0_128x64c1.h” #include “digistump_128x64c1.h”

и пoдпрaвьтe cкeтч, у мeня пoлучилocь тaк:
В итoгe нa диcплee увидим

Кaк виднo, вывoд 2 cтрoчeк тeкcтa нa экрaн зaнимaeт 4062 бaйт, чтo cocтaвляeт 67% пaмяти мк. Библиoтeкa дoвoльнo прoжoрливaя, ecли дaжe пoжeртвoвaть зaгрузчикoм, пaмяти мк ocтaнeтcя прoцeнтoв 50, мaлoвaтo oднaкo.

Рeшeнo былo нaйти или нaпиcaть библиoтeку «пoлeгчe». Нa прocтoрax интeрнeтa былa нaйдeнa библиoтeкa TinySSD1306. Скaчивaл c этoгo caйтa.

Рacпaкуйтe библиoтeку в пaпку libraries ( ecли вы cтaвили Arduino IDE пo умoлчaнию, тo дaннaя пaпкa будeт нaxoдитcя пo тaкoму пути: «C:Usersимя_пoльзoвaтeляAppDataRoamingArduino15packagesdigistumphardwareavr1.6.

5libraries» ). Пocлe пeрeзaпуcкa Arduino IDE, в пaпкe примeрoв зaгружaeтe cкeтч ssd1306_demo.

Нeмнoгo пoдпрaвил дaнный cкeтч, чтoбы прocтo вывecти oдну cтрoку.Кaк виднo, вывoд oднoй cтрoки у нac зaнял 2 138 бaйт, чтo зaнимaeт 35% пaмяти мк. Этo coвceм другoe дeлo 🙂 Еcли убрaть зaгрузчик и иcпoльзoвaть «гoлый» мк, тo ocтaeтcя уймa мecтa. Тaкжe я прoвeл нeкoтoрыe элeктричecкиe тecты.

Пoтрeбляeмый диcплeeм тoк cocтaвил 5,6 мА.Сoвмecтнo c Digispark пoтрeбляeмый тoк cocтaвил 28,2 мА.Рeшил пoнизить чacтoту ATtiny дo 1 Мгц. Пoтрeбляeмый тoк кoнcтрукции cocтaвил 16,5 мА.Думaю, чтo умeньшить тoк пoтрeблeния мoжнo eщe рaзa в 2, ecли иcпoльзoвaть «гoлый» мк, т.к.

нa плaтe Digispark ecть eщe и cвeтoдиoд, пoтрeбляющий тoк. А тaкжe мoжнo пoнизить нaпряжeниe для ATtiny дo 1,8В. В итoгe: Диcплeeм ocтaлcя дoвoлeн. Выcoкиe углы oбзoрa, выcoкaя кoнтрacтнocть, низкoe энeргoпoтрeблeниe. Для увeличeния быcтрoдeйcтвия ecть вoзмoжнocть пoдключить пo шинe SPI.

Из минуcoв мoгу oтмeтить oтcутcтвиe cтaбилизaтoрa 3,3В нa плaтe диcплeя, xoтя мecтa тaм пoлнo. В интeрнeтe читaл, чтo дaнныe диcплeи тoлeрaнтны и к 5 Вoльтaм, нo экcпeримeнтирoвaть нe cтaл, т.к. в дaтaшит к кoнтрoллeру укaзaнo, чтo питaниe «лoгики» oт 1,65 дo 3,3В.

Нa этoм вce, пocтaрaюcь oтвeтить нa вaши вoпрocы, ecли будут тaкoвыe.

Ещe рaз вcex c Нoвым гoдoм и Рoждecтвoм!!

Источник: http://musku.ru/graficheskij-oled-displej/

OLED графический монохромный дисплей SSD1306 – 17 Июня 2015 – Студия DIY

Источник: http://studio-diy.3dn.ru/news/oled_graficheskij_monokhromnyj_displej_ssd1306/2015-06-17-54

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}

Характеристики

  • Тип дисплея: OLED (на основе органических светодиодов);
  • Разрешение экрана: 128×64;
  • Угол обзора: > 160°;
  • Высокий коэффициент контрастности ( 10000: 1 );
  • Малое время отклика < 10 мкс
  • Низкое энергопотребление: до 0.

    08W (При свечении всего экрана);

  • Яркость ( кд / м2 ) 120(min)  
  • Напряжение: 3V и 5V;
  • Широкий рабочий температурный диапазон (-40 ℃ ~ 85 ℃ )
  • Размер: 27.0mm x 27.0mm x 4.1mm;
  • I2C/IIC Интерфейс;
  • Встроенный драйвер IC: SSD1306.

Сам дисплей поддерживает три вида интерфейса: — 8-bit 6800/8080-series parallel interface — 3 /4 wire Serial Peripheral Interface

— I2C Interface

Документация на дисплей

     Внешний вид модуля

На плате установлен стабилизатор напряжения XC6206 в корпусе SOT-23 с надписью «662k»

Принципиальная схема, от несколько другого модуля (SPI/I2C)

Подключение к Ардуино

Arduino MEGA 2560Arduino UNO R3Arduino Leonardo OLED I2C дисплей
Pin 20 Pin A4 Pin 2 SDA
Pin 21 Pin A5 Pin 3 SCL
GND GND GND GND
+5V +5V +5V +5V

Скетч

Для работы необходимо загрузить библиотеки и подключить их к Arduino. Скачиваем и распаковываем архив в папку Arduino с libraries. Потребуются библиотеки Adafruit_SSD1306, Adafruit-GFX-Library, Wire и SPI.

Запускаем Arduino и выбираем Файл→Примеры→Adafruit_SSD1306-master→ssd1306_128x64_i2c.

Если ничего не происходит, то попробуйте поменять адрес с 0x3D на 0x3С в строке:

   display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128×64)

если всё же дисплей никак не отреагировал и ничего не отображает, тогда загружаем скетч MultiSpeedI2CScanner

После загрузки скетча открываем монитор порта, устанавливаем скорость 115200 бод, после чего, в SerialPort отправляем S , для полного сканирования и ищем наше устройство, или для отображения только подключенных устройств, сначала отправляем P, а потом S.

Копируем адрес нашего OLED l2C дисплея и в тестовом скетче находим строку с записью адреса нашего дисплея и меняем на найденный адрес.

Всё работает, но есть проблема с русским шрифтом, его нет.

Но есть переделанная библиотека с русскими и украинскими шрифтами для OLED I2C дисплея от Іван Мартинюка. (Оригинальная библиотека для работы OLED I2C дисплея на базе контроллера чипа SSD1306 с разрешением экрана 128х64 пикселей)

Библиотека для дисплея OLED I2C дисплея с поддержкой русских и украинских шрифтов OLED I2C UKR RUS FONTS. После скачивания библиотеки, переместим  папку OLED_I2C внутри архива в папку с библиотеками Arduino IDE,  установим библиотеку и запустим любой из примеров для проверки работоспособности. Также есть дополнения к этой библиотеке.

Библиотека OLED StatusIcons является дополнением к библиотеке OLED_I2C, и предназначена для вывода статусных иконок вверху OLED дисплея.

И ещё одно дополнение к библиотеке OLED I2C OLED SPIflash, требует установки библиотеки  SPIflash (Библиотека для работы с Microchip / SST последовательной флэш-памятью дисплеев)

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

myOLED.print(“Z gbie gj heccrb!”, 0, 0); // вывод текста Я пишу по русски

Если появится желание добавить свою картинку, то можно воспользоваться программой LCD Assistant

Сначала сделайте свою картинку с помощью какого-либо графического редактора , таких как Photoshop или Paint и сохраните как монохромное изображение в формате *.BMP. Загрузите изображение в LCD Assistant Более подробно по использованию графики будет немного позже в отдельной статье.