Для создания интерфейсов на подобие:
Когда есть необходимость отображать различные элементы (кнопки, слайдеры, поля ввода текста, прокручиваемые списки, виртуальную клавиатуру и т.д.), создавать для визуальных элементов обработчики событий (нажатие, переключение, прокрутка, ...), реализовывать ввод с сенсорных емкостных или резистивных панелей, можно использовать относительно тяжеловесные библиотеки.
В зависимости от библиотеки, разрешения экрана, что нужно выводить, как это реализовать и т.д., минимальные требования к ресурсам могут сильно отличаться. Т.к. это введение в работу с графическими экранами, рассматриваемое будет достаточно нетребовательно к ресурсам управляющего контроллера, что бы можно было реализовать на младших моделях 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, экраном или библиотекой.
На плате модуля могут быть немного другие надписи. К примеру, 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. Если нет управления ориентацией экрана, но есть управление отражением изображения, чтобы перевернуть экран, нужно сделать отражение и по горизонтали, и по вертикали.
Для SSD1306 при вызове различных функций можно указывать три цвета – чёрный («выключить»), белый («включить») или инверсный. Что бы указать чёрный, используется число 0 или определённые директивой define идентификаторы BLACK или SSD1306_BLACK. Белый – это 1, WHITE или SSD1306_WHITE. Инверсия – это 2, INVERSE или SSD1306_INVERSE. Если выводить на экран, указав цвет INVERSE, то те пиксели на экране, которые были белыми, станут чёрными и наоборот.
Функции прокрутки задействуют аппаратные возможности драйвера SSD1306. Изображение на экране начинает меняться автоматически. Содержимое буфера, используемого в библиотеке, не меняется. Драйвер экрана меняет содержимое внутреннего буфера и не восстанавливает его после отключения прокрутки или перед включением другого режима прокрутки.
Во избежание повреждения данных в буфере экрана, перед установкой одного из режимов прокрутки или вывода на экран, в даташите рекомендуется сначала отключить режим прокрутки.
Экран по вертикали поделён на сегменты (для используемого экрана с разрешением 128x64 этих сегментов 8 - с 0 по 7). Параметр start задаёт начальный сегмент, а stop конечный. Для прокрутки всего экрана, в функции можно передавать (0x00, 0x0F).
void startscrollright(uint8_t start, uint8_t stop);Параметры x и y задают координаты на экране, в которых нужно вывести 1-битное изображение.
Функция drawXBitmap и первые две функции drawBitmap работают с массивом, хранящимся во flash-памяти. Вторые две функции drawBitmap работают с массивом, хранящимся в оперативной памяти.
Параметр color задаёт цвет для пикселей «включено», а bg для «выключено».
В одном байте храниться информация для строки из 8-ми пикселей («включено» это биты, у которых значение равно 1, а «выключено» соответствует значение 0). Кодирование пикселей в байте может производиться слева на право или справа на лево.
Функции drawBitmap и drawXBitmap отличаются тем, с какой очерёдностью закодированы пиксели изображения. Для наглядности:
Изображение выведено сначала функцией drawBitmap, а затем drawXBitmap.
#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>Указываем разрешение экрана:
#define SCREEN_WIDTH 128Указываем к каким выводам, что подключено:
#define OLED_MOSI 9Работа с экраном осуществляется с помощью программного 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);SSD1306_SETCONTRAST – это команда с параметрами, т.е. сначала отправляем её код, а затем параметры. В данном случае параметр один – уровень яркости. Внутри функции dim установка яркости происходит с помощью команды SSD1306_SETCONTRAST. В библиотеке не реализована установка произвольной яркости, только минимум и максимум. Это связано с тем, что экраны с такими контроллерами меняют яркость очень незначительно. Глазами лучше видно, а вот камера изменения яркости почти не замечает:
Если очень хорошо всматриваться, можно заметить небольшие отличия. Единственное для чего имеет смысл использовать программное снижение яркости – это что бы пиксели экрана со временем чуть меньше деградировали.
Функция ssd1306_command полезна, если в коде нужно реализовать прямую работу с экраном, допустим выключить или включить экран:
ssd1306_command(SSD1306_DISPLAYOFF);При выключении и последующем включении экрана, внутренний буфер и настрой драйвера не инициализируются заново. Если внимательно посмотрите на код и экран, заметите, что после включения, Вы увидите тоже изображение, что было до выключения. Надпись «On» на экране не видно, т.к. предыдущий вызов println установил позицию курсора вне нижней границы экрана.
#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);Вместо множества линий можно использовать функцию рисования прямоугольника. Если не подходит прямоугольник со скруглёнными углами, использовать прямоугольник и на концах рисовать два круга. Замкнутые фигуры, которые нужно зарисовать внутри, может оказаться удобным разбить на треугольники. Если для фигуры нужно нарисовать только контур, больше подойдут линии.
Не всё можно или удобно рисовать, используя для этого комбинацию вызовов функций отрисовки линий, треугольников, кругов или прямоугольников. При рисовании фигур отдельными точками, вместо вызова drawPixel можно работать с буфером на прямую.
#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[] =
Здесь изображений уже не два и каждое изображение для удобства уже храниться не в отдельной переменной, а в двумерном массиве. Так удобней, если в цикле нужно выводить последовательность анимации или как в данном примере при вызове функции и т.д.
#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); }
Использовать отображение изображений ещё можно при выводе иконок для информирования, что в данный момент происходит приём или передача данных, отображение уровня заряда аккумулятора или анимация при его зарядке, состояние вентилятора (выключен или анимация, когда включен), выставлен ли будильник часов, активирован ли 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); } }
Аппаратные возможности прокрутки изображений на экране в 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); }