Графический 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
Урок 9. Русский язык на OLED дисплее 128X64
ВИДЕО редактируется.
Вы могли наблюдать, что в предыдущих уроках №7 и №8 уже использовался Русский шрифт. В этом уроке мы разберём некоторые проблемные моменты с которыми можно столкнуться при выводе Русских букв на OLED дисплей.
Нам понадобится:
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_OLED_txt (текстовая) – для вывода текста и цифр на OLED дисплеи.
- Дополнительно можно установить библиотеку iarduino_OLED (графическая), но в данном уроке она использоваться не будет.Графическая библиотека поддерживает все функции текстовой и имеет дополнительные функции для работы с изображениями и графикой, но при этом она занимает больше памяти, как оперативной, так и памяти программ.
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki – Установка библиотек в Arduino IDE.
Схема подключения:
OLED дисплей подключается к аппаратной или программной шине I2C Arduino.
ВыводНазначениеOLED дисплейArduino UNOSCL | Линия тактирования шины I2C | SCL | A5 |
SDA | Линия данных шины I2C | SDA | A4 |
Vcc | Питание (3,3 или 5 В) | Vcc | 5V |
GND | Общий | GND | GND |
Схема установки дисплея при его подключении через Trema Set Shield.
Код программы:
#include // Подключаем библиотеку iarduino_OLED_txt.
iarduino_OLED_txt myOLED(0x78); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x78 (если учитывать бит RW=0). //
extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. //
void setup(){ // myOLED.begin(); // Инициируем работу с дисплеем. myOLED.
setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста.
// myOLED.setCoding(TXT_UTF8); // Указываем кодировку текста в скетче. Если на дисплее не отображается Русский алфавит, то …
} // раскомментируйте функцию setCoding и замените параметр TXT_UTF8, на TXT_CP866 или TXT_WIN1251.
//
void loop(){ // myOLED.clrScr(); // Чистим экран. myOLED.print( “Большие буквы:” , 0, 0); // Выводим текст начиная с 0 столбца 0 строки. myOLED.print( “ABCDEFGHIJKLM” , OLED_C, 2); // Выводим текст по центру 2 строки. myOLED.print( “NOPQRSTUVWXYZ” , OLED_C, 3); // Выводим текст по центру 3 строки. myOLED.
print( “АБВГДЕЁЖЗИЙКЛМНОП” , OLED_C, 5); // Выводим текст по центру 5 строки. myOLED.print( “РСТУФХЦЧШЩЪЫЬЭЮЯ” , OLED_C, 6); // Выводим текст по центру 6 строки. delay(3000); // Ждём 3 секунды. // myOLED.clrScr(); // Чистим экран. myOLED.print( “Маленькие буквы:” , 0, 0); // Выводим текст начиная с 0 столбца 0 строки. myOLED.
print( “abcdefghijklm” , OLED_C, 2); // Выводим текст по центру 2 строки. myOLED.print( “nopqrstuvwxyz” , OLED_C, 3); // Выводим текст по центру 3 строки. myOLED.print( “абвгдеёжзийклмноп” , OLED_C, 5); // Выводим текст по центру 5 строки. myOLED.print( “рстуфхцчшщъыьэюя” , OLED_C, 6); // Выводим текст по центру 6 строки.
delay(3000); // Ждём 3 секунды. // myOLED.clrScr(); // Чистим экран. myOLED.print( “Символы:” , 0, 0); // Выводим текст начиная с 0 столбца 0 строки. myOLED.print( “{}[]()?!#$%&*” , OLED_C, 3); // Выводим текст по центру 3 строки. myOLED.print( “~`'”^_-+=,.:;|/” , OLED_C, 5); // Выводим текст по центру 5 строки.
delay(3000); // Ждём 3 секунды. // myOLED.clrScr(); // Чистим экран. myOLED.print( “Цифры:” , 0, 0); // Выводим текст начиная с 0 столбца 0 строки. myOLED.print( “1234567890” , 6, 2); // Выводим текст начиная с 6 столбца 2 строки. myOLED.print( 1234567890 , 6, 3); // Выводим число начиная с 6 столбца 3 строки. myOLED.
print(-1234567890 , 0, 4); // Выводим число начиная с 0 столбца 4 строки. myOLED.print( 12345.7890 , 6, 5); // Выводим число начиная с 6 столбца 5 строки. delay(3000); // Ждём 3 секунды.
} //
Алгоритм работы программы:
В коде setup() происходит инициализация дисплея (подготовка дисплея к работе) и подключение шрифта «SmallFontRus» (в библиотеке имеется несколько предустановленных шрифтов, которые подключаются перед использованием). Со списком шрифтов и описанием всех функций библиотек iarduino_OLED и iarduino_OLED_txt, можно ознакомиться в разделе Wiki – OLED экран 128×64 / 0,96”.
Код loop() разбит на 4 части. Каждая часть начинается с очистки экрана функцией clrScr(), после чего следуют несколько функций print() для вывода текста или чисел на экран дисплея. Все части выполняются друг за другом с 3 секундной задержкой выполняемой функциями delay().
В результате на дисплее поочерёдно будут появляться: большие буквы (включая Русские), маленькие буквы (включая Русские), символы и цифры.
Проблемы при выводе Русских букв:
Кодировка:
Первая и основная проблема это кодировка в которой скетч передаётся компилятору. Разные версии Arduino IDE хранят скетч в различных кодировках. Даже последняя версия Arduino IDE 1.8.
5 (на момент написания данного урока) для ОС Windows, передаёт компилятору скетч в кодировке UTF-8 (если скетч был сохранён в файл *.ino) или в кодировке Windows-1251 (если скетч не был сохранён).
Но ни скетч, ни библиотеки используемые в нём, не знают в какой кодировке они будут переданы компилятору. Вот и получается что один и тот же скетч, оперируя Русскими буквами, может работать по разному.
Примечание:
Что такое кодировка?
Компьютер, как и контроллер (в т.ч. Arduino) хранит, получает и передаёт данные в виде 1 и 0. Из набора 1 и 0 можно точно составить числа, но нельзя однозначно составить буквы.
Кодировка это представление букв числами (по их порядковому номеру), которыми уже может оперировать компьютер или контроллер. Например, «А» – 1, «Б» – 2, «В» – 3 и т.д., тогда слово «ПРИВЕТ» можно передать, принять или сохранить, как набор чисел: 17,18,10,3,6,20.
Так как буквы можно располагать по разному (сначала символы или числа, или буквы другого языка и т.д.), то и порядковые номера (числа) у букв будут разные, вот и получилось, что придумано множество кодировок.
Исторически сложилось что Латинские буквы имеют одинаковые порядковые номера в большинстве кодировок: «A»…«Z» = 65…90, «a»…«z» = 97…122, а Кириллические буквы не только имеют различные номера, но могут быть разбросаны, или вообще отсутствуют в кодировках.
Решение:
В библиотеках iarduino_OLED и iarduino_OLED_txt, мы предусмотрели функцию setCoding(), которая может принимать в качестве единственного аргумента, одно из значений: TXT_UTF8, TXT_CP866, TXT_WIN1251, определяющее текущую кодировку скетча.
Эта функция закомментирована в 3 строке кода setup программы данного урока. Если Русский текст на дисплее отображается некорректно, то раскомментируйте строку с функцией setCoding и замените параметр TXT_UTF8, на TXT_CP866 или TXT_WIN1251.
В большинстве случаев это решит проблему кодировок.
myOLED.setCoding(TXT_WIN1251); // Указываем что текст скетча представлен в кодировке Windows-1251.
Если функция setCoding() Вам не помогла, тогда вызовите функцию setCoding() с параметром false, а Русские буквы указывайте их кодом, как это показано в следующем разделе данного урока: «Недостаточно памяти».
При желании укажите в комментариях к уроку свою версию ОС, версию Arduino IDE и какую кодировку использует Ваша Arduino IDE (если Вы не знаете какую кодировку использует Arduino IDE, то напишите какие символы отображаются на дисплее вместо строчных и прописных Русских букв). Мы постараемся добавить Вашу кодировку в библиотеки.
Недостаточно оперативной памяти:
Вторая, но не менее важная проблема заключается в том, что строки занимают много оперативной памяти. Каждая буква строки занимает минимум 1 байт. Особенно актуальна эта проблема при создании различных пунктов меню.
Решение:
Наиболее эффективным решением данной проблемы является хранение строк не в области оперативной памяти, а в области памяти программ, так как объем памяти программ гораздо больше. Для этого указывайте строки в качестве аргумента функции F(). Строки указанные таким образом будут храниться в области памяти программ:
myOLED.print( F(“Строка для дисплея”) ); // Вывод строки на дисплей.
Serial.print( F(“Строка для монитора”) ); // Вывод строки в монитор последовательного порта.
Недостаточно оперативной памяти или памяти программ:
Если Вы работаете со строками на Русском языке в Arduino IDE, которая хранит скетч в кодировке UTF-8. Вы уже храните строки в области памяти программ (или оставили строки в области оперативной памяти). Вы все равно можете освободить до половины памяти занимаемой строками!
Дело в том, что в кодировке UTF-8 каждая Русская буква занимает целых 2 байта. Если указывать Русские символы кодом в той кодировке, где они занимают 1 байт, можно освободить половину памяти занимаемой строками, вне зависимости от того, в каком типе памяти они хранятся.
Символы в шрифтах для библиотек iarduino_OLED и iarduino_OLED_txt располагаются в соответствии с кодировкой CP866, значит хранить и выводить Ваши строки на экран дисплея можно в этой кодировке:
myOLED.setCoding(false); // Отменяем текущую кодировку, так как Русские буквы будем указывать кодом.
myOLED.print(“200340244343250255256 iArduino”); // Выводим текст “Ардуино iArduino”. Вместо Русских букв используем их код в кодировке CP866.
Примечание:
Как указывать символ или букву по его коду в строках скетчей?
Для начала нужно узнать коды всех символов той кодировки, в которой Вы желаете их указывать, таблицы символов различных кодировок можно найти в интернете. Для кодировки CP866, Русские символы имеют следующие коды:
А | 128200 | И | 136210 | Р | 144220 | Ш | 152230 | а | 160240 | и | 168250 | р | 224340 | ш | 232350 | Ё | 240360 |
Б | 129201 | Й | 137211 | С | 145221 | Щ | 153231 | б | 161241 | й | 169251 | с | 225341 | щ | 233351 | ё | 241361 |
В | 130202 | К | 138212 | Т | 146222 | Ъ | 154232 | в | 162242 | к | 170252 | т | 226342 | ъ | 234352 | 242362 | |
Г | 131203 | Л | 139213 | У | 147223 | Ы | 155233 | г | 163243 | л | 171253 | у | 227343 | ы | 235353 | 243363 | |
Д | 132204 | П | 140214 | Ф | 148224 | Ь | 156234 | д | 164244 | м | 172254 | ф | 228344 | ь | 236354 | 244364 | |
Е | 133205 | Н | 141215 | Х | 149225 | Э | 157235 | е | 165245 | н | 173255 | х | 229345 | э | 237355 | 245365 | |
Ж | 134206 | О | 142216 | Ц | 150226 | Ю | 158236 | ж | 166246 | о | 174256 | ц | 230346 | ю | 238356 | 246366 | |
З | 135207 | П | 143217 | Ч | 151227 | Я | 159237 | з | 167247 | п | 175257 | ч | 231347 | я | 239357 | 247367 |
Для вывода любого символа нужно указать его код в 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 – перевод чисел между системами счисления.
Ссылки:
Источник: https://lesson.iarduino.ru/page/urok-8-russkiy-yazyk-na-oled-displee-128×64/
Подключение OLED дисплея SSD1306 к Wemos D1 — DRIVE2
Сегодня мы научимся подключать популярный OLED дисплей на контроллере SSD1306 с разрешением 128×64 пикселей и диагональю 0.96 дюйма.
В продаже существует несколько вариантов таких дисплеев с возможностью подключения по шинам SPI и I2C. Я использую вариант с I2C, как наиболее простой.
Соединим дисплей с нашей платой Wemos D1 следующим способом: VCC -> 3V3, GND -> GND, SCL -> D1, SDA -> D2.
Настройка IDE и первое включение
Теперь необходимо добавить библиотеку для работы с этим дисплеем. В Arduino IDE открываем «Менеджер библиотек», «Скетч -> Подключить библиотеку -> Управлять библиотеками…».
Находим в списке библиотеку «ESP8266 Oled Driver for SSD1306 display» и устанавливаем её.
Давайте что ни будь нарисуем на нашем дисплее. Откройте пример SSD1306SimpleDemo из меню «Файл — Примеры — ESP8266 and ESP32 Oled Draver for SSD1306 display».
Найдите в коде строчку инициализации дисплея, впишите I2C пины к которым он подключён, в нашем случае это D2 и D1, и запустите пример.Если всё сделано правильно, то вы увидите примерно следующую картину.
Анимашка — ardulogic.ru/uploads/5921ea175b356.gif
Это конечно всё очень здорово, но мы же хотим выводить на экран свой текст и картинки.
Кастомные шрифт и изображения
Создайте новый проект и добавьте в него две вкладки font.h и image.h, как вы наверно уже догадались в них мы будем хранить изображение и шрифт.
Перейдите по ссылке oleddisplay.squix.ch/ и выберете какой-нибудь шрифт, у меня это будет Chewy, и нажмите кнопку «Create». Скопируйте код шрифта в файл font.h.
Теперь возьмите любую черно белою картинку размером меньше 128х64 пикселей, и загрузите её в конвертер www.online-utility.org/image/convert/to/XBM, в результате он создаст текстовый файл содержимое которого необходимо скопировать в файл image.h.
Основной код программы у нас будет таким:
//————————————-
#include “SSD1306.h”
#include “font.h” // Файл с шрифтом
#include “image.h” // Файл с картинкой
// Инициализируем дисплей подключенный к пинам D2 и D1
SSD1306 display(0x3c, D2, D1);
void setup() {// Первоначальные настройки дисплеяdisplay.init();display.flipScreenVertically();display.setFont(ArialMT_Plain_10);
}
void loop() {
// create more fonts at oleddisplay.squix.ch/display.clear(); // Очищаем экран от предыдущих данныхdisplay.setTextAlignment(TEXT_ALIGN_CENTER); // Выравниваем текст по центруdisplay.
setFont(Chewy_24); // Подключаем созданный нами шрифтdisplay.drawString(64, 8, “ARDULOGIC”); // Первая строка в координаты 64 по оси X и 8 по оси Ydisplay.drawString(64, 32, “2017”); // Вторая строкаdisplay.
display(); // Выводим все на экран
delay(2000);
// see blog.squix.org/2015/05/es…cu-how-to-create-xbm.htmldisplay.clear();display.drawXbm(26, 0, Volk_width, Volk_height, Volk_bits); // Рисуем нашу картинкуdisplay.display();
delay(2000);
display.clear();display.setTextAlignment(TEXT_ALIGN_CENTER);display.setFont(ArialMT_Plain_24); // Стандартный шрифт из библиотекиdisplay.drawString(64, 8, “GT-VOLK”);display.drawString(64, 32, “DRIVE2”);display.display();delay(2000);}
//————————————-
Запускаем скетч и любуемся результатом!
Анимашка — ardulogic.ru/uploads/5921eade8af9c.gif
Полный код скетча и оригинал статьи как всегда можно посмотреть у меня на сайте: ardulogic.ru/posts/podklu…spleya-ssd1306-k-wemos-d1
Источник: https://www.drive2.ru/b/473821892680090257/
OLED графический монохромный дисплей SSD1306 – 17 Июня 2015 – Студия DIY
Источник: http://studio-diy.3dn.ru/news/oled_graficheskij_monokhromnyj_displej_ssd1306/2015-06-17-54
Подключение OLED дисплея SSD1306 к Wemos D1
Сегодня мы научимся подключать популярный OLED дисплей на контроллере SSD1306 с разрешением 128×64 пикселей и диагональю 0.96 дюйма. В продаже существует несколько вариантов таких дисплеев с возможностью подключения по шинам SPI и I2C. Я использую вариант с I2C, как наиболее простой.
Соединим дисплей с нашей платой Wemos D1 следующим способом: VCC -> 3V3, GND -> GND, SCL -> D1, SDA -> D2.
Настройка IDE и первое включение
Теперь, необходимо добавить библиотеку для работы с этим дисплеем. В Arduino IDE открываем «Менеджер библиотек», «Скетч – Подключить библиотеку – Управлять библиотеками…».
Находим в списке библиотеку «ESP8266 Oled Driver for SSD1306 display» и устанавливаем её.
Давайте что-нибудь нарисуем на нашем дисплее. Откройте пример SSD1306SimpleDemo из меню «Файл – Примеры – ESP8266 and ESP32 Oled Draver for SSD1306 display».
Найдите в коде строчку инициализации дисплея, впишите I2C пины, к которым он подключён, в нашем случае это D2 и D1, и запустите пример.
Если всё сделано правильно, то вы увидите примерно следующую картину.
Это, конечно, всё очень здорово, но мы же хотим выводить на экран свой текст и картинки.
Кастомные шрифт и изображения
Создайте новый проект и добавьте в него две вкладки font.h и image.h, как вы наверно уже догадались, в них мы будем хранить изображение и шрифт.
Перейдите по ссылке http://oleddisplay.squix.ch/ и выберите какой-нибудь шрифт, у меня это будет Chewy, и нажмите кнопку «Create». Скопируйте код шрифта в файл font.h.
Теперь возьмите любую черно-белую картинку размером меньше 128х64 пикселей, и загрузите её в конвертер https://www.online-utility.org/image/convert/to/XBM, в результате он создаст текстовый файл, содержимое которого необходимо скопировать в файл image.h.
Основной код программы у нас будет таким:
#include “SSD1306.h” #include “font.h” // Файл с шрифтом #include “image.h” // Файл с картинкой // Инициализируем дисплей подключенный к пинам D2 и D1 SSD1306 display(0x3c, D2, D1); void setup() { // Первоначальные настройки дисплея display.init(); display.flipScreenVertically(); display.setFont(ArialMT_Plain_10); } void loop() { // create more fonts at http://oleddisplay.squix.ch/ display.clear(); // Очищаем экран от предыдущих данных display.setTextAlignment(TEXT_ALIGN_CENTER); // Выравниваем текст по центру display.setFont(Chewy_24); // Подключаем созданный нами шрифт display.drawString(64, 8, “ARDULOGIC”); // Первая строка в координаты 64 по оси X и 8 по оси Y display.drawString(64, 32, “2017”); // Вторая строка display.display(); // Выводим все на экран delay(2000); // see http://blog.squix.org/2015/05/esp8266-nodemcu-how-to-create-xbm.html display.clear(); display.drawXbm(26, 0, Volk_width, Volk_height, Volk_bits); // Рисуем нашу картинку display.display(); delay(2000); display.clear(); display.setTextAlignment(TEXT_ALIGN_CENTER); display.setFont(ArialMT_Plain_24); // Стандартный шрифт из библиотеки display.drawString(64, 8, “GT-VOLK”); display.drawString(64, 32, “DRIVE2”); display.display(); delay(2000); }
Запускаем скетч и любуемся результатом!
Скачать полную версию скетча: SSD1306Hello.zip
Источник: http://ardulogic.ru/posts/podkluchenie-oled-displeya-ssd1306-k-wemos-d1
Самый «плохой» Arduino дисплей OLED LCD Display I2C 0.96 IIC Serial 128X64
Adatum
Почитав отзывы и посмотрев обзоры я решил заказать самый «лучший» дисплей i2c. Я конечно понимал что он маленький но не настолько, просто крохотный и информацию на нём можно рассмотрев только с очень хорошим зрением. По сути я не представляю где его можно использовать.
Возможно в проекте наручных часов? При его цене в среднем 350 руб можно купить гораздо более достойные варианты. И под конец я его раздавил просто сжав пальцами, как оказалось он достаточно хрупкий (.
Немного модифицированная мной библиотека для этого дисплейчика OLED_I2C_UKR_RUS Библиотека взято от сюда http://arduino-project.net/russkie-ukrainskie-shrifty-oled-i2c/.
Удалён украинский а в русском вместо символа ^ добавлен : так как в русском языке не было символа двоеточия и каждый раз когда нудно двоеточие менять шрифт было неохота.
В общем я разочарован данным дисплеем и его единственным достоинством считаю шину i2c и то сомнительно ведь их можно подключить к arduino не более 2 штук. Хотя думаю для каких то проектов он и будет идеален.
Пример:
#include OLED myOLED(SDA, SCL, 8); extern uint8_t RusFont[]; extern uint8_t SmallFont[]; void setup() { myOLED.begin(); } void loop() { myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(“18:55:55”, 0, 0); myOLED.print(“15-05-2015”, 66, 0); myOLED.drawLine(0, 8, 128, 8); myOLED.drawLine(63, 8, 63, 64); myOLED.print(“* Cgfkmyz”, 0, 12); myOLED.print(” Ufhlthj,”, 0, 22); myOLED.print(“* Ufhf;”, 0, 32); myOLED.print(” Pfk”, 0, 42); myOLED.print(” Dfyyf”, 0, 52); myOLED.print(“* Ltncrfz”, 66, 12); myOLED.print(“* Rjntkmyfz”, 66, 22); myOLED.print(” Eukzhrf”, 66, 32); myOLED.print(” Cfeyf”, 66, 42); myOLED.print(“* Nefktn”, 66, 52); myOLED.update(); delay(1000); myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(“Gjvtotybt”, 0, 0); myOLED.print(“Ntvg”, 57, 0); myOLED.print(“Dkf;”, 83, 0); myOLED.print(“Jcd”, 110, 0); myOLED.drawLine(0, 9, 128, 9); myOLED.drawLine(55, 0, 55, 64); myOLED.drawLine(82, 0, 82, 64); myOLED.drawLine(109, 0, 109, 64); myOLED.print(“Cgfkmyz”, 0, 12); myOLED.print(“Ufhlthj,”, 0, 22); myOLED.print(“Ufhf;”, 0, 32); myOLED.print(“Pfk”, 0, 42); myOLED.print(“Dfyyf”, 0, 52); myOLED.print(“55”, 60, 12); myOLED.print(“-30”, 60, 22); myOLED.print(“170”, 60, 32); myOLED.print(“12”, 60, 42); myOLED.print(“-10”, 60, 52); myOLED.print(“55”, 89, 12); myOLED.print(“30”, 89, 22); myOLED.print(“99”, 89, 32); myOLED.print(“12”, 89, 42); myOLED.print(“70”, 89, 52); myOLED.print(“*”, 116, 12); myOLED.print(“”, 116, 22); myOLED.print(“”, 116, 32); myOLED.print(“*”, 116, 42); myOLED.print(“*”, 116, 52); myOLED.update(); delay(1000); myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.drawLine(68, 20, 68, 64); myOLED.print(“Yfghz;tybt”, 0, 0); myOLED.print(“213”, 70, 0); myOLED.print(“Djkmn”, 92, 0); myOLED.print(“Gjnht,ktybt”, 0, 10); myOLED.print(“10”, 70, 10); myOLED.print(“Rdfnn”, 92, 10); myOLED.drawLine(0, 19, 128, 19); myOLED.setFont(SmallFont); myOLED.print(“I1 50”, 0, 22); myOLED.print(“I2”, 0, 30); myOLED.print(“I3 25”, 0, 38); myOLED.print(“I4”, 0, 42); myOLED.print(“I5”, 0, 50); myOLED.print(“I6 50”, 70, 22); myOLED.print(“I7”, 70, 30); myOLED.print(“I8 25”, 70, 38); myOLED.print(“I9”, 70, 42); myOLED.print(“I10 90”, 70, 50); myOLED.update(); delay(500); myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(“18:55:55”, 0, 0); myOLED.print(“15-05-2015”, 66, 0); myOLED.drawLine(0, 9, 128, 9); myOLED.drawLine(75, 9, 75, 64); myOLED.print(“Lfdktybt”, 0, 12); myOLED.print(“Ntvgthfnehf”, 0, 23); myOLED.print(“Dkf;yjcnm”, 0, 34); myOLED.print(“Rjvajhnyjcnm”, 0, 45); myOLED.print(“Jcdto`yyjcnm”, 0, 56); myOLED.print(“733 Gf”, 77, 12); myOLED.print(“27 C”, 77, 23); myOLED.print(“60 %”, 77, 34); myOLED.print(“22 %”, 77, 45); myOLED.print(“80 %”, 77, 56); myOLED.update(); delay(5000); }
Источник: http://adatum.ru/samyj-plohoj-arduino-displej-oled-lcd-display-i2c-0-96-iic-serial-128×64.html
Подключение oled дисплея с контроллером SSD1306 к STM32 по I2C
Многие, наверное, знают о таких маленьких дешёвых (меньше $3) OLED дисплеях, которые можно найти в огромном ассортименте на ebay или aliexpress.
В интернете существует множество различных статей о том, как подключать эти дисплеи к Arduino и другим МК, но для STM32f10x затруднительно найти даже библиотеку. Поэтому я решил написать эту статью.
Данный дисплей имеет разрешение 128х64 пиксела и контроллер SSD1306 и подклчается к микроконтроллеру по интерфейсу I2C.
Для STM32 была найдена библиотека для этого дисплея, но она была для серии f4xx — необходимо было модифицировать для f10x.
Исходные файлы модифицированной мной библиотеки можно взять тут.
Характеристики
Сам дисплей поддерживает три вида интерфейса: — 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 дисплей
СкетчДля работы необходимо загрузить библиотеки и подключить их к 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
Копируем адрес нашего OLED l2C дисплея и в тестовом скетче находим строку с записью адреса нашего дисплея и меняем на найденный адрес. Всё работает, но есть проблема с русским шрифтом, его нет. Но есть переделанная библиотека с русскими и украинскими шрифтами для OLED I2C дисплея от Іван Мартинюка. (Оригинальная библиотека для работы OLED I2C дисплея на базе контроллера чипа SSD1306 с разрешением экрана 128х64 пикселей) Библиотека для дисплея OLED I2C дисплея с поддержкой русских и украинских шрифтов OLED I2C UKR RUS FONTS. После скачивания библиотеки, переместим папку OLED_I2C внутри архива в папку с библиотеками Arduino IDE, установим библиотеку и запустим любой из примеров для проверки работоспособности. Также есть дополнения к этой библиотеке.
И ещё одно дополнение к библиотеке OLED I2C OLED SPIflash, требует установки библиотеки SPIflash (Библиотека для работы с Microchip / SST последовательной флэш-памятью дисплеев) Есть особенности при наборе русского или украинского текста. В строке которая будет отвечать за вывод текста после кавычек, набираем текст русскими символами при английской раскладке клавиатуры на компьютере myOLED.print(“Z gbie gj heccrb!”, 0, 0); // вывод текста Я пишу по русски Если появится желание добавить свою картинку, то можно воспользоваться программой LCD Assistant
|
|||||||||||||||||
ssd1306_i2c.cssd1306_i2c.h | Интерфейс для работы с I2C | ||||||||||||||||
ssd1306.cssd1306.h | Библиотека для работы с дисплеем. Представляет методы для рисования на дисплее, вывода текста, и вывода всего на oled. | ||||||||||||||||
fonts.cfonts.h | Шрифты для вывода текста на экран. Там есть три шрифта, но можно создать любой свой при помощи этой программы или аналогов |
Схема подключения предельно проста:
Vcc | +3.3V. Допустимое напряжение — от 3.3В до 5В |
GND | GND |
SCL | PB6 |
SDA | PB7 |
Для работы с библиотекой нужно подключить заголовочный файл:#include “ssd1306.h”
И перед использованием инициализировать:SSD1306_Init();
Теперь можно что-нибудь нарисовать:SSD1306_GotoXY(0, 44); //Устанавливаем курсор в позицию 0;44. Сначала по горизонтали, потом вертикали.
SSD1306_Puts(“Hello, habrahabr!!”, &Font_7x10, SSD1306_COLOR_WHITE); //пишем надпись в выставленной позиции шрифтом “Font_7x10” белым цветом. SSD1306_DrawCircle(10, 33, 7, SSD1306_COLOR_WHITE); //рисуем белую окружность в позиции 10;33 и радиусом 7 пикселей
Всё, что мы нарисовали сейчас находится в буффере в оперативной памяти МК, чтобы вывести всё на дисплей необходимо вызвать:SSD1306_UpdateScreen();
После этого наш дисплей обновится и будет выводить надпись и кружок. После вызова SSD1306_UpdateScreen() буффер в МК не сбрасывается сам, поэтому новые рисунки будут поверх предыдущих, для сброса можно заполнить всё чёрным цветом:SSD1306_Fill(SSD1306_COLOR_BLACK);
Все функции библиотеки:uint8_t SSD1306_Init(); //Инициализация SSD1306_UpdateScreen(); //Посылаем данные из буффера в памяти дисплею SSD1306_ToggleInvert(); //инвертирует цвета изображения в оперативной памяти SSD1306_Fill(SSD1306_COLOR_t Color); //заполняем дисплей желаемым цветом SSD1306_DrawPixel(uint16_t x, uint16_t y, SSD1306_COLOR_t color); //нарисовать один пиксел SSD1306_GotoXY(uint16_t x, uint16_t y); //установить позицию текстового курсора SSD1306_Putc(char ch, FontDef_t* Font, SSD1306_COLOR_t color); //вывести символ сh в позиции курсора SSD1306_Puts(char* str, FontDef_t* Font, SSD1306_COLOR_t color); //вывести строку str в позиции курсора SSD1306_DrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, SSD1306_COLOR_t c); //нарисовать линию SSD1306_DrawRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, SSD1306_COLOR_t c); //наррисовать прямоугольник SSD1306_DrawFilledRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, SSD1306_COLOR_t c); //заполненный прямоугольник SSD1306_DrawTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, SSD1306_COLOR_t color); //треугольник SSD1306_DrawCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR_t c); //круг радиуса r SSD1306_DrawFilledCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR_t c); //заполненный круг
Доступные шрифты, но вы так же можете добавить свои, в том числе и русские:
- Font_7x10
- Font_11x18
- Font_16x26
Дисплей работает довольно быстро(FPS около 14-18) на скорости I2C 400кГц(450 тоже без проблем, но рисковать не стал, а на 500 подтормаживает) и без проблем.
Использовал CooCox IDE. Готовый проект можно скачать тут: Яндекс.Диск.
P.S. с момента написания статьи и до её публикации из песочницы прошло довольно много времени(6 месяцев), за которое я успел несколько раз изменить библиотеку.
Более новую версию библиотеки с поддержкой DMA и тестовый проект для Keil и cubeMx можно взять здесь. Самую последнюю версию библиотеки вы найдёте тут.
Пример работы библиотеки:
С удовольствием отвечу на ваши вопросы! Удачи!
Источник: https://habr.com/post/313490/
Обзор 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/