Подключение OLED-дисплея к ESP32 с использованием ESP-IDF


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

В статье мы рассмотрим как работает 0,96-дюймовый OLED-дисплей, как его подключить к плате ESP32, а также использование драйвера SSD1306/SH1106 для ESP-IDF для отображения текста, бегущей строки, изображений и анимации на OLED-дисплее.

Прежде чем продолжить, убедитесь, что у вас установлена ​​последняя версия VS Code и настроено расширение ESP-IDF:

Также на нашем сайте вы можете прочитать статью про подключение OLED дисплея к модулю ESP32 с помощью Arduino IDE.

0,96-дюймовый OLED-дисплей SSD1306

OLED — это органический светодиод, состоящий из двух органических тонких пленок, соединенных последовательно между двумя электрическими проводниками. На рынке представлено несколько версий OLED-дисплеев. В этом руководстве рассматривается OLED-дисплей SSD1306 с диагональю 0,96 дюйма и разрешением 128×64 пикселя. Контроллер SSD1306 является основным компонентом этого дисплея, обеспечивающим связь по протоколам I2C/SPI между микроконтроллерами. Используемый нами OLED-дисплей взаимодействует только по протоколу I2C, поэтому у него четыре контакта, которые необходимо подключить к плате ESP32.

На приведенной ниже схеме показана распиновка OLED-дисплея, который мы будем использовать.

Распиновка 0,96-дюймового OLED-дисплея (только I2C)

Как видно на схеме расположения контактов выше, этот 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.

Контакты I2C платы ESP32, которые мы используем в данном проекте

Схема подключения OLED-дисплея к ESP32

На приведенной ниже схеме показаны соединения между платой ESP32 и OLED-дисплеем. Мы использовали те же соединения, что и описано выше.

Схема подключения OLED-дисплея к ESP32

Прокрутка текста на 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’ («Выбрать шаблон»), чтобы продолжить.

Создание проекта для прокрутки текста на OLED-дисплее

В разделе Extension («Расширение») выберите опцию ESP-IDF:

Выбор опции ESP-IDF в разделе Extension («Расширение»)

На вкладке get-started («Начало работы») мы щелкнем по пункту «sample_project». Затем нажмем ‘Create project using template sample_project’) («Создать проект, используя шаблон 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 в ESP-IDF для работы с OLED-дисплеем

В качестве альтернативы, мы также можем установить это значение конфигурации с помощью menuconfig. Откройте menuconfig, набрав в терминале команду idf.py menuconfig. Эта команда откроет конфигурацию Espressif IoT Development Framework. Перейдите в раздел конфигурации SSD1306 и установите соответствующие параметры.

Код проекта

В папке main находится исходный код, то есть файл main.c будет находиться здесь. Внутри main.c мы напишем наш программный код. Перейдите в main > main.c и откройте его. Здесь мы определим функции и программный код. Скопируйте код по этой ссылке.

Это наш файл main.c.

Примечание: все примеры и библиотека для этого урока взяты отсюда.

Как работает код?

Примечание: этот код применим к OLED-дисплеям с различными типами панелей и интерфейсами. Условия #if #endif будут работать в зависимости от конкретного заданного параметра. Поэтому мы рассмотрим те части, которые применимы к параметрам конфигурации нашего SSD1306.

Во-первых, код начинается с подключения необходимых библиотек, включая библиотеки FreeRTOS для генерации задержек, драйвер ssd1306.h для работы с OLED-дисплеем, файл font8x8_basic.h, содержащий набор ASCII-шрифтов размером 8×8 пикселей, и файл esp_log.h для отладки.

Инициализация интерфейса I2C и OLED-дисплея

Внутри функции app_main() сначала настраивается интерфейс I2C. Текущие настройки, заданные в menuconfig, будут выведены в терминал. Это включает тип интерфейса, контакты SDA GPIO, SCL GPIO и Reset GPIO. Кроме того, интерфейс I2C будет настроен путем вызова функции i2c_master_init() и передачи в качестве параметров адреса структуры SSD1306_t, контактов SDA, SCL и Reset.

Следующая инструкция выведет тип панели на терминал. Кроме того, она инициализирует OLED-дисплей, вызвав функцию ssd1306_init(). Эта функция принимает три параметра. Первый параметр — это адрес структуры SSD1306_t, второй — ширина, а третий — высота дисплея в пикселях. Мы используем дисплей 128×64, поэтому ширина равна 128, а высота — 64.

Очистка экрана и установка контрастности

Далее следует несколько вызовов функций. Сначала экран OLED-дисплея очищается с помощью функции ssd1306_clear_screen(). Эта функция принимает два параметра. Первый — это адрес структуры SSD1306_t, а второй — переменная типа invert, которая имеет значение false. Это означает, что фон будет темным, а текст будет отображаться белым.

Во-вторых, контрастность экрана устанавливается с помощью функции ssd1306_contrast(). Эта функция принимает два параметра. Первый — это адрес структуры SSD1306_t, а второй — значение контрастности, которое представляет собой целочисленную переменную. Оно устанавливается равным 0xff.

Отображаемый текст

Затем на экране отображается текст «Hello» с помощью функции ssd1306_display_text_x3(). Текст будет отображаться на экране в течение трех секунд. Функция принимает пять параметров. Первый параметр — адрес структуры SSD1306_t. Второй параметр — номер страницы данных композиции, который устанавливается равным 0. Третий параметр — текст, который мы хотим отобразить. В данном случае это «Hello». Четвертый параметр — длина текста, которая задается как 5. Наконец, пятый параметр — invert, это логическая переменная, которая устанавливается в значение false. Это означает, что фон темный, а текст будет отображаться белым цветом.

Демонстрация вывода слова «Hello» на экран OLED-дисплея

Отображение текста и его инвертирование

Далее у нас есть еще один блок кода для конфигурации SSD1306 128×64. Он отображает серию текстов, заполняющих весь экран. Начнем с определения значений top, center и bottom. Затем несколько раз вызываем функцию ssd_1306_display_text() для отображения различных сообщений со значениями invert как false, так и true. Когда invert установлено как false, фон темный, а текст отображается белым. Аналогично, когда invert установлено как true, фон светлый, а текст отображается черным. Эта функция принимает те же параметры, что и ssd1306_display_text_x3().

Демонстрация инвертирования текста на экране OLED-дисплея

Отображаемые числа

Далее мы отобразим в центре экрана ряд чисел, которые будут отсчитываться от 9 до 0. Каждое число будет оставаться на экране в течение секунды, а затем исчезнет, ​​и на его месте появится следующее число.

Демонстрация отображения чисел на экране OLED-дисплея

Прокрутка вверх и вниз

Теперь мы будем прокручивать текст вверх и вниз по экрану. Сначала очистим экран и установим контраст. Затем отобразим текст “—Scroll UP—“. После этого вызовем функцию ssd1306_software_scroll() и передадим ей три параметра. Первый параметр — это адрес структуры SSD1306_t. Второй параметр — start, который устанавливается как (dev._pages – 1), а третий параметр — end, который устанавливается как 1. Затем используем цикл for для отображения прокручиваемого текста, который будет начинаться со строки 00 и заканчиваться на строке 17, прокручиваясь снизу вверх (прокрутка вверх). Это будет достигнуто с помощью функции ssd1306_scroll_text().

Демонстрация скроллинга текста вверх на экране OLED-дисплея

После завершения прокрутки вверх перейдём к прокрутке вниз. Сначала очистим экран и установим контраст. Затем отобразим текст “—Scroll DOWN—“. После этого вызовем функцию ssd1306_software_scroll() и передадим ей три параметра. Первый параметр — адрес структуры SSD1306_t. Второй параметр — start, который устанавливается равным 1, а третий параметр — end, который устанавливается равным (dev._pages – 1). Затем используем цикл for для отображения прокручиваемого текста, который начнётся со строки 00 и закончится на строке 17, при этом прокрутка будет происходить сверху вниз (прокрутка вниз). Это будет достигнуто с помощью функции ssd1306_scroll_text().

Демонстрация скроллинга текста вниз на экране OLED-дисплея

Перемещение текста вниз страницы

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

Демонстрация перемещения текста вниз страницы на экране OLED-дисплея

Горизонтальная и вертикальная прокрутка текста

Далее мы прокручиваем текст «Horizontal» горизонтально по экрану. Это достигается с помощью следующего фрагмента кода. Как всегда, сначала очищается экран и устанавливается значение контрастности. Затем в центре отображается текст «Horizontal» на черном фоне с белым текстом (инвертировать — false). После этого мы используем функцию ssd1306_hardware_scroll() для прокрутки текста сначала вправо (SCROLL_RIGHT), затем с задержкой в ​​5 секунд — влево (SCROLL_LEFT) и, наконец, останавливаем прокрутку (SCROLL_STOP) еще через 5 секунд. Эта функция принимает только два параметра. Первый параметр — это адрес структуры SSD1306_t, а второй — тип прокрутки.

Демонстрация горизонтальной прокрутки текста на экране OLED-дисплея

Аналогичным образом мы будем прокручивать текст «Vertical» вертикально по экрану. Это достигается с помощью следующего фрагмента кода. Как всегда, сначала очищается экран и устанавливается значение контрастности. Затем отображается текст «Vertical» в центре на черном фоне с белым текстом (инвертировать -false). После этого мы используем функцию ssd1306_hardware_scroll() для прокрутки текста сначала вниз (SCROLL_DOWN), затем с задержкой в ​​5 секунд прокручиваем его обратно вверх (SCROLL_UP) и останавливаем (SCROLL_STOP) еще через 5 секунд. Эта функция принимает только два параметра. Первый параметр — это адрес структуры SSD1306_t, а второй — тип прокрутки.

Демонстрация вертикальной прокрутки текста на экране OLED-дисплея

Наконец, после очистки экрана и настройки контраста, мы отобразим текст ”Good Bye!!” («До свидания!!») в центре. Фон будет белым, а цвет текста — чёрным. Это связано с тем, что в данном случае параметр «инвертировать» установлен в значение «истина».

Демонстрация отображения текста ”Good Bye!!” на экране OLED-дисплея

Затем экран медленно гаснет и становится чёрным. Вскоре плата ESP32 снова перезагружается.

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

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

Выводимые в окне терминала информационные сообщения, отображающие параметры конфигурации 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’ («Выбрать шаблон»), чтобы продолжить.

Создание проекта анимации на экране OLED-дисплея

В разделе Extension («Расширение») выберите опцию ESP-IDF:

Выбор опции ESP-IDF в разделе Extension («Расширение»)

На вкладке get-started («Начало работы») мы щелкнем по пункту «sample_project». Затем нажмем ‘Create project using template sample_project’) («Создать проект, используя шаблон 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 в ESP-IDF для работы с OLED-дисплеем

В качестве альтернативы, мы также можем установить это значение конфигурации с помощью menuconfig. Откройте menuconfig, набрав в терминале команду idf.py menuconfig. Эта команда откроет конфигурацию Espressif IoT Development Framework. Перейдите в раздел конфигурации SSD1306 и установите соответствующие параметры.

Код проекта

Перейдите в папку main > main.c  и откройте её. Здесь мы определим функции и программный код. Это наш файл main.c.

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

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

Выводимые в терминале информационные сообщения, отображающие параметры конфигурации 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’ («Выбрать шаблон»), чтобы продолжить.

Создание проекта отображения значения счетчика на OLED-дисплее

В разделе Extension («Расширение») выберите опцию ESP-IDF:

Выбор опции ESP-IDF в разделе Extension («Расширение»)

На вкладке get-started («Начало работы») мы щелкнем по пункту «sample_project». Затем нажмем ‘Create project using template sample_project’) («Создать проект, используя шаблон 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 в ESP-IDF для работы с OLED-дисплеем

В качестве альтернативы, мы также можем установить это значение конфигурации с помощью menuconfig. Откройте menuconfig, набрав в терминале команду idf.py menuconfig. Эта команда откроет конфигурацию Espressif IoT Development Framework. Перейдите в раздел конфигурации SSD1306 и установите соответствующие параметры.

Код проекта

Перейдите в main > main.c и откройте его. Здесь мы определим функции и программный код. Скопируйте код по этой ссылке.

Это наш файл main.c.

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

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

Отображение в окне терминала сообщений, свидетельствующих об отображении значения счетчика на OLED-дисплее

На OLED-дисплее начнет отображаться счетчик.

(Проголосуй первым!)
Загрузка...
6 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *