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 в экономном режиме или на плату помощнее.
Что понадобится
- OLED дисплей 0,96″ SSD1306 с интерфейсом I2C
- Arduino UNO
- Провода «папа-мама»