Подключение OLED дисплея 0.96" к ESP32 — пошаговый гайд

🖥️ Подключение OLED 0.96" к ESP32 — полный гайд#
OLED дисплей 0.96" на контроллере SSD1306 — идеальный выбор для первого проекта. Подключается 4 проводами, потребляет мало, светится ярко. Разберём всё от пайки до запуска мультика!
🎯 Почему OLED SSD1306?#
| Плюс | Описание |
|---|---|
| ⚡ Низкое потребление | ~20mA, светятся только активные пиксели |
| 🌙 Идеальный чёрный | Пиксели реально выключены, не светятся |
| 👁️ Отличный контраст | Видно даже на солнце |
| 🔌 Простое подключение | Всего 4 провода по I2C |
| 💰 Дёшево | ~100₽ на AliExpress |
Минус один: I2C интерфейс медленнее чем SPI. Но! Мы запускали анимацию с 15 FPS без проблем — для большинства проектов хватает с головой.
📦 Что понадобится#
| Компонент | Примечание |
|---|---|
| ESP32 DevKit | Любая версия |
| OLED 0.96" SSD1306 | I2C версия (4 пина) |
| Провода Dupont | 4 штуки (мама-мама или мама-папа) |
| Паяльник | Если пины не припаяны |
Где купить: Дисплеи | Контроллеры ESP32
🔌 Схема подключения#
Стандартное подключение:#
OLED SSD1306 ESP32
──────────── ─────
VCC → 3.3V
GND → GND
SDA → GPIO21
SCL → GPIO22
Вот и всё! Четыре провода.
Таблица пинов:#
| OLED пин | ESP32 пин | Цвет провода (обычно) |
|---|---|---|
| VCC | 3.3V | 🔴 Красный |
| GND | GND | ⚫ Чёрный |
| SDA | GPIO21 | 🔵 Синий |
| SCL | GPIO22 | 🟡 Жёлтый |
⚠️ Важно: Подключай к 3.3V, не к 5V! Хотя многие модули имеют стабилизатор, лучше не рисковать.
🔧 Пайка пинов#
Если дисплей пришёл без припаянных пинов:
- Вставь гребёнку пинами вниз
- Припаяй каждый пин с обратной стороны
- Не перегревай — OLED не любит высоких температур
- Проверь что нет замыканий между пинами
💡 Совет: Можно использовать Dupont провода напрямую без пинов — просто припаять провода к площадкам.
🏷️ Адрес I2C и перемычка#
Стандартный адрес: 0x3C#
На большинстве модулей есть перемычка (резистор) для смены адреса:
| Перемычка | Адрес |
|---|---|
| Стандартно | 0x3C |
| Перепаяна | 0x3D |
Зачем это нужно?#
Можно подключить два дисплея к одним пинам! Один с адресом 0x3C, второй с 0x3D — и работают параллельно.
Как найти перемычку:#
На обратной стороне дисплея ищи:
- Маркировку “ADDR” или “A0”
- Два контакта с перемычкой или без
Перепаяй перемычку на соседние контакты — адрес изменится.
Как узнать адрес?#
Загрузи I2C сканер:
#include <Wire.h>
void setup() {
Wire.begin(21, 22);
Serial.begin(115200);
Serial.println("I2C Scanner");
}
void loop() {
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
if (Wire.endTransmission() == 0) {
Serial.print("Found: 0x");
Serial.println(address, HEX);
}
}
delay(5000);
}
В Serial Monitor увидишь адрес подключённого дисплея.
📚 Установка библиотек#
Вариант 1: Adafruit (рекомендую для новичков)#
В Arduino IDE: Скетч → Подключить библиотеку → Управление библиотеками
Найди и установи:
- Adafruit SSD1306
- Adafruit GFX Library (установится автоматически)
Вариант 2: U8g2 (больше шрифтов и функций)#
Установи библиотеку U8g2 — она мощнее, но сложнее.
Вариант 3: GyverOLED (русская, лёгкая)#
Библиотека от AlexGyver — поддерживает русский язык из коробки.
💻 Минимальный код#
Hello World на Adafruit:#
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Размер дисплея
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Создаём объект дисплея
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Serial.begin(115200);
// Инициализация I2C на пинах ESP32
Wire.begin(21, 22);
// Запуск дисплея
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 не найден!");
while(true);
}
// Очищаем буфер
display.clearDisplay();
// Настройки текста
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
// Выводим текст
display.println("MONSTRIX");
display.setTextSize(1);
display.println();
display.println("Hello, World!");
// Отправляем на дисплей
display.display();
}
void loop() {
// Ничего не делаем
}
Что происходит в коде:#
- Wire.begin(21, 22) — запускаем I2C на стандартных пинах ESP32
- display.begin() — инициализируем дисплей с адресом 0x3C
- display.clearDisplay() — очищаем буфер (не сам дисплей!)
- display.print() — пишем в буфер
- display.display() — отправляем буфер на экран
💡 Важно: Пока не вызовешь display.display() — на экране ничего не изменится!
🎨 Примеры вывода#
Текст разных размеров:#
display.clearDisplay();
display.setTextSize(1); // Мелкий (6x8 px)
display.setCursor(0, 0);
display.println("Size 1");
display.setTextSize(2); // Средний (12x16 px)
display.println("Size 2");
display.setTextSize(3); // Крупный (18x24 px)
display.println("Size 3");
display.display();
Графические примитивы:#
display.clearDisplay();
// Пиксель
display.drawPixel(10, 10, SSD1306_WHITE);
// Линия
display.drawLine(0, 0, 127, 63, SSD1306_WHITE);
// Прямоугольник
display.drawRect(10, 10, 50, 30, SSD1306_WHITE);
// Заполненный прямоугольник
display.fillRect(70, 10, 50, 30, SSD1306_WHITE);
// Круг
display.drawCircle(64, 32, 20, SSD1306_WHITE);
// Заполненный круг
display.fillCircle(64, 32, 10, SSD1306_WHITE);
display.display();
Анимация (простой счётчик):#
void loop() {
static int count = 0;
display.clearDisplay();
display.setTextSize(3);
display.setCursor(40, 20);
display.print(count);
display.display();
count++;
delay(100);
}
🎬 Анимация и FPS#
Сколько FPS можно выжать?#
| Режим | FPS | Примечание |
|---|---|---|
| Полная перерисовка | ~15-20 | Нормально для большинства задач |
| Частичное обновление | ~30+ | Если обновлять только изменившееся |
| С буфером | ~25 | Adafruit использует буфер |
Мы запускали мультик с 15 FPS — смотрится плавно! Для часов, датчиков, меню — более чем достаточно.
Пример простой анимации:#
void loop() {
static int x = 0;
display.clearDisplay();
display.fillCircle(x, 32, 10, SSD1306_WHITE);
display.display();
x += 2;
if (x > 128) x = 0;
delay(30); // ~30 FPS
}
🔍 Решение проблем#
Дисплей не включается#
| Проблема | Решение |
|---|---|
| Неправильный адрес | Запусти I2C сканер |
| Перепутаны SDA/SCL | Поменяй местами |
| Нет питания | Проверь 3.3V мультиметром |
| Плохой контакт | Проверь пайку |
Мусор на экране#
display.clearDisplay();
display.display();
Выполни очистку — возможно в буфере был мусор.
Текст не отображается#
Не забыл вызвать display.display() после print()?
Дисплей мерцает#
- Проверь питание — возможно просадки
- Добавь конденсатор 100μF между VCC и GND
- Укороти провода (макс 20 см для I2C)
📐 Характеристики OLED 0.96"#
| Параметр | Значение |
|---|---|
| Диагональ | 0.96" (24.4 мм) |
| Разрешение | 128×64 пикселей |
| Контроллер | SSD1306 |
| Интерфейс | I2C (4 пина) |
| Напряжение | 3.3V (некоторые 5V tolerant) |
| Потребление | ~20mA (зависит от картинки) |
| Цвет | Монохром (белый/синий/жёлто-синий) |
| Угол обзора | >160° |
🆚 Варианты дисплеев#
| Вариант | Особенность |
|---|---|
| Белый | Классика, хороший контраст |
| Синий | Приятный оттенок |
| Жёлто-синий | Верх жёлтый, низ синий (для заголовков) |
Функционально одинаковые — выбирай по вкусу.
🛒 Где купить?#
Проверенные дисплеи собраны в разделе:
📖 Что дальше?#
- Распиновка ESP32 DevKit — подробнее про пины
- Контроллеры ESP32 — какую плату выбрать
☕ Поддержать проект#
Если гайд был полезен — буду рад поддержке! Все средства идут на новые эксперименты и компоненты.
[ ❤️ Поддержать автора ]Вопросы? Пиши в Telegram