Экран для arduino nano

Какие бывают дисплеи для Ардуино и как их подключить

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

Содержание статьи

Виды дисплеев

Дисплеи можно разделить на:

Сегментные (такие, как на цифровых часах);

Сегментные используются для индикации простых величин, например: температура, время, количество оборотов. Такие используются в калькуляторах и на бюджетной бытовой технике и по сей день. Информация выводится путем засвечивания определенных символов.

Они могут быть как жидкокристаллическими, так и светодиодными. Алфавитно-цифровые дисплеи можно встретить на старой бытовой технике, игрушках, промышленной технике и прочем. Их еще называют знакосинтезирующими, текстовыми, символьными. Состоят из набора крупных пикселей. Могут быть выполнены по LCD, TFT и OLED-технологии.

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

Знакосинтезирующие дисплеи

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

Где первые две цифры – количество символов в строке, а вторая пара – количество строк. Таким образом дисплей с названием 1602 может отображать одновременно 2 строки по 16 символов.

По типу ввода данных различают дисплеи:

С параллельным вводом данных;

С вводом данных по протоколу I2C.

Параллельный ввод данных предполагает передачу 8 или 4-битных слов по 10 или 6 выводам соответственно (рис. ниже – схема подключения для управления 4 битами). Кроме данных на дисплей подаётся питание. Учитывайте это при проектировании, в противном случае вам может не хватить пинов платы Ардуино.

Передача данных на дисплей с помощью I2С займет 4 пина вашей Arduino, 2 из которых питание, а 2 – данные. Но подробнее рассмотрим этот вопрос немного ниже.

Среди отечественных производителей можно выделить фирму МЭЛТ. Среди продукции, которой есть целый ряд различных дисплеев. Например, ниже изображен дисплей с маркировкой 20S4, по аналогии с предыдущей рассмотренной, это говорит нам о том, что он отображает 4 строки по 20 знаков.

Он построен на контроллере КБ1013ВГ6, от ОАО «АНГСТРЕМ», который аналогичен HD44780 фирмы HITACHI и KS0066 фирмы SAMSUNG. На которых построены подавляющее большинство китайских дисплеев. Кстати он, как и дисплеи на перечисленных чипах поддерживает стандартную библиотеку параллельного управления Arduino IDE, но о ней позже.

Знакосинтезирующие дисплеи бывают с подсветкой и без неё, также могут отличаться цветом изображаемых символов. Яркость подсветки и контрастность изображения обычно регулируется. Ниже приведет пример схемы из даташита, на упомянутый выше МЭЛТ.

Переменный резистор R и служит для регулировки яркости.

Подключение

Подключение будем рассматривать на дисплее типа 1602. В первую очередь обратите внимание на подписи выводов. Встречается два варианта, нумерации. На двух рисунках ниже всё нормально – от 1 до 16 вывода.

Отметим, что под VSS понимается земля. В остальном назначения выводов идентичны. Но часто можно встретить и нестандартную нумерацию:

Что вы видите? Контакты подписаны только 1, 14 и 15. Причем в неправильной последовательности. В остальном – 15 и 16 контакт всё также остались анодом и катодом подсветки, а 1 и 2 – общий контакт и плюс питания. Будьте бдительны и обращайте внимание при подключении на этот факт!

1 – (Vss) земля или «—» питания.

2 – (Vcc) «+» питания. Чаще всего это 5 вольт.

3 – регулировка контрастности символов. Осуществляется через потенциометр, установленный между «+» питания и этим контактом. Чем выше напряжение – тем меньше яркость и энергопотребление.

4 – (RS) Адресный сигнал. По наличию сигнала от ардуино на этом входе контроллер дисплея понимает, на линии данных сигнал команды (перемещение курсора, например) или кода символа для отображения.

5 – (E) разрешения доступа к данным. Когда здесь логическая «1» — дисплей выполняет команду или выводит символ.

6-14 – через эти пины обеспечивается параллельный ввод данных.

15 – (BLA) анод подсветки. Чтобы она зажглась на всю яркость – сюда подают +5В.

16 – (BLC) катод подсветки. Подключают к земле.

Один из примеров подключения к Ардуино в 4 битовом режиме мы рассмотрели выше. Теперь взгляните на схему подключения в 8 битовом режиме управления. Кстати вы могли заметить переменный резистор. Он и нужен для регулировки яркости подсветки, как было сказано ранее.

Таким образом у вас оказываются занятыми половина входов платы Arduino UNO. Конечно если вы будете использовать MEGA – это будет не столь существенной проблемой, но всё же это не рационально, особенно если вы собираетесь подключать группу датчиков и клавиш управления.

Чтобы высвободить входы используйте конвертер I2C для LCD экрана (именно так он называется, и вы сможете найти его в магазинах под таким названием).

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

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

Схема такого модуля выглядит следующим образом:

А вот так он выглядит припаянным непосредственно к контактам дисплея. Большинство моделей продаются уже распаянными.

Однако для его использования вам нужно будет найти в сети библиотеку LiquidCrystal_I2C её нет в стандартном наборе актуального на момент написания статьи Arduino IDE.

Напомним цоколевку плат Arduino UNO, по нумерации контактов она в принципе совпадает и с Nano и некоторыми другими (для увеличения нажмите на рисунок).

Для работы по I2C нужно сформировать 2 информационных сигнала – SDA и SCL, обратите внимание в нижний правый угол рисунка. Эти выводы в ардуино совмещены с A4 и A5 аналоговыми входами.

Переназначить их вы на другие выводы не можете.

Тогда монтажная схема подключения будет иметь вид:

Согласитесь, проводов намного меньше! От ардуино к дисплею идут всего 4 провода. А сигнальных пина использовано всего два!

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

Научитесь разрабатывать устройства на базе микроконтроллеров и станьте инженером умных устройств с нуля: Инженер умных устройств

Программа

Естественно нам нужен какой-то скетч, который может показывать изображение на символьном дисплее. Если вы хотите «напрямую» работать с дисплеем – придется изучить даташиты и таблицы символов на каждое конкретное изделие. Но Ардуино была создана для простого и быстрого прототипирования электронных устройств. Поэтому мы пойдем другим путём и воспользуемся благами цивилизации. Мы уже упомянули, что в стандартном наборе библиотек в Arduino IDE есть готовое решение для работы с LCD-дисплеями. Найти его можно здесь:

Кстати после нажатия строка с объявлением о подключении библиотеки появляется автоматически.

Также в Arduino IDE есть несколько примеров для работы с дисплеем. Они отражают базовые операции и функции.

Рассмотрим простейший «Хэлоу ворд». Пример полностью совпадает с тем, что есть в стандартном наборе IDE, я лишь перевёл текст комментариев на русский язык. Обратите внимание – это пример работы в 4-битном режиме.

Работа с I2C практически аналогична:

Обратите внимание, что в этом примере кода первой командой указан несколько размер дисплея, количество строк и символов, но и его I2C адрес. А именно – 0x27, что соответствует отсутствующим перемычкам. Вообще это нужно для того, чтобы подключить на два сигнальных провода несколько дисплеев (8 штук).

Официальную документацию к библиотеке liquidcrystal с примерами и пояснениями вы сможете найти на официальном сайте Arduino:

Полезные ссылки

Подборка видеоуроков по теме

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

Заключение

Оказывается, подружить плату Arduino и дисплей совсем не сложно. Вам доступна возможность как параллельной передачи данных, так и последовательной с помощью шины I2C, что выбрать – решать вам, как по удобству, так и по требованиям к быстродействию системы в целом. Пишите в комментариях какие вопросы нужно рассмотреть подробнее и что конкретно вы бы хотели видеть по теме микроконтроллеров!

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

Совсем недавно вышел новый курс Максима Селиванова «Программирование дисплеев Nextion». Это «arduino» в мире дисплеев с сенсорным экраном. Но, информации по нему очень мало.

Что такое дисплеи Nextion? Если кратко, то эти дисплеи представляют собой программируемые дисплеи с тачскрином и UART для создания самых разных интерфейсов на экране. Для программирования используется очень удобная и простая среда разработки, которая позволяет создавать даже очень сложные интерфейсы для различной электроники буквально за пару вечеров! А все команды передаются через интерфейс UART на микроконтроллер или компьютер.

Здесь есть все что бы начать работать с дисплеями Nextion на новом уровне: Программирование дисплеев NEXTION

Максим Селиванов — автор видеокурсов «Программирование микроконтроллеров для начинающих», «Программирование микроконтроллеров на языке С», «Создание устройств на микроконтроллерах». Подробее о нем и его видеокурсах смотрите здесь — Обучение программированию и созданию устройств на микроконтроллерах

Источник

Введение в работу с графическими экранами на 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-карт, а поверх экрана может быть установлена резистивная плёнка для определения касаний.

Изображения на OLED экранах отлично видно под любыми углами обзора и при высоком и при низком освещении. Экраны бывают монохромные и цветные. Изображения на цветных очень красиво выглядит. У монохромных все пиксели могут быть одного цвета или на разных частях экрана отличаться. К примеру, на втором фото выше, на экране у первых 16-ти строк цвет пикселей желтый, а у остальных 48-ми строк, цвет пикселей синий. Из минусов OLED экранов — это постепенная деградация пикселей.

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

Как происходит работа с экраном и возможности библиотек Adafruit и U8, очень близки. Рассматриваемые примеры хоть и будут для монохромного экрана, но из-за возможности работать и с цветными экранами, будет использоваться библиотека от Adafruit. Для рассмотрения будет использоваться Arduino Nano с подключенным по SPI монохромным OLED экраном. Примерно тоже самое можно реализовать с другой Arduino, экраном или библиотекой.

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

D13 -> RESET
D12 -> CS
D11 -> DC
D10 -> CLK
D9 -> MOSI
3.3V -> 3.3V
GND -> GND

На плате модуля могут быть немного другие надписи. К примеру, MOSI могут подписать как DATA или SDA (на экранах, которые могут подключаться как по SPI, так и по I2C), а вместо CLK может быть надпись SCK. Если напряжение питания дисплея 3.3В, на плате может быть установлен линейный стабилизатор. На таких платах для подключения питания может быть, как один вывод, так и два (подписанные, допустим, как Vcc и 3V3).

Библиотеки

У библиотек U8glib и U8g2, функционал отрисовки и работы с драйвером реализован в рамках одной библиотеки, а у Adafruit разделён. Для работы с экраном на SSD1306 понадобится две библиотеки — Adafruit_GFX и Adafruit_SSD1306. В менеджере библиотек можно проверить, установлены ли нужные библиотеки и при необходимости установить:

Для упрощения поиска часть библиотек можно отфильтровать, для этого в строке фильтра (обведено красным) нужно ввести частичное или полное название библиотеки:

Экран и координатная система

Экран состоит из матрицы пикселей (точек). Пиксель — это мельчайшая часть изображения. Разрешение используемого экрана составляет 128 на 64 пикселя. Это означает, что у экрана 128 столбцов и 64 строки.

В массивах на Си, первый элемент имеет индекс 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. Изображение на экране начинает меняться автоматически. Содержимое буфера, используемого в библиотеке, не меняется. Драйвер экрана меняет содержимое внутреннего буфера и не восстанавливает его после отключения прокрутки или перед включением другого режима прокрутки.

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

Экран по вертикали поделён на сегменты (для используемого экрана с разрешением 128×64 этих сегментов 8 — с 0 по 7). Параметр start задаёт начальный сегмент, а stop конечный. Для прокрутки всего экрана, в функции можно передавать (0x00, 0x0F).

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 и y — координаты символа
color — цвет символа
bg — цвет фона
size — коэффициент масштабирования

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 по вертикали.

Для вывода текста также доступны функции print и println , они аналогичны Serial.print и Serial.println.

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 не очень большие, но даже в таком виде они могут оказаться полезными.

Источник

Adblock
detector