Контрастный монохромный экран 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 КБ — половина всей памяти.
#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. Дисплей может делить шину с датчиками — у всех разные адреса.
Частые ошибки
Нарисовали, но на экране пусто — забыт display.display(): всё осталось в буфере.
begin() возвращает false — неверный адрес (0x3D вместо 0x3C) или не хватило памяти под буфер на Uno.
Размер в конструкторе 128×32 для экрана 128×64 — изображение растянуто через строку.
Статичная картинка сутками — OLED выгорает. Для часов гасите экран или сдвигайте изображение.