ELECTRONICS

OLED дисплей SSD1306 и Arduino: подключение по I2C, библиотека и скетч

ДисплеиСкетч проверен компиляцией

SSD1306 — маленький дисплей на органических светодиодах, обычно 0,96 дюйма и 128 на 64 точки. У него нет подсветки: каждая точка светится сама, поэтому чёрный цвет — это по-настоящему выключенный пиксель, а картинка читается под любым углом.

Подключается он по шине I2C — всего два провода данных на всю шину, сколько бы устройств вы к ней ни повесили. Каждое устройство на шине имеет свой адрес; у этих дисплеев он почти всегда 0x3C, реже 0x3D.

Схема подключения

Наведите курсор на провод — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
VCCПитание. Модули с надписью VIN берут 5 В, с надписью 3V3 — только 3,3 В.
GNDЗемля.
SCLТактовая линия I2C. На UNO — только пин A5.
SDAЛиния данных I2C. На UNO — только пин A4.

Характеристики

Разрешение
128 × 64 точки
Диагональ
0,96″
Интерфейс
I2C, адрес 0x3C или 0x3D
Питание
3,3 или 5 В в зависимости от модуля
Потребление
до 20 мА при полной заливке

Как узнать адрес дисплея

Если экран остаётся чёрным, первым делом проверьте адрес. Загрузите готовый скетч I2C Scanner — он перебирает всю шину и печатает в монитор порта адреса всех найденных устройств. Увидели 0x3C — ставьте его в скетч, увидели 0x3D — ставьте 0x3D. Если сканер не находит ничего, дело не в адресе, а в проводах или питании.

Библиотека

Adafruit SSD1306Ставится через менеджер библиотек и тянет за собой Adafruit GFX — она отвечает за шрифты, линии и фигуры. Обе нужны.

Готовый скетч

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define WIDTH 128
#define HEIGHT 64
#define ADDRESS 0x3C   // если пусто — попробуйте 0x3D

Adafruit_SSD1306 display(WIDTH, HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(9600);

  if (!display.begin(SSD1306_SWITCHCAPVCC, ADDRESS)) {
    Serial.println("Дисплей не найден");
    while (true);   // дальше идти смысла нет
  }

  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 10);
  display.println("Privet!");
  display.display();   // без этой строки экран останется пустым
}

void loop() {
}

Скетч собирается arduino-cli под Arduino UNO

Библиотека рисует не на экране, а в памяти платы. Пока вы не вызовете display.display(), дисплей показывает старую картинку — это причина номер один жалоб «код работает, а экран пустой».

Частые ошибки

Экран чёрный, ошибок нет

Забыт вызов display.display() после рисования. Всё нарисовано в буфере, но не отправлено на экран.

Дисплей не найден

Либо не тот адрес, либо SDA и SCL перепутаны местами. На UNO это всегда A4 и A5 — другие пины шина не поддерживает.

Кириллица превращается в кракозябры

Встроенный шрифт содержит только латиницу. Русский текст требует отдельного шрифта — например, из библиотеки U8g2, которая умеет кириллицу из коробки.

Скетч не влезает в память

Библиотека Adafruit держит весь кадр в оперативной памяти — это килобайт из двух доступных на UNO. Если памяти не хватает, переходите на U8g2 в экономном режиме или на плату помощнее.

Что понадобится