Подключение OLED-дисплея SSD1306 к Arduino
OLED-дисплей 128×64
SSD1306 к Arduino Uno и Nano подключается по I2C: SDA на A4, SCL на A5, питание 3,3–5 В.
Схема подключения OLED-дисплея SSD1306 к Arduino
| SSD1306 OLED 0,96″ | Arduino Uno |
|---|---|
| SCL | A5 |
| SDA | A4 |
| VCC | 5V |
| GND | GND |
Схема из примера «Arduino Uno: экран OLED и его цена в памяти».
Выводы SSD1306 OLED 0,96″
| Вывод | Назначение |
|---|---|
| SCL | тактовая линия I2C |
| SDA | линия данных I2C |
| VCC | питание |
| GND | общий провод |
Код для Arduino
#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);
}
Скетч можно править и запускать в симуляторе без платы и установки среды.
Что учесть на Arduino
- Буфер Adafruit_SSD1306 128×64 — 1 КБ из 2 КБ ОЗУ Uno, поэтому на остальной скетч остаётся немного. Тексты кладут во флеш через
F(), глобальных массивов делают меньше. - Если памяти не хватает, берут экран 128×32 (буфер 512 байт) или библиотеку U8g2 в режиме страничного буфера.
Частые ошибки при подключении к Arduino
- Положить строки в ОЗУ без
F("..."): скетч компилируется, но зависает из-за нехватки памяти. - Передать в
begin()адрес 0x78, указанный на модуле: библиотеке нужен 7-битный адрес 0x3C. - Нарисовали, но на экране пусто — забыт
display.display(): всё осталось в буфере. begin()возвращает false — неверный адрес (0x3D вместо 0x3C) или не хватило памяти под буфер на Uno.- Размер в конструкторе 128×32 для экрана 128×64 — изображение растянуто через строку.
- Статичная картинка сутками — OLED выгорает. Для часов гасите экран или сдвигайте изображение.
Ещё по теме
Другие детали для Arduino
HC-SR04DHT22 (AM2302)BME280DS3231LCD 1602 с I2CMAX7219TM1637Модуль релеKY-040Клавиатура 4×4HX711ФоторезисторМодуль microSDRGB-светодиодСервопривод SG9074HC595Шаговый двигательКнопкаПотенциометрПьезопищалкаСветодиодПолзунковый переключательHC-SR501TTP223Датчик влажности почвыMQ-2LM35Джойстик KY-023DHT11HTU21D