OLED-дисплей на SSD1306: обзор, подключение, подводные камни
Маленький жёлто-синий или белый экранчик 0,96 дюйма — самый частый дисплей в самодельных приборах. Внутри у него контроллер Solomon Systech SSD1306: он держит в себе видеопамять, сам генерирует высокое напряжение для панели и общается с платой по двум проводам. Разбираемся, что он умеет по паспорту и обо что спотыкаются при сборке.

Характеристики по документации Solomon Systech
| Параметр | Значение |
|---|---|
| Разрешение | 128 × 64 точки |
| Питание логики VDD | 1,65…3,3 В |
| Питание панели VCC | 7…15 В (на модулях получается из VDD встроенным преобразователем) |
| Выходное напряжение на панель | до 15 В |
| Ток сегмента / общего электрода | до 100 мкА / до 15 мА |
| Регулировка яркости | 256 ступеней |
| Видеопамять | встроенная, 128 × 64 бита |
| Интерфейсы | I²C, 3- и 4-проводной SPI, параллельный 6800/8080 |
| Рабочая температура | −40…+85 °C |
Почему на модуле всего четыре ноги
По паспорту панели нужно 7–15 В, а плата даёт 3,3 В. Вопрос закрывает встроенный в контроллер преобразователь (charge pump): на модуле он включён, поэтому наружу выведены только VCC, GND, SCL и SDA. Отсюда же следует, что при программной инициализации нужно явно разрешить этот преобразователь — библиотеки Adafruit и U8g2 делают это сами, а вот в самописном драйвере забытая команда 0x8D даёт чёрный экран при живом контроллере.
Подключение по I²C
OLED ESP32 Arduino Uno
VCC -> 3V3 5V (на модуле есть стабилизатор)
GND -> GND GND
SCL -> GPIO 22 A5
SDA -> GPIO 21 A4
Адрес — 0x3C, реже 0x3D. Дисплей висит на той же шине, что и датчики: BME280 с адресом 0x76 ему не мешает, обе линии тянутся к одним и тем же двум пинам.
Код: вывод показаний
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void setup() {
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // не завёлся — пробуйте 0x3D
while (1) delay(10);
}
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(SSD1306_WHITE);
oled.setCursor(0, 0);
oled.print("23.4 C");
oled.display(); // без этой строки на экране ничего не появится
}
void loop() {}
Самая частая ошибка новичка — забыть display(). Все методы рисуют в буфер в памяти микроконтроллера, и только эта команда выгружает буфер в дисплей.
Три подводных камня
Памяти нужно больше, чем кажется. Библиотека Adafruit держит копию экрана в оперативной памяти: 128 × 64 бита — это 1 килобайт. У Arduino Uno всего 2 килобайта, и после подключения дисплея на всё остальное остаётся половина. Если проект начал вести себя странно после добавления экрана — дело в памяти, а не в дисплее. Лечится переходом на U8g2 в страничном режиме или на плату с большей памятью.
Выгорание. OLED — это светодиоды, и статичная картинка выжигается за месяцы непрерывной работы. В контроллере для этого есть аппаратная прокрутка содержимого, а в прикладном коде помогает сдвиг изображения на пару пикселей раз в минуту и снижение яркости ночью — все 256 ступеней в вашем распоряжении.
Жёлто-синий экран — это не два цвета. Верхние 16 строк матрицы физически залиты жёлтым люминофором, остальные — синим. Управлять цветом нельзя, это свойство панели. Если нужен однотонный вид, берите модуль, где в описании указан белый или синий целиком.
I²C или SPI
По I²C дисплей занимает два провода и общую шину с датчиками, но обновляется медленнее. SPI требует минимум пять проводов, зато выдаёт заметно больше кадров в секунду — это важно только для анимации и графиков в реальном времени. Для показаний датчика температуры раз в две секунды разницы нет никакой: берите I²C.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.