+7-960-0655211 (Билайн)
+7-987-4207734 (МТС)
интернет-магазин
доставка по России и СНГ
нам уже 10 лет!

Введение в работу с графическими экранами на Arduino

Введение в работу с графическими экранами на Arduino

Для создания интерфейсов на подобие:




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

В зависимости от библиотеки, разрешения экрана, что нужно выводить, как это реализовать и т.д., минимальные требования к ресурсам могут сильно отличаться. Т.к. это введение в работу с графическими экранами, рассматриваемое будет достаточно нетребовательно к ресурсам управляющего контроллера, что бы можно было реализовать на младших моделях Arduino (Uno, Nano и т.д.).

Библиотек, не требовательных к ресурсам микроконтроллера, очень много. Из наиболее популярных на данный момент можно упомянуть Adafruit_GFX, U8glib и U8g2. Эти библиотеки поддерживают множество очень популярных драйверов экрана, а реализованный функционал позволяет выводить текст, изображения и рисовать некоторые графические примитивы (точки, линии и т.д.).

Разработка U8glib уже несколько лет как прекращена, тем не менее эта библиотека активно используется в проектах. U8g2 это дальнейшее развитие библиотеки U8glib, в которой расширена поддержка экранов, переработан и расширен функционал. Библиотека от Adafruit интересна тем, что можно работать как с монохромными, так и с цветными экранами.

Драйверов экранов, экранов и модулей экранов также очень много. Они отличаются интерфейсами (I2С, SPI, параллельный и т.д.), количеством цветов, разрешением, габаритами, технологией экрана и т.д.


Изображение на монохромных жидкокристаллических экранах, как на фото выше (TN матрица), хорошо видно днём на улице. Что бы изображение было видно и при низком освещении, такие экраны дополнительно освещаются светодиодами, яркость которых обычно можно регулировать.


DFRobot 128x64 «белый на синем». Это тоже модуль с жидкокристаллическим экраном, но с более современной технологией матрицы (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), для экрана с разрешением 128x64, координаты у правого нижнего пикселя будут (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. Изображение на экране начинает меняться автоматически. Содержимое буфера, используемого в библиотеке, не меняется. Драйвер экрана меняет содержимое внутреннего буфера и не восстанавливает его после отключения прокрутки или перед включением другого режима прокрутки.

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

Экран по вертикали поделён на сегменты (для используемого экрана с разрешением 128x64 этих сегментов 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);
Треугольник с заполнением внутренней области.

Вывод монохромных изображений

drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color);
drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color, uint16_t bg);
drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color);
drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg);
drawXBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, 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, размер символа составляет 6x8 пикселя. При масштабе 2 это 12x16, при 3 это 18x24 и т.д.

void setTextSize(uint8_t s_x, uint8_t s_y);
Задаёт коэффициент горизонтального и вертикального масштабирования.

void setFont(const GFXfont *f = NULL);
Настраивает, с помощью какого шрифта выводить текст. При передаче в качестве параметра NULL или вызове функции без параметров, будет установлен встроенный шрифт с размером символов 6x8.

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

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#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

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup()
{
  display.begin(SSD1306_SWITCHCAPVCC);
  display.dim(true);
}

void loop()
{
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);

  display.setTextWrap(true);
  display.println("aaaabbbbccccddddffffeeeegggghhhh");

  display.setTextWrap(false);
  display.println("aaaabbbbccccddddffffeeeegggghhhh");

  display.println("SSD1306");

  display.setTextSize(2);
  display.println("SSD1306");

  display.setTextSize(2, 1);
  display.println("SSD1306");
  display.display();

  delay(2000);

  bool b = true;
  for (int i = 0; i < 8; i++)
  {
    display.dim(b);
    delay(750);
    b = !b;
  }

  delay(2000);

  display.println("Off");
  display.display();
  delay(1000);
  display.ssd1306_command(SSD1306_DISPLAYOFF);

  delay(2000);
  display.println("On");
  display.display();
  display.ssd1306_command(SSD1306_DISPLAYON);
  delay(2000);
}




Подключаем библиотеки:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Указываем разрешение экрана:

#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);

Вызываем функцию инициализации:

display.begin(SSD1306_SWITCHCAPVCC);

В данной функции происходит выделение памяти для буфера изображения, инициализация выводов Arduino и т.д.

Включаем режим пониженной яркости:

display.dim(true);

Обратите внимание на то, что в цикле loop, вызываемая функция очистки экрана clearDisplay только очищает содержимое буфера. Все настройки цвета, текущей позиции курсора для вывода текста и т.д., сбрасываться не будут.

Если в самом начале цикла не устанавливать позицию курсора (setCursor), то при следующем выполнении на экране ничего выводиться не будет. Это связано с тем, что функция println не сдвигает изображение на экране, а только меняет позицию курсора в большую. 

Далее в коде выводится текст с включенным и выключенным переносом текста, а также с различными настройками размера текста.

Затем несколько раз c помощью функции dim, попеременно устанавливаем яркость на минимум и на максимум.

Яркость можно менять и таким образом:

display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(10);

SSD1306_SETCONTRAST – это команда с параметрами, т.е. сначала отправляем её код, а затем параметры. В данном случае параметр один – уровень яркости. Внутри функции dim установка яркости происходит с помощью команды SSD1306_SETCONTRAST. В библиотеке не реализована установка произвольной яркости, только минимум и максимум. Это связано с тем, что экраны с такими контроллерами меняют яркость очень незначительно. Глазами лучше видно, а вот камера изменения яркости почти не замечает:



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

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

ssd1306_command(SSD1306_DISPLAYOFF);
ssd1306_command(SSD1306_DISPLAYON);

При выключении и последующем включении экрана, внутренний буфер и настрой драйвера не инициализируются заново. Если внимательно посмотрите на код и экран, заметите, что после включения, Вы увидите тоже изображение, что было до выключения. Надпись «On» на экране не видно, т.к. предыдущий вызов println установил позицию курсора вне нижней границы экрана.

Скетч 02_draw



#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#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

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup()
{
  display.begin(SSD1306_SWITCHCAPVCC);
  display.dim(true);
}

void loop()
{
  display.clearDisplay();

  display.drawPixel(5, 5, SSD1306_WHITE);
  display.drawFastHLine(10, 5, 5, SSD1306_WHITE);
  display.drawFastVLine(5, 10, 10, SSD1306_WHITE);

  display.drawCircle(30, 10, 10, SSD1306_WHITE);
  display.fillCircle(55, 10, 10, SSD1306_WHITE);

  display.drawTriangle(70, 20, 80, 0, 80, 20, SSD1306_WHITE);
  display.fillTriangle(85, 0, 85, 20, 95, 20, SSD1306_WHITE);

  display.drawRect(100, 0, 10, 20, SSD1306_WHITE);
  display.fillRect(115, 0, 10, 20, SSD1306_WHITE);

  display.drawRoundRect(5, 30, 20, 30, 5, SSD1306_WHITE);
  display.drawRoundRect(10, 35, 10, 20, 5, SSD1306_WHITE);
  display.drawPixel(15, 40, SSD1306_WHITE);
  display.drawPixel(15, 45, SSD1306_WHITE);
  display.drawPixel(15, 50, SSD1306_WHITE);

  display.fillRoundRect(30, 30, 20, 30, 5, SSD1306_WHITE);

  display.fillRoundRect(55, 30, 50, 30, 20, SSD1306_WHITE);
  display.fillRoundRect(60, 35, 40, 20, 10, SSD1306_BLACK);

  display.drawLine(105, 35, 125, 65, SSD1306_WHITE);
  display.drawLine(105, 65, 125, 35, SSD1306_WHITE);

  display.display();

  delay(3000);
  
  while (true)
    for (int i = 0; i < 4; i++)
    {
      display.setRotation(i);
      display.drawLine(0, 0, 20, 20, SSD1306_INVERSE);
      display.drawLine(1, 0, 21, 20, SSD1306_INVERSE);
      display.drawLine(0, 1, 20, 21, SSD1306_INVERSE);
      display.display();
      delay(1000);
    }
}




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

Используя поворот экрана не забывайте, что при повороте меняется и его разрешение:



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

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

Функции вывода текста, отрисовки изображений и графических примитивов только меняют значения цвета в буфере, а уже при вызове функции display содержимое этого буфера и передаёт драйверу экрана. При выводе на экран не вызывайте display, когда в этом нет необходимости – «нарисовали» всё необходимое и только тогда вызывается display. Посмотрите на такой код:

void loop()
{
  display.clearDisplay();

  for (int y = 0; y < 64; y++)
    for (int x = 0; x < 128; x++)
    {
      display.drawPixel(x, y, SSD1306_WHITE);
    }
  display.display();

  delay(2000);

  display.clearDisplay();
  for (int y = 0; y < 64; y++)
    for (int x = 0; x < 128; x++)
    {
      display.drawPixel(x, y, SSD1306_WHITE);
      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

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#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
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

//image size 48x24
static const uint8_t PROGMEM eyes1[] =
{
  0x00, 0x3f, 0xc0, 0x01, 0xf8, 0x00,
  0x00, 0xff, 0xf0, 0x07, 0xff, 0x00,
  0x03, 0xff, 0xf8, 0x1f, 0xff, 0x80,
  0x07, 0xff, 0xfc, 0x1f, 0xff, 0xe0,
  0x0f, 0xff, 0xfc, 0x3f, 0xff, 0xf0,
  0x1f, 0xff, 0xfe, 0x7f, 0xff, 0xf8,
  0x1f, 0xff, 0xfe, 0x7f, 0xff, 0xf8,
  0x3f, 0xff, 0xfe, 0x7f, 0xff, 0xfc,
  0x3f, 0xff, 0xfe, 0x7f, 0xff, 0xfc,
  0x7f, 0xff, 0xfe, 0x7f, 0xff, 0xfe,
  0x7f, 0xfe, 0x3e, 0x78, 0xff, 0xfe,
  0x7f, 0xfe, 0x3e, 0x78, 0xff, 0xfe,
  0xff, 0xfe, 0x3e, 0x78, 0xff, 0xff,
  0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff,
  0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff,
  0x7f, 0xff, 0xfc, 0x3f, 0xff, 0xfe,
  0x7f, 0xff, 0xfc, 0x3f, 0xff, 0xfe,
  0x7f, 0xff, 0xf8, 0x1f, 0xff, 0xfe,
  0x7f, 0xff, 0xf0, 0x1f, 0xff, 0xfe,
  0x3f, 0xff, 0xf0, 0x0f, 0xff, 0xfc,
  0x1f, 0xff, 0xe0, 0x07, 0xff, 0xfc,
  0x0f, 0xff, 0x80, 0x03, 0xff, 0xf8,
  0x07, 0xff, 0x00, 0x00, 0xff, 0xf0,
  0x01, 0xf8, 0x00, 0x00, 0x3f, 0xc0
};

static const uint8_t PROGMEM eyes2[] =
{
  0x00, 0x3f, 0xc0, 0x01, 0xf8, 0x00,
  0x00, 0xff, 0xf0, 0x07, 0xff, 0x00,
  0x03, 0xff, 0xf8, 0x1f, 0xff, 0x80,
  0x07, 0xff, 0xfc, 0x1f, 0xff, 0xe0,
  0x0f, 0xff, 0xfc, 0x3f, 0xff, 0xf0,
  0x1f, 0xff, 0xfe, 0x7f, 0xff, 0xf8,
  0x1f, 0xff, 0xfe, 0x7f, 0xff, 0xf8,
  0x3f, 0xff, 0xfe, 0x7f, 0xff, 0xfc,
  0x3f, 0xff, 0xfe, 0x7f, 0xff, 0xfc,
  0x7f, 0xff, 0xfe, 0x7f, 0xff, 0xfe,
  0x7f, 0xff, 0xc6, 0x7f, 0x1f, 0xfe,
  0x7f, 0xff, 0xc6, 0x7f, 0x1f, 0xfe,
  0xff, 0xff, 0xc6, 0x7f, 0x1f, 0xff,
  0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff,
  0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff,
  0x7f, 0xff, 0xfc, 0x3f, 0xff, 0xfe,
  0x7f, 0xff, 0xfc, 0x3f, 0xff, 0xfe,
  0x7f, 0xff, 0xf8, 0x1f, 0xff, 0xfe,
  0x7f, 0xff, 0xf0, 0x1f, 0xff, 0xfe,
  0x3f, 0xff, 0xf0, 0x0f, 0xff, 0xfc,
  0x1f, 0xff, 0xe0, 0x07, 0xff, 0xfc,
  0x0f, 0xff, 0x80, 0x03, 0xff, 0xf8,
  0x07, 0xff, 0x00, 0x00, 0xff, 0xf0,
  0x01, 0xf8, 0x00, 0x00, 0x3f, 0xc0
};

void setup()
{
  display.begin(SSD1306_SWITCHCAPVCC);
  display.dim(1);
}

void loop()
{
  display.clearDisplay();
  display.drawBitmap(40, 24, eyes1, 48, 24, 1);
  display.display();
  delay(2000);

  display.clearDisplay();
  display.drawBitmap(40, 24, eyes2, 48, 24, 1);
  display.display();
  delay(2000);
}




Для вывода на экран, изображение должно храниться в оперативной или flash-памяти. В данном скетче данные хранятся и считываются из flash-памяти, вот эти объявления:

static const uint8_t PROGMEM eyes1[] =

static const uint8_t PROGMEM eyes2[] =

Что бы изображение выводилось из оперативной памяти, объявление массивов нужно сделать так:

uint8_t eyes1[] =

uint8_t eyes2[] =


Скетч 04_image_eyes2

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

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#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
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

#define imageWidth  64
#define imageHeight 64

static const uint8_t PROGMEM imageArray[6][512] =
{
  {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x07, 0xff, 0x80, 0x01, 0xff, 0xe0, 0x00,
    0x00, 0x1f, 0xff, 0xf0, 0x07, 0xff, 0xf8, 0x00,
    0x00, 0x7f, 0xff, 0xf8, 0x1f, 0xff, 0xfe, 0x00,
    0x00, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0x00,
    0x01, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0x80,
    0x01, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0x80,
    0x00, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0x00,
    0x00, 0x70, 0x00, 0x78, 0x1e, 0x00, 0x1e, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  },
  {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0x00,
    0x0f, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xf0,
    0x3f, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xfc,
    0x3f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xfc,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xfe,
    0x7f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xfe,
    0x3f, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xf8,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  }
  ,
  {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00,
    0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00,
    0x01, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00,
    0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00,
    0x07, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00,
    0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00,
    0x1f, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xfe, 0x00,
    0x1f, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xe0,
    0x1f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xf8,
    0x1f, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xf8,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x1f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc,
    0x0f, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xfc,
    0x0f, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xfc,
    0x0f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xf8,
    0x03, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xf0,
    0x01, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00,
    0x01, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00,
    0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  }
  ,
  {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0x80,
    0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x80,
    0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xc0,
    0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0,
    0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf0,
    0x00, 0x7f, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xf8,
    0x07, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xf8,
    0x1f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xf8,
    0x1f, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xf8,
    0x3f, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xf0,
    0x3f, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xf0,
    0x1f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xf0,
    0x0f, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xc0,
    0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x80,
    0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x80,
    0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  }
  ,
  {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x0f, 0xfc, 0x70, 0x00, 0x00, 0x00, 0x00,
    0xff, 0xff, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0x00,
    0xff, 0xff, 0xfc, 0x7f, 0xc0, 0x00, 0x00, 0x00,
    0xff, 0xff, 0xfc, 0x7f, 0xfc, 0x00, 0x00, 0x00,
    0xff, 0xff, 0xfc, 0x7f, 0xff, 0xfc, 0x00, 0x00,
    0xff, 0xff, 0xfc, 0x7f, 0xff, 0xfe, 0x00, 0x00,
    0xff, 0xff, 0xf8, 0x7f, 0xff, 0xfe, 0x00, 0x00,
    0xff, 0xff, 0xf8, 0x3f, 0xff, 0xfe, 0x00, 0x00,
    0xff, 0xff, 0xf0, 0x3f, 0xff, 0xfc, 0x00, 0x00,
    0x7f, 0xff, 0xe0, 0x1f, 0xff, 0xf8, 0x00, 0x00,
    0x3f, 0xff, 0x80, 0x03, 0xff, 0xe0, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  },
  {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0e, 0x3f, 0xf0, 0x00,
    0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0xff, 0xff,
    0x00, 0x00, 0x00, 0x03, 0xfe, 0x3f, 0xff, 0xff,
    0x00, 0x00, 0x00, 0x3f, 0xfe, 0x3f, 0xff, 0xff,
    0x00, 0x00, 0x3f, 0xff, 0xfe, 0x3f, 0xff, 0xff,
    0x00, 0x00, 0x7f, 0xff, 0xfe, 0x3f, 0xff, 0xff,
    0x00, 0x00, 0x7f, 0xff, 0xfe, 0x1f, 0xff, 0xff,
    0x00, 0x00, 0x7f, 0xff, 0xfc, 0x1f, 0xff, 0xff,
    0x00, 0x00, 0x3f, 0xff, 0xfc, 0x0f, 0xff, 0xff,
    0x00, 0x00, 0x1f, 0xff, 0xf8, 0x07, 0xff, 0xfe,
    0x00, 0x00, 0x07, 0xff, 0xc0, 0x01, 0xff, 0xfc,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  }
};

void setup()
{
  display.begin(SSD1306_SWITCHCAPVCC);
}

void loop()
{
  display.clearDisplay();

  draw(0, 32, 0);
  draw(1, 32, 0);
  draw(2, 16, 0);
  draw(3, 48, 0);
  draw(4, 16, 16);
  draw(5, 48, 16);

  draw(1, 32, 0);
  delay(2000);

  crt_off();
}

void draw(int i, int x, int y)
{
  display.clearDisplay();
  display.drawBitmap(x, y,  imageArray[i], imageWidth, imageHeight, SSD1306_WHITE);
  display.display();
  delay(1000);
}

void crt_off()
{
  display.fillRect(0, 0, 128, 64, SSD1306_WHITE);
  display.display();
  delay(2000);

  uint8_t step = 2;
  uint8_t x = 0;
  uint8_t y = 0;
  uint8_t w = 128;
  uint8_t h = 64;

  while (h > 4)
  {
    display.clearDisplay();
    //void fillRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);
    display.fillRect(0, y, w, h, SSD1306_WHITE);
    display.display();
    delay(15);
    h -= step * 2;
    y += step;
  }

  step = 2;
  x = 0;
  w = 128;
  y = 30;
  h = 4;
  while (w > 4)
  {
    display.clearDisplay();
    display.fillRect(x, y, w, h, SSD1306_WHITE);
    display.display();
    //delay(10);
    w -= step * 2;
    x += step;
  }

  display.clearDisplay();
  display.display();
  delay(3000);
}




Скетч 05_battery

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


#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#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
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

static const uint8_t PROGMEM battery_icons[4][48] =
{
  {
    0x00, 0x00, 0x00,
    0x0f, 0xff, 0xff,
    0x0f, 0xff, 0xff,
    0x0c, 0x00, 0x03,
    0xfc, 0x00, 0x03,
    0xfc, 0x00, 0x03,
    0xcc, 0x00, 0x03,
    0xcc, 0x00, 0x03,
    0xcc, 0x00, 0x03,
    0xcc, 0x00, 0x03,
    0xfc, 0x00, 0x03,
    0xfc, 0x00, 0x03,
    0x0c, 0x00, 0x03,
    0x0f, 0xff, 0xff,
    0x0f, 0xff, 0xff,
    0x00, 0x00, 0x00
  },
  {
    0x00, 0x00, 0x00,
    0x0f, 0xff, 0xff,
    0x0f, 0xff, 0xff,
    0x0c, 0x00, 0x03,
    0xfc, 0x00, 0x7b,
    0xfc, 0x00, 0x7b,
    0xcc, 0x00, 0x7b,
    0xcc, 0x00, 0x7b,
    0xcc, 0x00, 0x7b,
    0xcc, 0x00, 0x7b,
    0xfc, 0x00, 0x7b,
    0xfc, 0x00, 0x7b,
    0x0c, 0x00, 0x03,
    0x0f, 0xff, 0xff,
    0x0f, 0xff, 0xff,
    0x00, 0x00, 0x00
  },
  {
    0x00, 0x00, 0x00,
    0x0f, 0xff, 0xff,
    0x0f, 0xff, 0xff,
    0x0c, 0x00, 0x03,
    0xfc, 0x0f, 0x7b,
    0xfc, 0x0f, 0x7b,
    0xcc, 0x0f, 0x7b,
    0xcc, 0x0f, 0x7b,
    0xcc, 0x0f, 0x7b,
    0xcc, 0x0f, 0x7b,
    0xfc, 0x0f, 0x7b,
    0xfc, 0x0f, 0x7b,
    0x0c, 0x00, 0x03,
    0x0f, 0xff, 0xff,
    0x0f, 0xff, 0xff,
    0x00, 0x00, 0x00
  },
  {
    0x00, 0x00, 0x00,
    0x0f, 0xff, 0xff,
    0x0f, 0xff, 0xff,
    0x0c, 0x00, 0x03,
    0xfd, 0xef, 0x7b,
    0xfd, 0xef, 0x7b,
    0xcd, 0xef, 0x7b,
    0xcd, 0xef, 0x7b,
    0xcd, 0xef, 0x7b,
    0xcd, 0xef, 0x7b,
    0xfd, 0xef, 0x7b,
    0xfd, 0xef, 0x7b,
    0x0c, 0x00, 0x03,
    0x0f, 0xff, 0xff,
    0x0f, 0xff, 0xff,
    0x00, 0x00, 0x00
  }
};

void setup()
{
  display.begin(SSD1306_SWITCHCAPVCC);
}

void loop()
{
  while (true)
    for (uint8_t i = 0; i < 4; i++)
    {
      display.clearDisplay();
      display.drawBitmap(104, 0,  battery_icons[i], 24, 16, 1);
      display.display();
      delay(750);
    }
}




Скетч 06_image_scroll

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


#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#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
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

//image size 128x64
static const unsigned char PROGMEM arrowLeft[] =
{
  0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff
};

void setup()
{
  display.begin(SSD1306_SWITCHCAPVCC);
  display.dim(1);
}

void loop()
{
  display.clearDisplay();
  display.drawLine(0, 0, 127, 63, SSD1306_WHITE);
  display.display();

  for (uint8_t i = 0; i < 8; i++)
  {
    display.startscrollright(i, i);
    delay(2000);
    display.stopscroll();
  }
  delay(300);

  display.clearDisplay();
  display.drawCircle(10, 50, 10, SSD1306_WHITE);
  display.display();
  delay(1500);

  display.startscrolldiagright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  display.startscrolldiagleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  display.startscrolldiagright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  display.startscrolldiagleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1500);

  display.clearDisplay();
  display.drawBitmap(0, 0,  arrowLeft, 128, 64, 1);
  display.display();
  delay(3000);
  display.startscrolldiagright(0x04, 0x05);
  delay(6000);
  display.stopscroll();
  delay(2000);

  display.clearDisplay();
  display.drawBitmap(0, 0,  arrowLeft, 128, 64, 1);
  display.display();
  display.startscrollleft(0x00, 0x0F);

  delay(10000);
  display.stopscroll();

  delay(5000);
}




© RobotoTehnika.ru