Как подключить экранчик к ардуино
Текстовый экран 16×2: инструкция по подключению и примеры использования
Текстовый экран 16×2 пригодится для вывода показаний датчиков, отображения простых меню, подсказок и приветствий.
Видеообзор
Примеры работы для Arduino
В качестве примера подключим дисплей к управляющей плате Arduino Uno.
Подключение к Arduino
| Вывод | Обозначение | Пин Arduino Uno |
|---|---|---|
| 1 | GND | GND |
| 2 | VCC | 5V |
| 3 | VO | GND |
| 4 | RS | 11 |
| 5 | R/W | GND |
| 6 | E | 12 |
| 7 | DB0 | — |
| 8 | DB1 | — |
| 9 | DB2 | — |
| 10 | DB3 | — |
| 11 | DB4 | 5 |
| 12 | DB5 | 4 |
| 13 | DB6 | 3 |
| 14 | DB7 | 2 |
| 15 | VCC | 5V |
| 16 | GND | GND |
Для упрощения работы с LCD-дисплеем используйте встроенную библиотеку Liquid Crystal. В ней вы найдёте примеры кода с подробными комментариями.
Вывод текста
Для вывода первой программы приветствия, воспользуйтесь кодом вроде этого:
Кириллица
Существует два способа вывода кириллицы на текстовые дисплеи:
Рассмотрим оба способа более подробно.
Таблица знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора, которые состоят из различных символов и букв.
Для вывода символа на дисплей необходимо передать его номер в шестнадцатеричной системе из таблицы знакогенератора.
Так букве Я соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:
Сравните две строки кода для вывода надписи «Яeee»:
Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:
Переключение страниц знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора. По умолчанию установлена нулевая страница. Для переключения между страницами используйте методы:
Дисплей не может одновременно отображать символы разных страниц.
Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.

Использование библиотеки LiquidCrystalRus
Совсем не обязательно мучатся со знакогенератором, чтобы вывести русский символ. Для решения проблемы скачайте и установите библиотеку LiquidCrystalRus.
Это копия оригинальной библиотеки LiquidCrystal с добавлением русского языка. Добавленный в библиотеку код трансформирует русские символы UTF8 в правильные коды для текстового экрана.
В качестве примера выведем фразу «Привет от Амперки» на дисплей.
Примеры работы для Espruino
В качестве примера подключим дисплей к управляющей плате Iskra JS.
Подключение к Iskra JS
| Вывод | Обозначение | Пин Iskra JS |
|---|---|---|
| 1 | GND | GND |
| 2 | VCC | 5V |
| 3 | VO | GND |
| 4 | RS | P11 |
| 5 | R/W | GND |
| 6 | E | P12 |
| 7 | DB0 | — |
| 8 | DB1 | — |
| 9 | DB2 | — |
| 10 | DB3 | — |
| 11 | DB4 | P5 |
| 12 | DB5 | P4 |
| 13 | DB6 | P3 |
| 14 | DB7 | P2 |
| 15 | VCC | 5V |
| 16 | GND | GND |
Для работы с LCD-дисплеем из среды Espruino существует библиотека HD44780.
Вывод текста
Для вывода программы приветствия, воспользуйтесь скриптом:
Кирилица
Вывод кирилицы на дисплей с помощью платформы Iskra JS доступен через встроенную в дисплей таблицу знакогенератора.
Таблица знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора, которые состоят из различных символов и букв.
Для вывода символа на дисплей необходимо передать его номер в шестнадцатеричной системе из таблицы знакогенератора.
Так букве Я соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:
Сравните две строки кода для вывода надписи «Яeee»:
Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:
Переключение страниц знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора. По умолчанию установлена нулевая страница. Для переключения между страницами используйте методы:
Дисплей не может одновременно отображать символы разных страниц.
Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.

Комнатный термометр
Дисплей удобен для отображения показаний модулей и сенсоров. Сделаем задатки «Умного Дома», а именно «комнатный термометр».
Текстовый экран 8×2: инструкция по подключению и примеры использования
Текстовый дисплей 8×2 пригодится для вывода показаний датчиков, отображения простых меню, подсказок и приветствий.
Видеообзор
Примеры работы для Arduino
В качестве примера подключим дисплей к управляющей плате Arduino Uno.
Подключение к Arduino
| Вывод | Обозначение | Пин Arduino Uno |
|---|---|---|
| 1 | GND | GND |
| 2 | VCC | 5V |
| 3 | VO | GND |
| 4 | RS | 12 |
| 5 | R/W | GND |
| 6 | E | 11 |
| 7 | DB0 | — |
| 8 | DB1 | — |
| 9 | DB2 | — |
| 10 | DB3 | — |
| 11 | DB4 | 5 |
| 12 | DB5 | 4 |
| 13 | DB6 | 3 |
| 14 | DB7 | 2 |
Для упрощения работы с LCD-дисплеем используйте встроенную библиотеку Liquid Crystal. В ней вы найдёте примеры кода с подробными комментариями.
Вывод текста
Для вывода первой программы приветствия, воспользуйтесь кодом вроде этого:
Кирилица
Существует два способа вывода кирилицы на текстовые дисплеи:
Рассмотрим оба способа более подробно.
Таблица знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора, которые состоят из различных символов и букв.
Для вывода символа на дисплей необходимо передать его номер в шестнадцатеричной системе из таблицы знакогенератора.
Так букве Я соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:
Сравните две строки кода для вывода надписи «Яeee»:
Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:
Переключение страниц знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора. По умолчанию установлена нулевая страница. Для переключения между страницами используйте методы:
Дисплей не может одновременно отображать символы разных страниц.
Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.

Использование библиотеки LiquidCrystalRus
Совсем не обязательно мучатся со знакогенератором, чтобы вывести русский символ. Для решения проблемы скачайте и установите библиотеку LiquidCrystalRus.
Это копия оригинальной библиотеки LiquidCrystal с добавлением русского языка. Добавленный в библиотеку код трансформирует русские символы UTF8 в правильные коды для текстового экрана.
В качестве примера выведем фразу «Привет, Амперка» на дисплей.
Примеры работы для Espruino
В качестве примера подключим дисплей к управляющей плате Iskra JS.
Подключение к Iskra JS
| Вывод | Обозначение | Пин Iskra JS |
|---|---|---|
| 1 | GND | GND |
| 2 | VCC | 5V |
| 3 | VO | GND |
| 4 | RS | P12 |
| 5 | R/W | GND |
| 6 | E | P11 |
| 7 | DB0 | — |
| 8 | DB1 | — |
| 9 | DB2 | — |
| 10 | DB3 | — |
| 11 | DB4 | P5 |
| 12 | DB5 | P4 |
| 13 | DB6 | P3 |
| 14 | DB7 | P2 |
Для работы с LCD-дисплеем из среды Espruino существует библиотека HD44780.
Вывод текста
Для вывода программы приветствия, воспользуйтесь скриптом:
Кирилица
Вывод кирилицы на дисплей с помощью платформы Iskra JS доступен через встроенную в дисплей таблицу знакогенератора.
Таблица знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора, которые состоят из различных символов и букв.
Для вывода символа на дисплей необходимо передать его номер в шестнадцатеричной системе из таблицы знакогенератора.
Так букве Я соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:
Сравните две строки кода для вывода надписи «Яeee»:
Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:
Переключение страниц знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора. По умолчанию установлена нулевая страница. Для переключения между страницами используйте методы:
Дисплей не может одновременно отображать символы разных страниц.
Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.

Комнатный термометр
Дисплей удобен для отображения показаний модулей и сенсоров. Сделаем задатки «Умного Дома», а именно «комнатный термометр».
Текстовый экран 16×2 / I²C: инструкция по подключению и примеры использования
Текстовый экран 16×2 / I²C пригодится для вывода показаний датчиков, отображения простых меню, подсказок и приветствий.
Видеообзор
Примеры работы для Arduino
В качестве примера подключим дисплей к управляющей плате Arduino Uno.
Подключение к Arduino
| Вывод | Обозначение | Пин Arduino Uno |
|---|---|---|
| 1 | GND | GND |
| 2 | VCC | 5V |
| 3 | VO | GND |
| 17 | SDA | SDA |
| 18 | SCL | SCL |
Для упрощения работы с LCD-дисплеем используйте встроенную библиотеку Библиотека для Arduino «Liquid Crystal I²C». В ней вы найдёте примеры кода с подробными комментариями.
Вывод текста
Для вывода первой программы приветствия, воспользуйтесь кодом вроде этого:
Кириллица
Существует способ вывода кириллицы на текстовые дисплеи с помощью таблицы знакогенератора.
Таблица знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора, которые состоят из различных символов и букв.
Для вывода символа на дисплей необходимо передать его номер в шестнадцатеричной системе из таблицы знакогенератора.
Так букве Я соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:
Сравните две строки кода для вывода надписи «Яeee»:
Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:
Переключение страниц знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора. По умолчанию установлена нулевая страница. Для переключения между страницами используйте методы:
Дисплей не может одновременно отображать символы разных страниц.
Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.
Подключение нескольких дисплеев
Используя шину I²C можно подключить несколько дисплеев одновременно, при этом количество занятых пинов останется прежним. Подробнее читайте в нашей документации.
Примеры работы для Espruino
В качестве примера подключим дисплей к управляющей плате Iskra JS.
Подключение к Iskra JS
| Вывод | Обозначение | Пин Iskra JS |
|---|---|---|
| 1 | GND | GND |
| 2 | VCC | 5V |
| 3 | VO | GND |
| 17 | SDA | SDA |
| 18 | SCL | SCL |
Для работы с LCD-дисплеем из среды Espruino существует библиотека HD44780.
Вывод текста
Для вывода программы приветствия, воспользуйтесь скриптом:
Кириллица
Вывод кирилицы на дисплей с помощью платформы Iskra JS доступен через встроенную в дисплей таблицу знакогенератора.
Таблица знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора, которые состоят из различных символов и букв.
Для вывода символа на дисплей необходимо передать его номер в шестнадцатеричной системе из таблицы знакогенератора.
Так букве Я соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:
Сравните две строки кода для вывода надписи «Яeee»:
Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:
Переключение страниц знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора. По умолчанию установлена нулевая страница. Для переключения между страницами используйте методы:
Дисплей не может одновременно отображать символы разных страниц.
Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.
Подключение нескольких дисплеев
Используя шину I²C можно подключить несколько дисплеев одновременно, при этом количество занятых пинов останется прежним. Подробнее читайте в нашей документации.
Комнатный термометр
Дисплей удобен для отображения показаний модулей и сенсоров. Сделаем задатки «Умного Дома», а именно «комнатный термометр».
Введение в работу с графическими экранами на Arduino
Введение в работу с графическими экранами на Arduino
Для создания интерфейсов на подобие:
В зависимости от библиотеки, разрешения экрана, что нужно выводить, как это реализовать и т.д., минимальные требования к ресурсам могут сильно отличаться. Т.к. это введение в работу с графическими экранами, рассматриваемое будет достаточно нетребовательно к ресурсам управляющего контроллера, что бы можно было реализовать на младших моделях Arduino (Uno, Nano и т.д.).
Библиотек, не требовательных к ресурсам микроконтроллера, очень много. Из наиболее популярных на данный момент можно упомянуть Adafruit_GFX, U8glib и U8g2. Эти библиотеки поддерживают множество очень популярных драйверов экрана, а реализованный функционал позволяет выводить текст, изображения и рисовать некоторые графические примитивы (точки, линии и т.д.).
Разработка U8glib уже несколько лет как прекращена, тем не менее эта библиотека активно используется в проектах. U8g2 это дальнейшее развитие библиотеки U8glib, в которой расширена поддержка экранов, переработан и расширен функционал. Библиотека от Adafruit интересна тем, что можно работать как с монохромными, так и с цветными экранами.
Драйверов экранов, экранов и модулей экранов также очень много. Они отличаются интерфейсами (I2С, SPI, параллельный и т.д.), количеством цветов, разрешением, габаритами, технологией экрана и т.д.
Изображение на монохромных жидкокристаллических экранах, как на фото выше (TN матрица), хорошо видно днём на улице. Что бы изображение было видно и при низком освещении, такие экраны дополнительно освещаются светодиодами, яркость которых обычно можно регулировать.
DFRobot 128×64 «белый на синем». Это тоже модуль с жидкокристаллическим экраном, но с более современной технологией матрицы (STN). Всё субъективно, но изображение выглядит красиво, хотя у таких экранов и не очень большие углы обзора. Выводимую информацию так же хорошо видно при разном освещении. Такие экраны очень популярны для создания панелей управления.
Модуль от другой фирмы, но сам экран и драйвер точно такой же. Creality далеко не единственный производитель 3D-принтеров, которые используют такие экраны.
E-ink экраны хорошо видно при ярком свете. На сколько быстро деградируют пиксели и какая максимальная частота обновления экрана, очень сильно зависит от качества. Такие экраны хорошо подходят, если от устройства требуется очень низкое энергопотребление. У E-Ink с этим всё просто отлично – немного энергии тратиться только когда происходит перерисовка. Питание можно вообще отключить, а изображение останется. Что бы это не стало проблемой, к примеру, когда микроконтроллер зависнет, на экране можно анимировать какой-либо графический элемент.
Цветные TFT экраны, используемые в модулях, которые можно подключать к микроконтроллерам, обычно могут отображать не более 264тыс цветов. Углы обзора более-менее неплохие. Изображение хорошо видно при низком освещении, но при очень ярком изображение может быть плохо видно или не видно совсем. Экраны бывают круглые, но в основном экран прямоугольный. На некоторых модулях есть слот для SD-карт, а поверх экрана может быть установлена резистивная плёнка для определения касаний.
Цветные IPS экраны близки по цветопередаче к OLED экранам, у них так же большой угол обзора и хорошая видимость при низком освещении. Пиксели на экране не деградируют, как у OLED, но есть и минус – хуже видно при ярком освещении.
Как происходит работа с экраном и возможности библиотек Adafruit и U8, очень близки. Рассматриваемые примеры хоть и будут для монохромного экрана, но из-за возможности работать и с цветными экранами, будет использоваться библиотека от Adafruit. Для рассмотрения будет использоваться Arduino Nano с подключенным по SPI монохромным OLED экраном. Примерно тоже самое можно реализовать с другой Arduino, экраном или библиотекой.
Схема подключения:
На плате модуля могут быть немного другие надписи. К примеру, MOSI могут подписать как DATA или SDA (на экранах, которые могут подключаться как по SPI, так и по I2C), а вместо CLK может быть надпись SCK. Если напряжение питания дисплея 3.3В, на плате может быть установлен линейный стабилизатор. На таких платах для подключения питания может быть, как один вывод, так и два (подписанные, допустим, как Vcc и 3V3).
Библиотеки
Для упрощения поиска часть библиотек можно отфильтровать, для этого в строке фильтра (обведено красным) нужно ввести частичное или полное название библиотеки:
Экран и координатная система
В массивах на Си, первый элемент имеет индекс 0. Так же и с координатами пикселей – первая точка имеет координаты (0, 0). Пиксель с координатами (0, 0) обычно находится в левом верхнем углу. Т.к. координаты начинаются не с (1,1), а с (0,0), для экрана с разрешением 128×64, координаты у правого нижнего пикселя будут (127, 63).
Для удобства работы, в библиотеке или в драйвере экрана может быть реализован функционал для управления ориентацией экрана или отражением изображения.
Альбомная ориентация экрана обозначена цифрами с 1 по 4, книжная ориентация с 5 по 8.
Изображение, отраженное по вертикали обозначено цифрой 3, а по горизонтали цифрой 2.
Перевёрнутый экран обозначен цифрой 4. Если нет управления ориентацией экрана, но есть управление отражением изображения, чтобы перевернуть экран, нужно сделать отражение и по горизонтали, и по вертикали.
Краткий обзор библиотек Adafruit_ GFX и Adafruit_ SSD1306
Для SSD1306 при вызове различных функций можно указывать три цвета – чёрный («выключить»), белый («включить») или инверсный. Что бы указать чёрный, используется число 0 или определённые директивой define идентификаторы BLACK или SSD1306_BLACK. Белый – это 1, WHITE или SSD1306_WHITE. Инверсия – это 2, INVERSE или SSD1306_INVERSE. Если выводить на экран, указав цвет INVERSE, то те пиксели на экране, которые были белыми, станут чёрными и наоборот.
Управление
void display(void);
При вызове некоторых функций, таких как рисования точек, геометрических фигур, изображений, вывода текста и т.д., изображение на экране сразу меняется, все данные записываются в буфер. Обновление данных на экране происходит после вызова функции display.
void clearDisplay(void);
Функция очистки буфера. Для всех пикселей в буфере устанавливается число 0 («чёрный», «выключено»).
void invertDisplay(boolean i);
Функция для включения или выключения режима инвертирования изображения на экране. При вызове с параметром true, включает режим инвертирования, а false выключает. Эта функция не меняет данные в буфере, она только настраивает режим работы SSD1306. После вызова этой функции, данные на экране меняются сразу, нет необходимости вызывать display.
void dim(boolean dim);
Включает (true) или выключает (false) режим пониженной яркости. Яркость меняется (не сильно) сразу.
void ssd1306_command(uint8_t c);
С помощью функции ssd1306_command можно отправлять команды драйверу SSD1306. В одном из примеров с помощью этой команды будет показано как выключить или включить экран.
void setRotation(uint8_t x);
Задаёт режим поворота экрана и при необходимости меняет местами значение высоты и ширины экрана. Параметр может принимать значения от 0 до 3, которые соответствуют повороту на 0, 90, 180 и 270 градусов. Настройки поворота учитываются функциями отрисовки (точек, линий и т.д.), т.е. данная функция не изменяет изображение на экране или содержимое буфера.
uint8_t getRotation(void);
Возвращает значение текущего режима поворота экрана.
Прокрутка
Функции прокрутки задействуют аппаратные возможности драйвера SSD1306. Изображение на экране начинает меняться автоматически. Содержимое буфера, используемого в библиотеке, не меняется. Драйвер экрана меняет содержимое внутреннего буфера и не восстанавливает его после отключения прокрутки или перед включением другого режима прокрутки.
Во избежание повреждения данных в буфере экрана, перед установкой одного из режимов прокрутки или вывода на экран, в даташите рекомендуется сначала отключить режим прокрутки.
void startscrollright(uint8_t start, uint8_t stop);
Прокрутка экрана вправо.
void startscrollleft(uint8_t start, uint8_t stop);
Прокрутка экрана влево.
void startscrolldiagright(uint8_t start, uint8_t stop);
Прокрутка экрана вверх и вправо.
void startscrolldiagleft(uint8_t start, uint8_t stop);
Прокрутка экрана вверх и влево.
void stopscroll(void);
Отключение прокрутки.
Буфер
boolean getPixel(int16_t x, int16_t y);
Данная функция считывает из буфера цвета пикселя с координатами (x, y).
uint8_t * getBuffer(void);
Возвращает указатель на буфер. Можно использовать для прямого доступа к буферу.
Рисование точек и геометрических фигур
void drawPixel(int16_t x, int16_t y, uint16_t color);
Устанавливает в буфере цвет для пикселя.
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) ;
Быстрая функция рисования горизонтальной линии из точки с координатами (x, y), w задаёт ширину линии.
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
Быстрая функция рисования вертикальной линии из точки с координатами (x, y), h задаёт высоту линии.
void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color);
Рисует линию между точками с координатами (x0, y0) и (x1, y1).
void drawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color);
Рисование круга с центром в точке (x0, y0) и радиусом r.
void fillCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color);
При рисовании круга дополнительно закрашивается внутренняя область.
void drawRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);
Рисует прямоугольник. Координаты (x0, y0) задают верхний правый угол. Параметр w задаёт ширину, а параметр h высоту.
void fillRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);
При рисовании прямоугольника дополнительно закрашивается внутренняя область.
void fillScreen(uint16_t color);
Заполняет весь буфер экрана указанным цветом.
void drawRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);
Рисует прямоугольник с закруглёнными углами. Параметр radius задаёт радиус.
void fillRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);
При рисовании прямоугольника дополнительно закрашивает внутреннюю область.
void drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);
Рисует треугольник с координатами вершин (x0, y0), (x1, y1) и (x2, y2).
void fillTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);
Треугольник с заполнением внутренней области.
Вывод монохромных изображений
Параметры x и y задают координаты на экране, в которых нужно вывести 1-битное изображение.
Функция drawXBitmap и первые две функции drawBitmap работают с массивом, хранящимся во flash-памяти. Вторые две функции drawBitmap работают с массивом, хранящимся в оперативной памяти.
Параметр color задаёт цвет для пикселей «включено», а bg для «выключено».
В одном байте храниться информация для строки из 8-ми пикселей («включено» это биты, у которых значение равно 1, а «выключено» соответствует значение 0). Кодирование пикселей в байте может производиться слева на право или справа на лево.
Функции drawBitmap и drawXBitmap отличаются тем, с какой очерёдностью закодированы пиксели изображения. Для наглядности:
Изображение выведено сначала функцией drawBitmap, а затем drawXBitmap.
Вывод текста
void setTextSize(uint8_t s);
Устанавливает коэффициент масштабирования, с которым выводятся символы. При масштабе 1, размер символа составляет 6×8 пикселя. При масштабе 2 это 12×16, при 3 это 18×24 и т.д.
void setTextSize(uint8_t s_x, uint8_t s_y);
Задаёт коэффициент горизонтального и вертикального масштабирования.
void setFont(const GFXfont *f = NULL);
Настраивает, с помощью какого шрифта выводить текст. При передаче в качестве параметра NULL или вызове функции без параметров, будет установлен встроенный шрифт с размером символов 6×8.
void setTextColor(uint16_t c);
Устанавливает цвет текста.
void setTextColor(uint16_t c, uint16_t bg);
Устанавливает цвет текста и фона.
void setCursor(int16_t x, int16_t y);
Задаёт координаты (в пикселях), в которых будет выводиться текст.
int16_t getCursorX(void);
Возвращает текущую x координату «курсора».
int16_t getCursorY(void);
Возвращает текущую x координату «курсора».
void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size_x, uint8_t size_y);
Аналогично, только size_x задаёт коэффициент масштабирования по горизонтали, а size_y по вертикали.
void setTextWrap(boolean w);
Устанавливает режим переноса текста. setTextWrap(true) включает автоматический перенос, setTextWrap(false) отключает. По умолчанию, перенос текста включен. Если перенос включен и при выводе текста, например, функциями print или println, следующий выводимый символ выходит за правую границу экрана, следующие символы выводятся с новой строки.
Примеры
Скетч 01_print
Указываем разрешение экрана:
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Указываем к каким выводам, что подключено:
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Работа с экраном осуществляется с помощью программного SPI, передаём параметры конструктору класса Adafruit_SSD1306:
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Вызываем функцию инициализации:
В данной функции происходит выделение памяти для буфера изображения, инициализация выводов Arduino и т.д.
Включаем режим пониженной яркости:
Обратите внимание на то, что в цикле loop, вызываемая функция очистки экрана clearDisplay только очищает содержимое буфера. Все настройки цвета, текущей позиции курсора для вывода текста и т.д., сбрасываться не будут.
Если в самом начале цикла не устанавливать позицию курсора (setCursor), то при следующем выполнении на экране ничего выводиться не будет. Это связано с тем, что функция println не сдвигает изображение на экране, а только меняет позицию курсора в большую.
Далее в коде выводится текст с включенным и выключенным переносом текста, а также с различными настройками размера текста.
Затем несколько раз c помощью функции dim, попеременно устанавливаем яркость на минимум и на максимум.
Яркость можно менять и таким образом:
SSD1306_SETCONTRAST – это команда с параметрами, т.е. сначала отправляем её код, а затем параметры. В данном случае параметр один – уровень яркости. Внутри функции dim установка яркости происходит с помощью команды SSD1306_SETCONTRAST. В библиотеке не реализована установка произвольной яркости, только минимум и максимум. Это связано с тем, что экраны с такими контроллерами меняют яркость очень незначительно. Глазами лучше видно, а вот камера изменения яркости почти не замечает:
Если очень хорошо всматриваться, можно заметить небольшие отличия. Единственное для чего имеет смысл использовать программное снижение яркости – это что бы пиксели экрана со временем чуть меньше деградировали.
Функция ssd1306_command полезна, если в коде нужно реализовать прямую работу с экраном, допустим выключить или включить экран:
При выключении и последующем включении экрана, внутренний буфер и настрой драйвера не инициализируются заново. Если внимательно посмотрите на код и экран, заметите, что после включения, Вы увидите тоже изображение, что было до выключения. Надпись «On» на экране не видно, т.к. предыдущий вызов println установил позицию курсора вне нижней границы экрана.
Скетч 02_draw
В первой части кода приведены примеры использования всех доступных в библиотеке функций рисования. Во второй части циклически поворачивается экран и инверсивным цветом рисуются линии. Как можете заметить, при повторном рисовании линии инверсивным цветом, исходное изображение восстанавливается. Это очень полезно, когда нужно поверх некоторого изображения временно что-то нарисовать или реализовать эффект мигания – рисование стрелок, подчёркивание или мигание текущего символа и т.д.
Используя поворот экрана не забывайте, что при повороте меняется и его разрешение:
Имеющихся в библиотеки функций рисования примитивов может быть недостаточно, чтобы одним вызовом функции нарисовать необходимое. Может понадобиться задавать толщину, рисовать овалы, эллипсы, дуги, иметь возможность задавать угол поворота фигуры или какую её часть. Можно использовать другую библиотеку, в которой есть необходимый функционал или реализовать его самостоятельно.
Алгоритмы компьютерной графики и расширение функционала библиотек к данной теме не относятся, а в рамках этой, обращу внимание на некоторые моменты.
Функции вывода текста, отрисовки изображений и графических примитивов только меняют значения цвета в буфере, а уже при вызове функции display содержимое этого буфера и передаёт драйверу экрана. При выводе на экран не вызывайте display, когда в этом нет необходимости – «нарисовали» всё необходимое и только тогда вызывается display. Посмотрите на такой код:
Разница очень значительна – в первом случае, экран закрашен почти моментально, а во втором на одну строку уходит почти 3 секунды.
При рисовании фигур, её можно разбивать на составляющие. В примере ранее Вы уже могли заметить использование такого подхода:
display.fillRoundRect(55, 30, 50, 30, 20, SSD1306_WHITE);
display.fillRoundRect(60, 35, 40, 20, 10, SSD1306_BLACK);
display.drawLine(0, 0, 20, 20, SSD1306_INVERSE);
display.drawLine(1, 0, 21, 20, SSD1306_INVERSE);
display.drawLine(0, 1, 20, 21, SSD1306_INVERSE);
Вместо множества линий можно использовать функцию рисования прямоугольника. Если не подходит прямоугольник со скруглёнными углами, использовать прямоугольник и на концах рисовать два круга. Замкнутые фигуры, которые нужно зарисовать внутри, может оказаться удобным разбить на треугольники. Если для фигуры нужно нарисовать только контур, больше подойдут линии.
Не всё можно или удобно рисовать, используя для этого комбинацию вызовов функций отрисовки линий, треугольников, кругов или прямоугольников. При рисовании фигур отдельными точками, вместо вызова drawPixel можно работать с буфером на прямую.
Скетч 03_image_eyes1
Для вывода на экран, изображение должно храниться в оперативной или flash-памяти. В данном скетче данные хранятся и считываются из flash-памяти, вот эти объявления:
static const uint8_t PROGMEM eyes1[] =
static const uint8_t PROGMEM eyes2[] =
Что бы изображение выводилось из оперативной памяти, объявление массивов нужно сделать так:
Скетч 04_image_eyes2
Здесь изображений уже не два и каждое изображение для удобства уже храниться не в отдельной переменной, а в двумерном массиве. Так удобней, если в цикле нужно выводить последовательность анимации или как в данном примере при вызове функции и т.д.
Скетч 05_battery
Использовать отображение изображений ещё можно при выводе иконок для информирования, что в данный момент происходит приём или передача данных, отображение уровня заряда аккумулятора или анимация при его зарядке, состояние вентилятора (выключен или анимация, когда включен), выставлен ли будильник часов, активирован ли GPS-модуль и т.д.
Скетч 06_image_scroll
Аппаратные возможности прокрутки изображений на экране в SSD1306 не очень большие, но даже в таком виде они могут оказаться полезными.
















































