OLED дисплей — отличный графический индикатор, который подойдет для многих DIY-проектов, где необходимо следить за какими-нибудь параметрами системы, наблюдать течение процессов или даже играть. Ранее мы уже подключали OLED дисплей к Arduino, и даже делали игровую консоль для игры в подобие Space Invaders.
Вот так выглядит OLED дисплей с матрицей размером 0,96 дюйма и контроллером SSD1306.
Сегодня мы будем разбираться, как работать с OLED на Raspberry Pi 4, хотя подойдет и любая другая версия, даже Zero. Для урока нам понадобится сам микрокомпьютер, блок питания с током не менее 3А и SD-карта памяти объёмом не менее 16 Гб. Разумеется, модуль OLED дисплея и немного проводов, чтобы соединить их вместе.
Подключение OLED к Raspberry Pi
У платы Raspberry Pi 4 есть все самые популярные интерфейсы, так что для подключения OLED можно использовать как SPI, так и I2C. В этом примере мы остановимся на подключении по I2C шине. Соединяем два устройства по следующей схеме.
Raspberry Pi 4 | GND | 3.3V | SDA(GPIO02) | SCL(GPIO03) |
OLED 0,96 ROC | GND | 3.3 | SDA | SCL |
Однако, если потребуется подключить дисплей по SPI, вот схема:
Raspberry Pi 4 | GND | 3.3V | MOSI(GPIO10) | MISO(GPIO09) | CLK(GPIO11) | GPIO4 | GPIO5 |
OLED 0,96 ROC | GND | 3.3 | SDA | DC | SCL | RST | CS |
Установка библиотеки Python для работы с SSD1306
Для написания программы будем использовать язык Python, следовательно, нам нужно установить библиотеку Python для работы с OLED. Причём, OLED бывают разные, с разными контроллерами. Поскольку мы работаем с SSD1306, то и библиотеку подбираем подходящую.
Все последующие действия осуществляем с помощью командной строки. Для этого можно использовать программу-терминал с рабочего стола Raspberry Pi OS, либо SSH соединение.
Устанавливаем библиотеку для работы с дисплеями на контроллере SSD1306.
pip3 install adafruit-circuitpython-ssd1306
Также установим библиотеку PIL, которая пригодится для углублённой работы с изображениями. Предварительно обновим репозиторий пактов операционной системы.
sudo apt-get update
sudo apt-get install python3-pil
И еще одна настройка. Поскольку мы подключаем OLED дисплей по I2C шине, нам нужно её включить в настройках Raspberry, а ещё увеличить скорость обмена по этой шине.
Итак, первое действие. Заходим в настройки Raspberry командой:
sudo raspi-config
Переходим а раздел 5 Interfacing options затем в подраздел P5 I2C и жмём кнопку Yes. Выходим из настроек нажатием кнопки Finish.
Второй действие. Открываем в редакторе файл с настройками:
sudo nano /boot/config.txt
И дописываем в конце строку:
dtparam=i2c_baudrate=1000000
Теперь скорость обмена по I2C у нас будет 1МГц. Сохраняем файл комбинацией клавиш Ctrl+O и выходим из редактора Ctrl+X.
Готово! Теперь перезагружаем систему и переходим к написанию программы.
sudo reboot
Программа для OLED дисплея
Итак, после перезагрузки системы снова заходим в консоль и создаем Python-скрипт:
cd /home/pi
touch oled.py
Открываем его в редакторе:
nano oled.py
И пишем такой код:
import board
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
# разрешение дисплея
WIDTH = 128
HEIGHT = 64
# ширина рамки
BORDER = 2
# инициализация шины I2C и дисплея с адресом 0x3D
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c, addr=0x3D)
# заливаем экран черным цветом
oled.fill(0)
oled.show()
# будем работать с буфером экрана из библиотеки PIL
# первый параметр - цветность дисплея, для монохромного - 1
image = Image.new("1", (oled.width, oled.height))
# draw будет нашим карандашем, которым мы будем рисовать на экране
draw = ImageDraw.Draw(image)
# рисуем прямоугольник белого цвета во весь экран
draw.rectangle((0, 0, oled.width, oled.height), outline=255, fill=255)
# рисуем прямоугольник поменьше черным цветом, так мы создаем контурную рамку
draw.rectangle(
(BORDER, BORDER, oled.width - BORDER - 1, oled.height - BORDER - 1),
outline=0,
fill=0,
)
# загружаем стандартный шрифт
font = ImageFont.load_default()
# пишем текст в центре экрана
text = "RobotClass"
(font_width, font_height) = font.getsize(text)
draw.text(
(oled.width // 2 - font_width // 2, oled.height // 2 - font_height // 2),
text,
font=font,
fill=255,
)
# выводим буфер изображения на дисплей
oled.image(image)
oled.show()
Запускаем программу с помощью интерпретатора python:
python3 oled.py
Если всё было сделано правильно, получаем ожидаемый результат.