Симулятор OLED SSD1306 онлайн: дисплей 128x64 без модуля
OLED SSD1306 — мой самый частый дисплей в проектах: 0,96 дюйма, 128x64 пикселя, I2C на два провода. На бумаге всё просто, на практике я один раз опалил модуль, подав 5 В на 3,3-вольтовый пин (модуль был без стабилизатора), и один раз бился с адресом: 0x3C или 0x3D — половина модулей с завода идёт на одном, половина на другом. В браузере этих затыков нет: модуль уже на стенде, дисплей рисует текст и графику из скетча, адрес 0x3C по умолчанию, и можно потрогать setTextSize, setCursor и display без пайки.
Модуль ставится на стенд симулятора из каталога: голубой провод с меткой OLED, два пина SDA/SCL на A4/A5 (стандартный I2C). Буфер кадра 1024 байта — половина SRAM Uno, и на это нужно закладываться в больших скетчах: дисплей + Adafruit_SSD1306 + Adafruit_GFX съедают 1,5 КБ из 2 КБ. Ниже — стартовый скетч с текстом, метео-панель, честная граница модели и грабли.
Что эмулируется на стенде
SSD1306 в каталоге — деталь «OLED-дисплей SSD1306 128×64»: два пина SDA/SCL на A4/A5, голубой провод с меткой OLED. На плашке устройства 128x64 пикселя — текст задаётся в карточке вручную и сразу отрисовывается. Скетч через Adafruit_SSD1306 (display.display(), setCursor, print, clear) рисует поверх и обновляет экран. Адрес 0x3C по умолчанию, как у большинства модулей; на редких платах 0x3D. Ловушка про «опалил 5 В» — из заголовка: модули без стабилизатора питаются только 3,3 В, и 5 В на VCC убивает кристалл. Модули с стабилизатором (большинство) терпят 5 В.
- 128x64 пикселя, 1 бит на пиксель: буфер 128×64/8 = 1024 байта — половина SRAM Uno.
- Адрес 0x3C по умолчанию: половина модулей с завода, остальные на 0x3D. Сканером сверяйте.
- Adafruit_SSD1306 display(128, 64, &Wire, -1): конструктор; -1 — без пина RESET (на модулях он часто не выведен).
- display.display(): отправляет буфер на экран; без вызова ничего не меняется. Перерисовка — в буфер, потом display().
- setTextSize(1..3): размер шрифта; 1 — 21 символ в строке, 2 — 10 символов, 3 — 7 символов.
Стартовый скетч: «Hello, OLED» и счётчик секунд
#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h> Adafruit_SSD1306 display(128, 64, &Wire, -1); void setup() { Wire.begin(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.print("Hello, OLED"); display.display();} void loop() { static unsigned long t0 = 0; if (millis() - t0 >= 1000) { t0 += 1000; display.fillRect(0, 30, 128, 20, SSD1306_BLACK); display.setCursor(0, 30); display.print(millis() / 1000); display.display(); }}Запустите скетч — на OLED печатается «Hello, OLED» и каждую секунду обновляется счётчик. Полный разбор буфера 1024 байта, доли SRAM и сетки 21×8 — в уроке про первый текст на OLED; текстовый API с setCursor и setTextSize — в уроке про print и setCursor.
Метео-панель: зоны под датчики
#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h> Adafruit_SSD1306 display(128, 64, &Wire, -1); void setup() { Wire.begin(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.setTextSize(1); display.setTextColor(SSD1306_WHITE);} void loop() { static unsigned long t0 = 0; if (millis() - t0 >= 1000) { t0 += 1000; display.clearDisplay(); display.setCursor(0, 0); display.print("T="); display.print(23.4, 1); display.setCursor(64, 0); display.print("H="); display.print(45); display.setCursor(0, 16); display.print("P="); display.print(1013); display.setCursor(0, 32); display.print("Uptime: "); display.print(millis() / 1000); display.display(); }}Метео-панель — типовой дашборд: зоны под T, H, P, uptime. Полная перерисовка раз в секунду не мерцает, потому что кадр собирается в буфер и уходит одной посылкой через display(). Полный разбор зон, фиксированной ширины и таймингов датчиков — в уроке про метео-панель на OLED.
Граница: модель против живого модуля
| Проверка | Симулятор | Только железо |
|---|---|---|
| I2C: SDA A4, SCL A5, адрес 0x3C | да: модуль на стенде | то же, плюс реальные 0x3C/0x3D |
| Adafruit_SSD1306: begin, clearDisplay, display | да: кадр рисуется | то же, плюс реальная память 1024 байта |
| setTextSize, setCursor, print, println | да: сетка 21×8 | то же |
| drawRect, fillRect, drawLine, drawCircle | да: графика как на плате | то же |
| setBrightness, dim, invertDisplay | компилируется, без эффекта | то же, плюс реальная яркость OLED |
| Самопрогрев и выгорание OLED | не моделируется | да — статичный кадр выжигает пиксели |
Браузер рисует кадр как на плате: буфер 1024 байта, сетка 21×8, графика через Adafruit_GFX. Яркость и выгорание — на плате: статичный кадр на OLED выжигает пиксели за 2-3 месяца постоянной работы, поэтому в дашбордах делают ночную половину яркости и периодическую инверсию. Разбор ресурса OLED и защиты — в уроке про питание и выгорание.
Грабли SSD1306
- Адрес 0x3C против 0x3D: половина модулей на одном, половина на другом. Сканером проверяйте; в браузере один адрес 0x3C.
- Забытый display.display(): все рисование идёт в буфер, без вызова display() кадр не обновляется. Новичок часто рисует и ждёт — экран не меняется.
- setTextSize(2) и длина строки: при размере 2 в строку влезает 10 символов; 11-й обрезается. Сверяйте длину строк с шириной зоны.
- fillRect для очистки зоны: clearDisplay() чистит весь экран, для одной зоны — fillRect(x, y, w, h, BLACK). Иначе мерцает весь экран.
- 5V на 3,3-вольтовый модуль без стабилизатора: опалит кристалл. Модули с стабилизатором (AMS1117) терпят 5V, без него — только 3,3V.