SSD1306 OLED 0,96″: подключение к ESP32 и Arduino

OLED-дисплей 128×64

Контрастный монохромный экран 128×64 точки на четырёх проводах: текст, графики, иконки. Не нужна подсветка — светятся сами пиксели.

Как работает

Контроллер SSD1306 управляет матрицей OLED 128×64 (бывает 128×32). Модуль на четыре вывода работает по I2C, адрес — 0x3C (реже 0x3D). Библиотеки — Adafruit SSD1306 и Adafruit GFX: рисуете в буфер (display.print(), drawLine(), fillRect()), а на экран всё уходит одной командой display.display().

Буфер кадра — 1 КБ оперативной памяти. Для ESP32 это пустяк, для Arduino Uno с его 2 КБ — половина всей памяти.

Выводы

ВыводНазначение
SCLтактовая линия I2C
SDAлиния данных I2C
VCCпитание
GNDобщий провод

Подключение к ESP32

SSD1306 OLED 0,96″ESP32
SCLGPIO22
SDAGPIO21
VCC3V3
GNDGND

Схема из примера «OLED SSD1306: первый вывод».

OLED SSD1306: первый вывод

Открыть пример целиком
Код скетча
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(128, 64, &Wire, -1);

void setup() {
  Serial.begin(115200);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("дисплей не найден");
    return;
  }
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("PinPort");
  display.setTextSize(1);
  display.println("SSD1306 128x64");
  display.display();   // без этого экран останется пустым
}

void loop() {
}

Подключение к Arduino Uno

SSD1306 OLED 0,96″Arduino Uno
SCLA5
SDAA4
VCC5V
GNDGND

Схема из примера «Arduino Uno: экран OLED и его цена в памяти».

Arduino Uno: экран OLED и его цена в памяти

Открыть пример целиком
Код скетча
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Экран 128x64 на I2C — то есть на A4 и A5, других вариантов у Uno нет.
//
// Главное про этот экран на Uno — не картинка, а память. У микросхемы
// нет способа прочитать своё содержимое обратно, поэтому библиотека
// держит копию кадра у себя: 128 * 64 / 8 = 1024 байта. Ровно половина
// всей оперативной памяти платы, занятая до того, как объявлена первая
// переменная.
//
// Отсюда следствия, с которыми на Uno живут: экран 128x32 вместо
// 128x64 занимает вдвое меньше, строки прячут в F(), а String не
// используют вовсе. Проверить, сколько осталось, можно примером
// «сколько осталось оперативной памяти».

Adafruit_SSD1306 display(128, 64, &Wire, -1);

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

  // Адрес 0x3C — обычный для этих модулей. Отказ надо проверять:
  // библиотека при неудаче ничего не рисует и молчит.
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("экран не отозвался: проверьте адрес и A4/A5"));
    return;
  }

  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println(F("PinPort"));
  display.println(F("Arduino Uno"));
  display.display();     // без этого в ОЗУ есть всё, а на экране ничего
}

void loop() {
  display.fillRect(0, 32, 128, 32, SSD1306_BLACK);
  display.setTextSize(2);
  display.setCursor(0, 36);
  display.print(millis() / 1000);
  display.print(F(" c"));
  display.display();
  delay(200);
}

В железе

Шина I2C: ESP32 — SDA GPIO21, SCL GPIO22; Arduino Uno — A4 и A5. Дисплей может делить шину с датчиками — у всех разные адреса.

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

Другие детали