OLED — это органический светодиод (Organic Light-Emitting Diode). Дисплеи, созданные на основе OLED применяются в множестве гаджетов, включая: смартфоны, фитнес браслеты, умные часы, бытовые приборы и прочее. Благодаря отсутствию подсветки, они потребляют меньше энергии, чем их жидкокристаллические аналоги. Сегодня, пожалуй, у каждого DIY-электронщика обязательно найдется хотя бы один модуль OLED дисплея.
На этом уроке мы подключим модуль RobotClass OLED 0.91 к отладочной плате Графит-S2. Этот дисплей монохромный, так что каждая точка у него может находиться только в двух состояниях: светится или нет. Причём цвет свечения зависит от типа матрицы: с белым свечением или с голубым. Встречаются также двухцветные дисплеи: сверху идёт полоска жёлтых светодиодов, а остальная матрица светится голубым.
Программу напишем на языке Python при помощи CircuitPython, используя библиотеки из стандартной коллекции Adafruit. Подключение будем производить по шине I2C, используя при этом разъём QIIC. В итоге, собранный макет будет выглядеть так:
Разумеется, эта инструкция подойдет и для других плат под управлением CircuitPython, таких как, например: Графит-RP2040, Raspberry Pi Pico, XIAO SAMD21 и т.д. И для других OLED дисплеев с контроллером SSD1306.
Список необходимых компонентов
Для выполнения примеров из данного урока, кроме модуля OLED дисплея, потребуется отладочная плата Графит-S2 или аналогичная с установленным CircuitPython и кабель для шины QIIC. Если вам не хватает что-то из этого, можно добавить эти компоненты в корзину прямо здесь и затем оформить заказ в нашем интернет-магазине.
Установка библиотек
Для работы с OLED SSD1306 используем библиотеку adafruit_ssd1306, которая имеется в стандартном наборе библиотек от Adafruit (ссылка в конце урока). Всё, что нам нужно сделать для её установки — это скопировать файл adafruit_ssd1306.mpy в папку lib на накопителе CIRCUITPY.
Более подробно о работе с библиотеками CircuitPython мы писали в одном из ранних наших уроков: Библиотеки для CircuitPython
Установка зависимостей
Чтобы библиотека adafruit_ssd1306 заработала, необходимо будет добавить еще три «зависимости»:
- adafruit_framebuf
- adafruit_bus_device
- adafruit_register
Все эти библиотеки есть в сборнике от Adafruit. Точно также, копируем их на накопитель CIRCUITPY.
Программа
Для составления программы используем среду разработки Mu.
Пусть, самая первая наша программа заполнит дисплей одним цветом. Начнём с подключения всех необходимых библиотек. Напомню, в python это делается с помощью команды import.
Кроме adafruit_ssd1306 нам будут нужны еще две:
- board — хранит названия всех контактов платы контроллера и их синонимы;
- busio — предоставляет интерфейс для работы с шиной I2C.
import busio
import adafruit_ssd1306
import board
Затем инициализируем шину I2C, указывая контакты SCL и SDA. То же самое проделываем с дисплеем, указывая в качестве параметров: разрешение 128 x 32 точки, и готовый интерфейс i2c.
i2c = busio.I2C(board.SCL, board.SDA) # инициализация шины I2C
oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c) # инициализация дисплея
Теперь у нас есть объект oled, и мы можем воспользоваться некоторыми его методами для отображения на дисплее точек, линий и текста. Ссылка на полный список допустимых методов есть в конце урока.
Для заполнения экрана используем функцию fill, в качестве единственного аргумента которой служит цвет заполнения: 0 — чёрный, 1 — белый. Мы можем нарисовать всё что угодно, но чтобы рисунок отобразился на дисплее необходимо закончить наше рисование вызовом функции show.
Полный текст нашей программы будет иметь вид:
import busio
import adafruit_ssd1306
import board
i2c = busio.I2C(board.SCL, board.SDA) # инициализация шины I2C
oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c) # инициализация дисплея
oled.fill(1)
oled.show()
Сохраняем программу и дисплей мгновенно заполняется белым цветом (или голубым, смотря какой дисплей).
Кстати, функция fill с аргументом 0 часто используется для очистки экрана от предыдущего изображения. Поэтому в следующей программе она тоже нам понадобится.
Рисуем точки, отрезки и прямоугольники
Для вывода точки используем метод pixel:
pixel(x, y, color) # x и у - координаты точки, color - цвет
Отрезок рисуем с помощью line:
line(x1, y1, x2, y2, color) # x1 и y1 - начальная точка отрезка, x2 и y2 - конечная, color - цвет
Прямоугольник выводится методом rect:
rect(x, y, w, h, color) # x и y - верхний левый угол прямоугольника, w и h - его ширина и высота, color - цвет
Для окружности используем circle:
circle(x, y, radius, color) # x и y - координаты центра, radius - радиус окружности, color - цвет
import busio
import adafruit_ssd1306
import board
i2c = busio.I2C(board.SCL, board.SDA)
oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
oled.fill(0)
oled.pixel(10,10,1)
oled.line(0,31,127,0,1)
oled.rect(5,5,117,21,1)
circle(64,16,15,1)
oled.show()
Сохраняем программу и смотрим результат.
Вывод текста
Следующая программа будет выводить на дисплей текст «RobotClass». Шрифты в CircuitPython хранятся в отдельных файлах. Самый простой стандартный шрифт хранится в файле font5x8.bin, который можно найти в папке с примерами (examples) для библиотеки adafruit_frambuf (ссылка в конце урока). Файл со шрифтом необходимо сохранить в корень накопителя CIRCUITPY.
Для вывода текста используем метод text:
text(string, x, y, color, *, font_name='font5x8.bin', size=1)
- string — это строка текста, который мы собираемся вывести;
- x и y — координаты верхнего левого угла рамки текста;
- color — цвет;
- font_name — имя файла со шрифтом, по умолчанию это как раз font5x8.bin;
- size — масштаб.
import busio
import adafruit_ssd1306
import board
i2c = busio.I2C(board.SCL, board.SDA)
oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
oled.fill(0)
oled.text('RobotClass', 5, 10, 1, size=2)
oled.show()
Сохраняем программу и смотрим на дисплей.
Полезные ссылки
Репозиторий Adafruit для библиотек CircuitPython:
https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases
Исходные коды библиотеки adafruit_framebuf:
https://github.com/adafruit/Adafruit_CircuitPython_framebuf
Документация по функциям библиотеки adafruit_frambuf