В данной статье мы рассмотрим как подключить OLED-дисплей SSD1306 к ESP32. OLED-дисплеи используются для отображения текста, растровых изображений и фигур. Благодаря своей экономичности, большому углу обзора и высокой плотности пикселей данные дисплеи находят широкое применение во встраиваемых системах.
В статье мы рассмотрим как работает 0,96-дюймовый OLED-дисплей, как его подключить к плате ESP32, а также использование драйвера SSD1306/SH1106 для ESP-IDF для отображения текста, бегущей строки, изображений и анимации на OLED-дисплее.
Прежде чем продолжить, убедитесь, что у вас установлена последняя версия VS Code и настроено расширение ESP-IDF:
- Установка ESP32 ESP-IDF на Windows и его интеграция с Visual Studio Code
- Установка ESP32 ESP-IDF на Linux Ubuntu
Также на нашем сайте вы можете прочитать статью про подключение OLED дисплея к модулю ESP32 с помощью Arduino IDE.
0,96-дюймовый OLED-дисплей SSD1306
OLED — это органический светодиод, состоящий из двух органических тонких пленок, соединенных последовательно между двумя электрическими проводниками. На рынке представлено несколько версий OLED-дисплеев. В этом руководстве рассматривается OLED-дисплей SSD1306 с диагональю 0,96 дюйма и разрешением 128×64 пикселя. Контроллер SSD1306 является основным компонентом этого дисплея, обеспечивающим связь по протоколам I2C/SPI между микроконтроллерами. Используемый нами OLED-дисплей взаимодействует только по протоколу I2C, поэтому у него четыре контакта, которые необходимо подключить к плате ESP32.
На приведенной ниже схеме показана распиновка OLED-дисплея, который мы будем использовать.

Как видно на схеме расположения контактов выше, этот OLED-дисплей имеет 4 контакта. Для работы дисплея требуется напряжение питания 3,3-5 В. Контакты VCC и GND — это контакты питания OLED-дисплея, подключенные к контакту Vin или 3,3 В платы ESP32. Контакты SCL и SDA — это контакты I2C, необходимые для генерации тактового сигнала и передачи данных соответственно. Эти два контакта будут подключены к контактам I2C платы ESP32. Более подробно про работу ESP32 с интерфейсом I2C с помощью ESP-IDF можно прочитать в этой статье.
Подключение OLED-дисплея к ESP32
В этом разделе мы подключим OLED-дисплей SSD1306 к плате разработки ESP32. Схема подключения приведена в следующей таблице.
| Плата ESP32 | OLED-дисплей SSD1306 |
| 3.3V or Vin | VCC |
| GPIO21(I2C SDA) | SDA |
| GPIO22(I2C SCL) | SCL |
| GND | GND |
Как мы уже упоминали, OLED-дисплей требует рабочего напряжения 3,3-5 В, поэтому мы можем подключить либо вывод 3,3 В, либо вывод Vin модуля ESP32 к выводу VCC дисплея. Выводы GND обоих выводов будут общими. Для подключения выводов I2C мы будем использовать стандартные выводы I2C платы ESP32. По умолчанию в ESP32 вывод GPIO22 настроен как вывод SCL, а вывод GPIO21 — как вывод SDA. Поэтому мы подключим вывод SDA дисплея к GPIO21, а вывод SCL дисплея — к GPIO22.
Схема подключения OLED-дисплея к ESP32
На приведенной ниже схеме показаны соединения между платой ESP32 и OLED-дисплеем. Мы использовали те же соединения, что и описано выше.
Прокрутка текста на OLED-дисплее с помощью ESP-IDF
Давайте создадим проект в ESP-IDF для тестирования нашего OLED-дисплея SSD1306. Мы продемонстрируем TextDemo от nopnop2002, загруженный на GitHub по следующей ссылке.
В этих примерах используется драйвер SSD1306/SH1106 для ESP-IDF.
Создание проекта
Откройте VS Code и перейдите в меню View > Command Palette («Вид» > «Палитра команд»). Введите в строке поиска ESP-IDF: New Project и нажмите Enter.
Укажите название проекта и каталог. Мы назвали наш проект «ESP_IDF_ssd1306_TextDemo». Для платы ESP-IDF мы выбрали опцию custom board («Пользовательская плата»). В качестве целевого модуля ESP-IDF мы выбрали модуль ESP32. Нажмите кнопку ‘Choose Template’ («Выбрать шаблон»), чтобы продолжить.
В разделе Extension («Расширение») выберите опцию ESP-IDF:
На вкладке get-started («Начало работы») мы щелкнем по пункту «sample_project». Затем нажмем ‘Create project using template sample_project’) («Создать проект, используя шаблон sample_project»).
Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».
Добавление библиотек
Это откроет созданный нами проект esp-idf во вкладке «Проводник». Внутри папки проекта находится несколько папок. Это относится ко всем проектам, которые вы будете создавать с помощью ESP-IDF Explorer. Создайте новую папку с именем «components» и скопируйте файлы по ссылке ниже в папку components вашего проекта. В этой папке будут содержаться библиотеки, необходимые для этого проекта. Скачать эти библиотеки можно по следующей ссылке.
Настройки MenuConfig в ESP-IDF для работы с OLED-дисплеем
Для начала перейдем к menuconfig. Откроется редактор конфигурации ESP-IDF SDK. Прокрутим вниз и откроем раздел SSD1306 Configuration (конфигурации SSD1306). Здесь мы можем установить параметры конфигурации SSD1306 в соответствии с нашими потребностями. Это включает в себя интерфейс UART, тип панели, контакты SCL GPIO, SDA GPIO и контакт сброса GPIO. Здесь вы можете увидеть, что по умолчанию ESP-IDF использует интерфейс I2C, тип панели 128×64, контакт SCL GPIO 22, контакт SDA GPIO 21 и контакт сброса GPIO 33. Вы можете изменить эти параметры в соответствии с вашим OLED-дисплеем, а затем нажать кнопку «Сохранить» вверху. Мы оставим настройки конфигурации по умолчанию, поскольку они соответствуют нашему модулю.
В качестве альтернативы, мы также можем установить это значение конфигурации с помощью menuconfig. Откройте menuconfig, набрав в терминале команду idf.py menuconfig. Эта команда откроет конфигурацию Espressif IoT Development Framework. Перейдите в раздел конфигурации SSD1306 и установите соответствующие параметры.
Код проекта
В папке main находится исходный код, то есть файл main.c будет находиться здесь. Внутри main.c мы напишем наш программный код. Перейдите в main > main.c и откройте его. Здесь мы определим функции и программный код. Скопируйте код по этой ссылке.
Это наш файл main.c.
Примечание: все примеры и библиотека для этого урока взяты отсюда.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "ssd1306.h" #include "font8x8_basic.h" /* You have to set this config value with menuconfig CONFIG_INTERFACE for i2c CONFIG_MODEL CONFIG_SDA_GPIO CONFIG_SCL_GPIO CONFIG_RESET_GPIO for SPI CONFIG_CS_GPIO CONFIG_DC_GPIO CONFIG_RESET_GPIO */ #define tag "SSD1306" void app_main(void) { SSD1306_t dev; int center, top, bottom; char lineChar[20]; #if CONFIG_I2C_INTERFACE ESP_LOGI(tag, "INTERFACE is i2c"); ESP_LOGI(tag, "CONFIG_SDA_GPIO=%d",CONFIG_SDA_GPIO); ESP_LOGI(tag, "CONFIG_SCL_GPIO=%d",CONFIG_SCL_GPIO); ESP_LOGI(tag, "CONFIG_RESET_GPIO=%d",CONFIG_RESET_GPIO); i2c_master_init(&dev, CONFIG_SDA_GPIO, CONFIG_SCL_GPIO, CONFIG_RESET_GPIO); #endif // CONFIG_I2C_INTERFACE #if CONFIG_SPI_INTERFACE ESP_LOGI(tag, "INTERFACE is SPI"); ESP_LOGI(tag, "CONFIG_MOSI_GPIO=%d",CONFIG_MOSI_GPIO); ESP_LOGI(tag, "CONFIG_SCLK_GPIO=%d",CONFIG_SCLK_GPIO); ESP_LOGI(tag, "CONFIG_CS_GPIO=%d",CONFIG_CS_GPIO); ESP_LOGI(tag, "CONFIG_DC_GPIO=%d",CONFIG_DC_GPIO); ESP_LOGI(tag, "CONFIG_RESET_GPIO=%d",CONFIG_RESET_GPIO); spi_master_init(&dev, CONFIG_MOSI_GPIO, CONFIG_SCLK_GPIO, CONFIG_CS_GPIO, CONFIG_DC_GPIO, CONFIG_RESET_GPIO); #endif // CONFIG_SPI_INTERFACE #if CONFIG_FLIP dev._flip = true; ESP_LOGW(tag, "Flip upside down"); #endif #if CONFIG_SSD1306_128x64 ESP_LOGI(tag, "Panel is 128x64"); ssd1306_init(&dev, 128, 64); #endif // CONFIG_SSD1306_128x64 #if CONFIG_SSD1306_128x32 ESP_LOGI(tag, "Panel is 128x32"); ssd1306_init(&dev, 128, 32); #endif // CONFIG_SSD1306_128x32 ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text_x3(&dev, 0, "Hello", 5, false); vTaskDelay(3000 / portTICK_PERIOD_MS); #if CONFIG_SSD1306_128x64 top = 2; center = 3; bottom = 8; ssd1306_display_text(&dev, 0, "SSD1306 128x64", 14, false); ssd1306_display_text(&dev, 1, "ABCDEFGHIJKLMNOP", 16, false); ssd1306_display_text(&dev, 2, "abcdefghijklmnop",16, false); ssd1306_display_text(&dev, 3, "Hello World!!", 13, false); //ssd1306_clear_line(&dev, 4, true); //ssd1306_clear_line(&dev, 5, true); //ssd1306_clear_line(&dev, 6, true); //ssd1306_clear_line(&dev, 7, true); ssd1306_display_text(&dev, 4, "SSD1306 128x64", 14, true); ssd1306_display_text(&dev, 5, "ABCDEFGHIJKLMNOP", 16, true); ssd1306_display_text(&dev, 6, "abcdefghijklmnop",16, true); ssd1306_display_text(&dev, 7, "Hello World!!", 13, true); #endif // CONFIG_SSD1306_128x64 #if CONFIG_SSD1306_128x32 top = 1; center = 1; bottom = 4; ssd1306_display_text(&dev, 0, "SSD1306 128x32", 14, false); ssd1306_display_text(&dev, 1, "Hello World!!", 13, false); //ssd1306_clear_line(&dev, 2, true); //ssd1306_clear_line(&dev, 3, true); ssd1306_display_text(&dev, 2, "SSD1306 128x32", 14, true); ssd1306_display_text(&dev, 3, "Hello World!!", 13, true); #endif // CONFIG_SSD1306_128x32 vTaskDelay(3000 / portTICK_PERIOD_MS); // Display Count Down uint8_t image[24]; memset(image, 0, sizeof(image)); ssd1306_display_image(&dev, top, (6*8-1), image, sizeof(image)); ssd1306_display_image(&dev, top+1, (6*8-1), image, sizeof(image)); ssd1306_display_image(&dev, top+2, (6*8-1), image, sizeof(image)); for(int font=0x39;font>0x30;font--) { memset(image, 0, sizeof(image)); ssd1306_display_image(&dev, top+1, (7*8-1), image, 8); memcpy(image, font8x8_basic_tr[font], 8); if (dev._flip) ssd1306_flip(image, 8); ssd1306_display_image(&dev, top+1, (7*8-1), image, 8); vTaskDelay(1000 / portTICK_PERIOD_MS); } // Scroll Up ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, 0, "---Scroll UP---", 16, true); //ssd1306_software_scroll(&dev, 7, 1); ssd1306_software_scroll(&dev, (dev._pages - 1), 1); for (int line=0;line<bottom+10;line++) { lineChar[0] = 0x01; sprintf(&lineChar[1], " Line %02d", line); ssd1306_scroll_text(&dev, lineChar, strlen(lineChar), false); vTaskDelay(500 / portTICK_PERIOD_MS); } vTaskDelay(3000 / portTICK_PERIOD_MS); // Scroll Down ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, 0, "--Scroll DOWN--", 16, true); //ssd1306_software_scroll(&dev, 1, 7); ssd1306_software_scroll(&dev, 1, (dev._pages - 1) ); for (int line=0;line<bottom+10;line++) { lineChar[0] = 0x02; sprintf(&lineChar[1], " Line %02d", line); ssd1306_scroll_text(&dev, lineChar, strlen(lineChar), false); vTaskDelay(500 / portTICK_PERIOD_MS); } vTaskDelay(3000 / portTICK_PERIOD_MS); // Page Down ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, 0, "---Page DOWN---", 16, true); ssd1306_software_scroll(&dev, 1, (dev._pages-1) ); for (int line=0;line<bottom+10;line++) { //if ( (line % 7) == 0) ssd1306_scroll_clear(&dev); if ( (line % (dev._pages-1)) == 0) ssd1306_scroll_clear(&dev); lineChar[0] = 0x02; sprintf(&lineChar[1], " Line %02d", line); ssd1306_scroll_text(&dev, lineChar, strlen(lineChar), false); vTaskDelay(500 / portTICK_PERIOD_MS); } vTaskDelay(3000 / portTICK_PERIOD_MS); // Horizontal Scroll ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, center, "Horizontal", 10, false); ssd1306_hardware_scroll(&dev, SCROLL_RIGHT); vTaskDelay(5000 / portTICK_PERIOD_MS); ssd1306_hardware_scroll(&dev, SCROLL_LEFT); vTaskDelay(5000 / portTICK_PERIOD_MS); ssd1306_hardware_scroll(&dev, SCROLL_STOP); // Vertical Scroll ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, center, "Vertical", 8, false); ssd1306_hardware_scroll(&dev, SCROLL_DOWN); vTaskDelay(5000 / portTICK_PERIOD_MS); ssd1306_hardware_scroll(&dev, SCROLL_UP); vTaskDelay(5000 / portTICK_PERIOD_MS); ssd1306_hardware_scroll(&dev, SCROLL_STOP); // Invert ssd1306_clear_screen(&dev, true); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, center, " Good Bye!!", 12, true); vTaskDelay(5000 / portTICK_PERIOD_MS); // Fade Out ssd1306_fadeout(&dev); #if 0 // Fade Out for(int contrast=0xff;contrast>0;contrast=contrast-0x20) { ssd1306_contrast(&dev, contrast); vTaskDelay(40); } #endif // Restart module esp_restart(); } |
Как работает код?
Примечание: этот код применим к OLED-дисплеям с различными типами панелей и интерфейсами. Условия #if #endif будут работать в зависимости от конкретного заданного параметра. Поэтому мы рассмотрим те части, которые применимы к параметрам конфигурации нашего SSD1306.
Во-первых, код начинается с подключения необходимых библиотек, включая библиотеки FreeRTOS для генерации задержек, драйвер ssd1306.h для работы с OLED-дисплеем, файл font8x8_basic.h, содержащий набор ASCII-шрифтов размером 8×8 пикселей, и файл esp_log.h для отладки.
|
1 2 3 4 5 6 7 8 9 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "ssd1306.h" #include "font8x8_basic.h" |
Инициализация интерфейса I2C и OLED-дисплея
Внутри функции app_main() сначала настраивается интерфейс I2C. Текущие настройки, заданные в menuconfig, будут выведены в терминал. Это включает тип интерфейса, контакты SDA GPIO, SCL GPIO и Reset GPIO. Кроме того, интерфейс I2C будет настроен путем вызова функции i2c_master_init() и передачи в качестве параметров адреса структуры SSD1306_t, контактов SDA, SCL и Reset.
|
1 2 3 4 5 6 7 |
#if CONFIG_I2C_INTERFACE ESP_LOGI(tag, "INTERFACE is i2c"); ESP_LOGI(tag, "CONFIG_SDA_GPIO=%d",CONFIG_SDA_GPIO); ESP_LOGI(tag, "CONFIG_SCL_GPIO=%d",CONFIG_SCL_GPIO); ESP_LOGI(tag, "CONFIG_RESET_GPIO=%d",CONFIG_RESET_GPIO); i2c_master_init(&dev, CONFIG_SDA_GPIO, CONFIG_SCL_GPIO, CONFIG_RESET_GPIO); #endif // CONFIG_I2C_INTERFACE |
Следующая инструкция выведет тип панели на терминал. Кроме того, она инициализирует OLED-дисплей, вызвав функцию ssd1306_init(). Эта функция принимает три параметра. Первый параметр — это адрес структуры SSD1306_t, второй — ширина, а третий — высота дисплея в пикселях. Мы используем дисплей 128×64, поэтому ширина равна 128, а высота — 64.
|
1 2 3 4 |
#if CONFIG_SSD1306_128x64 ESP_LOGI(tag, "Panel is 128x64"); ssd1306_init(&dev, 128, 64); #endif // CONFIG_SSD1306_128x64 |
Очистка экрана и установка контрастности
Далее следует несколько вызовов функций. Сначала экран OLED-дисплея очищается с помощью функции ssd1306_clear_screen(). Эта функция принимает два параметра. Первый — это адрес структуры SSD1306_t, а второй — переменная типа invert, которая имеет значение false. Это означает, что фон будет темным, а текст будет отображаться белым.
|
1 |
ssd1306_clear_screen(&dev, false); |
Во-вторых, контрастность экрана устанавливается с помощью функции ssd1306_contrast(). Эта функция принимает два параметра. Первый — это адрес структуры SSD1306_t, а второй — значение контрастности, которое представляет собой целочисленную переменную. Оно устанавливается равным 0xff.
|
1 |
ssd1306_contrast(&dev, 0xff); |
Отображаемый текст
Затем на экране отображается текст «Hello» с помощью функции ssd1306_display_text_x3(). Текст будет отображаться на экране в течение трех секунд. Функция принимает пять параметров. Первый параметр — адрес структуры SSD1306_t. Второй параметр — номер страницы данных композиции, который устанавливается равным 0. Третий параметр — текст, который мы хотим отобразить. В данном случае это «Hello». Четвертый параметр — длина текста, которая задается как 5. Наконец, пятый параметр — invert, это логическая переменная, которая устанавливается в значение false. Это означает, что фон темный, а текст будет отображаться белым цветом.
|
1 2 |
ssd1306_display_text_x3(&dev, 0, "Hello", 5, false); vTaskDelay(3000 / portTICK_PERIOD_MS); |

Отображение текста и его инвертирование
Далее у нас есть еще один блок кода для конфигурации SSD1306 128×64. Он отображает серию текстов, заполняющих весь экран. Начнем с определения значений top, center и bottom. Затем несколько раз вызываем функцию ssd_1306_display_text() для отображения различных сообщений со значениями invert как false, так и true. Когда invert установлено как false, фон темный, а текст отображается белым. Аналогично, когда invert установлено как true, фон светлый, а текст отображается черным. Эта функция принимает те же параметры, что и ssd1306_display_text_x3().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#if CONFIG_SSD1306_128x64 top = 2; center = 3; bottom = 8; ssd1306_display_text(&dev, 0, "SSD1306 128x64", 14, false); ssd1306_display_text(&dev, 1, "ABCDEFGHIJKLMNOP", 16, false); ssd1306_display_text(&dev, 2, "abcdefghijklmnop",16, false); ssd1306_display_text(&dev, 3, "Hello World!!", 13, false); ssd1306_display_text(&dev, 4, "SSD1306 128x64", 14, true); ssd1306_display_text(&dev, 5, "ABCDEFGHIJKLMNOP", 16, true); ssd1306_display_text(&dev, 6, "abcdefghijklmnop",16, true); ssd1306_display_text(&dev, 7, "Hello World!!", 13, true); #endif // CONFIG_SSD1306_128x64 |

Отображаемые числа
Далее мы отобразим в центре экрана ряд чисел, которые будут отсчитываться от 9 до 0. Каждое число будет оставаться на экране в течение секунды, а затем исчезнет, и на его месте появится следующее число.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Display Count Down uint8_t image[24]; memset(image, 0, sizeof(image)); ssd1306_display_image(&dev, top, (6*8-1), image, sizeof(image)); ssd1306_display_image(&dev, top+1, (6*8-1), image, sizeof(image)); ssd1306_display_image(&dev, top+2, (6*8-1), image, sizeof(image)); for(int font=0x39;font>0x30;font--) { memset(image, 0, sizeof(image)); ssd1306_display_image(&dev, top+1, (7*8-1), image, 8); memcpy(image, font8x8_basic_tr[font], 8); if (dev._flip) ssd1306_flip(image, 8); ssd1306_display_image(&dev, top+1, (7*8-1), image, 8); vTaskDelay(1000 / portTICK_PERIOD_MS); } |

Прокрутка вверх и вниз
Теперь мы будем прокручивать текст вверх и вниз по экрану. Сначала очистим экран и установим контраст. Затем отобразим текст “—Scroll UP—“. После этого вызовем функцию ssd1306_software_scroll() и передадим ей три параметра. Первый параметр — это адрес структуры SSD1306_t. Второй параметр — start, который устанавливается как (dev._pages – 1), а третий параметр — end, который устанавливается как 1. Затем используем цикл for для отображения прокручиваемого текста, который будет начинаться со строки 00 и заканчиваться на строке 17, прокручиваясь снизу вверх (прокрутка вверх). Это будет достигнуто с помощью функции ssd1306_scroll_text().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Scroll Up ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, 0, "---Scroll UP---", 16, true); ssd1306_software_scroll(&dev, (dev._pages - 1), 1); for (int line=0;line<bottom+10;line++) { lineChar[0] = 0x01; sprintf(&lineChar[1], " Line %02d", line); ssd1306_scroll_text(&dev, lineChar, strlen(lineChar), false); vTaskDelay(500 / portTICK_PERIOD_MS); } vTaskDelay(3000 / portTICK_PERIOD_MS); |

После завершения прокрутки вверх перейдём к прокрутке вниз. Сначала очистим экран и установим контраст. Затем отобразим текст “—Scroll DOWN—“. После этого вызовем функцию ssd1306_software_scroll() и передадим ей три параметра. Первый параметр — адрес структуры SSD1306_t. Второй параметр — start, который устанавливается равным 1, а третий параметр — end, который устанавливается равным (dev._pages – 1). Затем используем цикл for для отображения прокручиваемого текста, который начнётся со строки 00 и закончится на строке 17, при этом прокрутка будет происходить сверху вниз (прокрутка вниз). Это будет достигнуто с помощью функции ssd1306_scroll_text().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Scroll Down ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, 0, "--Scroll DOWN--", 16, true); //ssd1306_software_scroll(&dev, 1, 7); ssd1306_software_scroll(&dev, 1, (dev._pages - 1) ); for (int line=0;line<bottom+10;line++) { lineChar[0] = 0x02; sprintf(&lineChar[1], " Line %02d", line); ssd1306_scroll_text(&dev, lineChar, strlen(lineChar), false); vTaskDelay(500 / portTICK_PERIOD_MS); } vTaskDelay(3000 / portTICK_PERIOD_MS); |

Перемещение текста вниз страницы
Далее у нас есть фрагмент кода для прокрутки страницы вниз. Он похож на прокрутку вниз, однако в этом случае текст не прокручивается автоматически вниз, а когда достигает конца экрана, исчезает, и на его место появляется новый.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Page Down ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, 0, "---Page DOWN---", 16, true); ssd1306_software_scroll(&dev, 1, (dev._pages-1) ); for (int line=0;line<bottom+10;line++) { if ( (line % (dev._pages-1)) == 0) ssd1306_scroll_clear(&dev); lineChar[0] = 0x02; sprintf(&lineChar[1], " Line %02d", line); ssd1306_scroll_text(&dev, lineChar, strlen(lineChar), false); vTaskDelay(500 / portTICK_PERIOD_MS); } vTaskDelay(3000 / portTICK_PERIOD_MS); |

Горизонтальная и вертикальная прокрутка текста
Далее мы прокручиваем текст «Horizontal» горизонтально по экрану. Это достигается с помощью следующего фрагмента кода. Как всегда, сначала очищается экран и устанавливается значение контрастности. Затем в центре отображается текст «Horizontal» на черном фоне с белым текстом (инвертировать — false). После этого мы используем функцию ssd1306_hardware_scroll() для прокрутки текста сначала вправо (SCROLL_RIGHT), затем с задержкой в 5 секунд — влево (SCROLL_LEFT) и, наконец, останавливаем прокрутку (SCROLL_STOP) еще через 5 секунд. Эта функция принимает только два параметра. Первый параметр — это адрес структуры SSD1306_t, а второй — тип прокрутки.
|
1 2 3 4 5 6 7 8 9 |
// Horizontal Scroll ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, center, "Horizontal", 10, false); ssd1306_hardware_scroll(&dev, SCROLL_RIGHT); vTaskDelay(5000 / portTICK_PERIOD_MS); ssd1306_hardware_scroll(&dev, SCROLL_LEFT); vTaskDelay(5000 / portTICK_PERIOD_MS); ssd1306_hardware_scroll(&dev, SCROLL_STOP); |

Аналогичным образом мы будем прокручивать текст «Vertical» вертикально по экрану. Это достигается с помощью следующего фрагмента кода. Как всегда, сначала очищается экран и устанавливается значение контрастности. Затем отображается текст «Vertical» в центре на черном фоне с белым текстом (инвертировать -false). После этого мы используем функцию ssd1306_hardware_scroll() для прокрутки текста сначала вниз (SCROLL_DOWN), затем с задержкой в 5 секунд прокручиваем его обратно вверх (SCROLL_UP) и останавливаем (SCROLL_STOP) еще через 5 секунд. Эта функция принимает только два параметра. Первый параметр — это адрес структуры SSD1306_t, а второй — тип прокрутки.
|
1 2 3 4 5 6 7 8 9 |
// Vertical Scroll ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, center, "Vertical", 8, false); ssd1306_hardware_scroll(&dev, SCROLL_DOWN); vTaskDelay(5000 / portTICK_PERIOD_MS); ssd1306_hardware_scroll(&dev, SCROLL_UP); vTaskDelay(5000 / portTICK_PERIOD_MS); ssd1306_hardware_scroll(&dev, SCROLL_STOP); |

Наконец, после очистки экрана и настройки контраста, мы отобразим текст ”Good Bye!!” («До свидания!!») в центре. Фон будет белым, а цвет текста — чёрным. Это связано с тем, что в данном случае параметр «инвертировать» установлен в значение «истина».
|
1 2 3 4 5 |
// Invert ssd1306_clear_screen(&dev, true); ssd1306_contrast(&dev, 0xff); ssd1306_display_text(&dev, center, " Good Bye!!", 12, true); vTaskDelay(5000 / portTICK_PERIOD_MS); |

Затем экран медленно гаснет и становится чёрным. Вскоре плата ESP32 снова перезагружается.
|
1 2 |
ssd1306_fadeout(&dev); esp_restart(); |
Компиляция скетча
Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.
|
1 |
idf.py -p COMX flash monitor |
После успешной прошивки кода вы сможете просмотреть выводимые информационные сообщения, отображающие параметры конфигурации SSD1306 и его состояние.
OLED-дисплей начнет отображать различные текстовые элементы и функции прокрутки.
Анимация на экране OLED-дисплея с помощью ESP-IDF
После демонстрации того, как вы использовали драйвер SSD1306 для отображения текста и применения различных эффектов прокрутки, давайте рассмотрим результаты работы нескольких других примеров, использующих драйвер SSD1306/SH1106 для ESP-IDF, предоставленный nopnop2002 на GitHub. Мы продемонстрируем AnimationDemo от nopnop2002, загруженный на GitHub по следующей ссылке, но будем использовать для демонстрации другие кадры изображений.
Создание проекта
Откройте VS Code и перейдите в меню View > Command Palette («Вид» > «Палитра команд»). Введите в строке поиска ESP-IDF: New Project и нажмите Enter.
Укажите название проекта и каталог. Мы назвали наш проект «ESP_IDF_SSD1306_AnimationDemo». Для платы ESP-IDF мы выбрали опцию custom board («Пользовательская плата»). В качестве целевой платформы ESP-IDF мы выбрали модуль ESP32. Нажмите кнопку ‘Choose Template’ («Выбрать шаблон»), чтобы продолжить.
В разделе Extension («Расширение») выберите опцию ESP-IDF:
На вкладке get-started («Начало работы») мы щелкнем по пункту «sample_project». Затем нажмем ‘Create project using template sample_project’) («Создать проект, используя шаблон sample_project»).
Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».
Добавление библиотек
Это откроет созданный нами проект во вкладке «Проводник». Внутри папки проекта находится несколько папок. Создайте новую папку с именем «components» и скопируйте файлы из неё в папку проекта. В этой папке будут содержаться библиотеки, необходимые для данного проекта.
Конфигурация SSD1306
Для начала перейдем к menuconfig. Откроется редактор конфигурации ESP-IDF SDK. Прокрутим вниз и откроем раздел конфигурации SSD1306. Здесь мы можем установить параметры конфигурации SSD1306 в соответствии с нашими потребностями. Это включает в себя интерфейс UART, тип панели, контакты SCL GPIO, SDA GPIO и контакт сброса GPIO. Здесь вы можете увидеть, что по умолчанию ESP-IDF использует интерфейс I2C, тип панели 128×64, контакт SCL GPIO 22, контакт SDA GPIO 21 и контакт сброса GPIO 33. Вы можете изменить эти параметры в соответствии с вашим OLED-дисплеем, а затем нажать кнопку «Сохранить» вверху. Мы оставим настройки конфигурации по умолчанию, поскольку они соответствуют нашему модулю.
В качестве альтернативы, мы также можем установить это значение конфигурации с помощью menuconfig. Откройте menuconfig, набрав в терминале команду idf.py menuconfig. Эта команда откроет конфигурацию Espressif IoT Development Framework. Перейдите в раздел конфигурации SSD1306 и установите соответствующие параметры.
Код проекта
Перейдите в папку main > main.c и откройте её. Здесь мы определим функции и программный код. Это наш файл main.c.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "ssd1306.h" #include "font8x8_basic.h" /* You have to set this config value with menuconfig CONFIG_INTERFACE for i2c CONFIG_MODEL CONFIG_SDA_GPIO CONFIG_SCL_GPIO CONFIG_RESET_GPIO for SPI CONFIG_CS_GPIO CONFIG_DC_GPIO CONFIG_RESET_GPIO */ #define TAG "SSD1306" const unsigned char myBitmap[4] [1024] = { // 'frame1, 64x128px { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7c, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7c, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7c, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7c, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xf0, 0x1f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xf0, 0x1f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xf0, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xf0, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x47, 0xf3, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x78, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x78, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x78, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x78, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xc0, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xfc, 0x00, 0xc0, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xfc, 0x00, 0xc0, 0x00, 0x01, 0x8f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xc0, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xc0, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xc0, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xc0, 0x0f, 0xff, 0xff, 0xf3, 0xe0, 0x00, 0x3f, 0xe0, 0x3f, 0xff, 0xff, 0xf3, 0xe0, 0x00, 0x7f, 0xf8, 0x3f, 0xff, 0xff, 0xf3, 0xe0, 0x00, 0x7f, 0xf8, 0x3f, 0xff, 0xff, 0xf3, 0xe0, 0x00, 0x7f, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, // 'frame2, 64x128px { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x03, 0xff, 0x07, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x03, 0xff, 0x07, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x03, 0xff, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x78, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x78, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x78, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x78, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x06, 0x00, 0x00, 0x7c, 0x00, 0xff, 0xff, 0xe0, 0x06, 0x00, 0x00, 0x7c, 0x00, 0xff, 0xff, 0xe0, 0x06, 0x00, 0x00, 0x7c, 0x00, 0xff, 0xff, 0x80, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x83, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x83, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x83, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x83, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0x80, 0x67, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0x80, 0x67, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0x80, 0x67, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x80, 0x07, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xe0, 0x07, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xe0, 0x07, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xe0, 0x07, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xe0, 0x07, 0xff, 0xff, 0xff, 0x1e, 0x00, 0x3f, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0x1e, 0x00, 0x3f, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0x1e, 0x00, 0x3f, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0x1e, 0x00, 0x3f, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, // 'frame3, 64x128px { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x3e, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x3e, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x3e, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x3e, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x0c, 0x0f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x0c, 0x0f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x0c, 0x0f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x0c, 0x0f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x10, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x10, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x10, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x10, 0x01, 0x8f, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xfe, 0x01, 0x8f, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xfe, 0x01, 0x8f, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xfe, 0x01, 0x8f, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xfe, 0x01, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff }, // 'frame4, 64x128px { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff } }; void app_main(void) { SSD1306_t dev; #if CONFIG_I2C_INTERFACE ESP_LOGI(TAG, "INTERFACE is i2c"); ESP_LOGI(TAG, "CONFIG_SDA_GPIO=%d",CONFIG_SDA_GPIO); ESP_LOGI(TAG, "CONFIG_SCL_GPIO=%d",CONFIG_SCL_GPIO); ESP_LOGI(TAG, "CONFIG_RESET_GPIO=%d",CONFIG_RESET_GPIO); i2c_master_init(&dev, CONFIG_SDA_GPIO, CONFIG_SCL_GPIO, CONFIG_RESET_GPIO); #endif // CONFIG_I2C_INTERFACE #if CONFIG_SPI_INTERFACE ESP_LOGI(TAG, "INTERFACE is SPI"); ESP_LOGI(TAG, "CONFIG_MOSI_GPIO=%d",CONFIG_MOSI_GPIO); ESP_LOGI(TAG, "CONFIG_SCLK_GPIO=%d",CONFIG_SCLK_GPIO); ESP_LOGI(TAG, "CONFIG_CS_GPIO=%d",CONFIG_CS_GPIO); ESP_LOGI(TAG, "CONFIG_DC_GPIO=%d",CONFIG_DC_GPIO); ESP_LOGI(TAG, "CONFIG_RESET_GPIO=%d",CONFIG_RESET_GPIO); spi_master_init(&dev, CONFIG_MOSI_GPIO, CONFIG_SCLK_GPIO, CONFIG_CS_GPIO, CONFIG_DC_GPIO, CONFIG_RESET_GPIO); #endif // CONFIG_SPI_INTERFACE #if CONFIG_SSD1306_128x64 ESP_LOGI(TAG, "Panel is 128x64"); ssd1306_init(&dev, 128, 64); #endif // CONFIG_SSD1306_128x64 #if CONFIG_SSD1306_128x32 ESP_LOGE(TAG, "Panel is 128x32. This demo cannot be run."); while(1) { vTaskDelay(1); } #endif // CONFIG_SSD1306_128x32 ssd1306_contrast(&dev, 0xff); ssd1306_clear_screen(&dev, false); int count = 3; uint8_t segs[128]; while(1) { TickType_t startTick = xTaskGetTickCount(); // 1Ticks required for (int page=0;page<8;page++) { for (int seg=0;seg<128;seg++) { segs[seg] = ssd1306_rotate_byte(myBitmap[count][seg*8+page]); } ssd1306_display_image(&dev, page, 0, segs, 128); } TickType_t endTick = xTaskGetTickCount(); ESP_LOGD(TAG, "diffTick=%d", endTick - startTick); count--; if (count<0) count = 3; vTaskDelay(10); } vTaskDelay(2000 / portTICK_PERIOD_MS); } |
Компиляция скетча
Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.
|
1 |
idf.py -p COMX flash monitor |
После успешной прошивки кода вы сможете просмотреть выводимые информационные сообщения, отображающие параметры конфигурации SSD1306 и его состояние.
На OLED-экране начнет отображаться движущаяся анимация.
Отображение значения счетчика на OLED-дисплее с помощью ESP32 и ESP-IDF
В этом разделе мы продемонстрируем CounterDemo от nopnop2002, загруженный на GitHub по следующей ссылке.
Создание проекта
Откройте VS Code и перейдите в меню View > Command Palette («Вид» > «Палитра команд»). Введите в строке поиска ESP-IDF: New Project и нажмите Enter.
Укажите название проекта и каталог. Мы назвали наш проект «ESP_IDF_SSD1306_CounterDemo». Для платы ESP-IDF мы выбрали опцию custom board («Пользовательская плата»). В качестве целевого модуля ESP-IDF мы выбрали модуль ESP32. Нажмите кнопку ‘Choose Template’ («Выбрать шаблон»), чтобы продолжить.
В разделе Extension («Расширение») выберите опцию ESP-IDF:
На вкладке get-started («Начало работы») мы щелкнем по пункту «sample_project». Затем нажмем ‘Create project using template sample_project’) («Создать проект, используя шаблон sample_project»).
Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».
Добавление библиотек
Это откроет созданный нами проект во вкладке «Проводник». Внутри папки проекта находится несколько папок. Создайте новую папку с именем «Компоненты» и скопируйте файлы из неё в папку проекта. В этой папке будут содержаться библиотеки, необходимые для этого проекта.
Конфигурация SSD1306
Для начала перейдем к menuconfig. Откроется редактор конфигурации ESP-IDF SDK. Прокрутим вниз и откроем раздел конфигурации SSD1306. Здесь мы можем установить параметры конфигурации SSD1306 в соответствии с нашими потребностями. Это включает в себя интерфейс UART, тип панели, контакты SCL GPIO, SDA GPIO и контакт сброса GPIO. Здесь вы можете увидеть, что по умолчанию ESP-IDF использует интерфейс I2C, тип панели 128×64, контакт SCL GPIO 22, контакт SDA GPIO 21 и контакт сброса GPIO 33. Вы можете изменить эти параметры в соответствии с вашим OLED-дисплеем, а затем нажать кнопку «Сохранить» вверху. Мы оставим настройки конфигурации по умолчанию, поскольку они соответствуют нашему модулю.
В качестве альтернативы, мы также можем установить это значение конфигурации с помощью menuconfig. Откройте menuconfig, набрав в терминале команду idf.py menuconfig. Эта команда откроет конфигурацию Espressif IoT Development Framework. Перейдите в раздел конфигурации SSD1306 и установите соответствующие параметры.
Код проекта
Перейдите в main > main.c и откройте его. Здесь мы определим функции и программный код. Скопируйте код по этой ссылке.
Это наш файл main.c.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "ssd1306.h" #include "font8x8_basic.h" /* You have to set this config value with menuconfig CONFIG_INTERFACE for i2c CONFIG_MODEL CONFIG_SDA_GPIO CONFIG_SCL_GPIO CONFIG_RESET_GPIO for SPI CONFIG_CS_GPIO CONFIG_DC_GPIO CONFIG_RESET_GPIO */ #define TAG "SSD1306" #define IMAGES 10 uint8_t segmentDisplay[IMAGES][192] = { { // https://www.iconspng.com/image/5656/seven-segment-display-gray-0 // 'seven-segment-display-gray-0', 32x48px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x06, 0xff, 0xff, 0x60, 0x07, 0x7f, 0xfe, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { // https://www.iconspng.com/image/5657/seven-segment-display-gray-1 // 'seven-segment-display-gray-1', 32x48px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { // https://www.iconspng.com/image/5658/seven-segment-display-gray-2 // 'seven-segment-display-gray-2', 32x48px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0x60, 0x00, 0xff, 0xfe, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x7f, 0xfe, 0xe0, 0x01, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0x00, 0x07, 0x7f, 0xfe, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0x80, 0x07, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { // https://www.iconspng.com/image/5659/seven-segment-display-gray-3 // 'seven-segment-display-gray-3', 32x48px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0x60, 0x00, 0xff, 0xfe, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x7f, 0xfe, 0xe0, 0x01, 0xff, 0xff, 0x80, 0x01, 0xff, 0xff, 0x40, 0x00, 0x7f, 0xfe, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { // https://www.iconspng.com/image/5660/seven-segment-display-gray-4 // 'seven-segment-display-gray-4', 32x48px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x7f, 0xfe, 0xe0, 0x03, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0x40, 0x00, 0x7f, 0xfe, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { // https://www.iconspng.com/image/5661/seven-segment-display-gray-5 // 'seven-segment-display-gray-5', 32x48px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xc0, 0x06, 0xff, 0xff, 0x80, 0x07, 0x7f, 0xff, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x7f, 0xfe, 0x00, 0x03, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xfe, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { // https://www.iconspng.com/image/5662/seven-segment-display-gray-6 // 'seven-segment-display-gray-6', 32x48px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xc0, 0x06, 0xff, 0xff, 0x80, 0x07, 0x7f, 0xff, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x7f, 0xfe, 0x00, 0x01, 0xff, 0xff, 0x80, 0x02, 0xff, 0xff, 0xc0, 0x07, 0x7f, 0xfe, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { // https://www.iconspng.com/image/5663/seven-segment-display // 'seven-segment-display-gray-7', 32x48px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0x60, 0x00, 0xff, 0xfe, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { // https://www.iconspng.com/image/5664/seven-segment-display-gray-8 // 'seven-segment-display-gray-8', 32x48px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x06, 0xff, 0xff, 0x60, 0x07, 0x7f, 0xfe, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x7f, 0xfe, 0xe0, 0x01, 0xff, 0xff, 0x80, 0x02, 0xff, 0xff, 0x40, 0x07, 0x7f, 0xfe, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { // https://www.iconspng.com/image/5665/seven-segment-display // 'seven-segment-display-gray-9', 32x48px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x06, 0xff, 0xff, 0x60, 0x07, 0x7f, 0xfe, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x80, 0x01, 0xe0, 0x07, 0x7f, 0xfe, 0xe0, 0x03, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0x40, 0x00, 0x7f, 0xfe, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; void app_main(void) { SSD1306_t dev; #if CONFIG_I2C_INTERFACE ESP_LOGI(TAG, "INTERFACE is i2c"); ESP_LOGI(TAG, "CONFIG_SDA_GPIO=%d",CONFIG_SDA_GPIO); ESP_LOGI(TAG, "CONFIG_SCL_GPIO=%d",CONFIG_SCL_GPIO); ESP_LOGI(TAG, "CONFIG_RESET_GPIO=%d",CONFIG_RESET_GPIO); i2c_master_init(&dev, CONFIG_SDA_GPIO, CONFIG_SCL_GPIO, CONFIG_RESET_GPIO); #endif // CONFIG_I2C_INTERFACE #if CONFIG_SPI_INTERFACE ESP_LOGI(TAG, "INTERFACE is SPI"); ESP_LOGI(TAG, "CONFIG_MOSI_GPIO=%d",CONFIG_MOSI_GPIO); ESP_LOGI(TAG, "CONFIG_SCLK_GPIO=%d",CONFIG_SCLK_GPIO); ESP_LOGI(TAG, "CONFIG_CS_GPIO=%d",CONFIG_CS_GPIO); ESP_LOGI(TAG, "CONFIG_DC_GPIO=%d",CONFIG_DC_GPIO); ESP_LOGI(TAG, "CONFIG_RESET_GPIO=%d",CONFIG_RESET_GPIO); spi_master_init(&dev, CONFIG_MOSI_GPIO, CONFIG_SCLK_GPIO, CONFIG_CS_GPIO, CONFIG_DC_GPIO, CONFIG_RESET_GPIO); #endif // CONFIG_SPI_INTERFACE #if CONFIG_FLIP dev._flip = true; ESP_LOGW(TAG, "Flip upside down"); #endif #if CONFIG_SSD1306_128x64 ESP_LOGI(TAG, "Panel is 128x64"); ssd1306_init(&dev, 128, 64); #endif // CONFIG_SSD1306_128x64 #if CONFIG_SSD1306_128x32 ESP_LOGE(TAG, "Panel is 128x32. This demo cannot be run."); while(1) { vTaskDelay(1); } #endif // CONFIG_SSD1306_128x32 ssd1306_contrast(&dev, 0xff); // Allocate memory uint8_t *buffer = (uint8_t *)malloc(8*128); // 8 page 128 pixel if (buffer == NULL) { ESP_LOGE(TAG, "malloc failed"); while(1) { vTaskDelay(1); } } uint8_t *segmentImage = (uint8_t *)malloc(IMAGES*8*32); // 10 image 8 page 32pixel if (segmentImage == NULL) { ESP_LOGE(TAG, "malloc failed"); while(1) { vTaskDelay(1); } } // Convert from segmentDisplay to segmentImage for (int imageIndex=0;imageIndex<IMAGES;imageIndex++) { ssd1306_clear_screen(&dev, false); ssd1306_bitmaps(&dev, 0, 8, segmentDisplay[imageIndex], 32, 48, false); vTaskDelay(200 / portTICK_PERIOD_MS); // Get from internal buffer to local buffer // buffer is [8][128] 8 page 128 pixel ssd1306_get_buffer(&dev, buffer); // Save from buffer to segmentImage // segmentImage is [10][8][32] 10 image 8 page 32 pixel int segmentImageIndex = imageIndex * 256; for (int page=0;page<8;page++) { //ESP_LOGI(TAG, "segmentImageIndex+page*32=%d", segmentImageIndex+page*32); memcpy(&segmentImage[segmentImageIndex+page*32], &buffer[page*128], 32); //ESP_LOGI(TAG, "page=%d", page); //ESP_LOG_BUFFER_HEXDUMP(TAG, &buffer[page*128], 32, ESP_LOG_INFO); } #if 0 ssd1306_clear_screen(&dev, false); for (int page=0;page<8;page++) { ssd1306_display_image(&dev, page, 0, &segmentImage[segmentImageIndex+page*32], 32); //ESP_LOGI(TAG, "page=%d", page); //ESP_LOG_BUFFER_HEXDUMP(TAG, &segmentImage[segmentImageIndex+page*32], 32, ESP_LOG_INFO); } vTaskDelay(1000 / portTICK_PERIOD_MS); #endif } // I don't use this anymore free(buffer); int digit1 = 0; int digit2 = 0; int digit3 = 0; int digit4 = 0; ssd1306_clear_screen(&dev, false); for (int page=0;page<8;page++) { ssd1306_display_image(&dev, page, 0, &segmentImage[page*32], 32); ssd1306_display_image(&dev, page, 32, &segmentImage[page*32], 32); ssd1306_display_image(&dev, page, 64, &segmentImage[page*32], 32); ssd1306_display_image(&dev, page, 96, &segmentImage[page*32], 32); vTaskDelay(2); } while(1) { digit4++; if (digit4 == 10) { digit4 = 0; int segmentImageIndex4 = digit4 * 256; for (int page=0;page<8;page++) { ssd1306_display_image(&dev, page, 96, &segmentImage[segmentImageIndex4+page*32], 32); } digit3++; if (digit3 == 10) { digit3 = 0; digit2++; if (digit2 == 10) { digit2 = 0; digit1++; if (digit1 == 10) { digit1 = 0; digit2 = 0; digit3 = 0; digit4 = 0; } // Update digit1 int segmentImageIndex1 = digit1 * 256; for (int page=0;page<8;page++) { ssd1306_display_image(&dev, page, 00, &segmentImage[segmentImageIndex1+page*32], 32); } } // Update digit2 int segmentImageIndex2 = digit2 * 256; for (int page=0;page<8;page++) { ssd1306_display_image(&dev, page, 32, &segmentImage[segmentImageIndex2+page*32], 32); } } // Update digit3 int segmentImageIndex3 = digit3 * 256; for (int page=0;page<8;page++) { ssd1306_display_image(&dev, page, 64, &segmentImage[segmentImageIndex3+page*32], 32); } } else { // Update digit4 int segmentImageIndex4 = digit4 * 256; for (int page=0;page<8;page++) { ssd1306_display_image(&dev, page, 96, &segmentImage[segmentImageIndex4+page*32], 32); } } vTaskDelay(8); } // end while } |
Компиляция скетча
Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.
|
1 |
idf.py -p COMX flash monitor |
После успешной прошивки кода вы сможете просмотреть выводимые информационные сообщения, отображающие параметры конфигурации SSD1306 и его состояние.
На OLED-дисплее начнет отображаться счетчик.
6 просмотров














