LED дисплей SSD1306 I2C с разрешением 128x64 px. отлично работает  с библиотекой Adafruit. Но большинство библиотек работают с кадровым буфером, а это 128*64/8=1024 байт. В результате, нет места для переменных пользователя, а Adafruit ещё и память программ занимает более чем на 60%. Пришлось разбираться с низкоуровневым выводом на экран.

Схема подключения LED дисплея SSD1306 I2C очень простая, поэтому её здесь не привожу. У дисплея всего 4 вывода, из них 2 питание от 3,3 до 5 Вольт. Подключите вывод SDA на плате дисплея к выводу A4, а вывод SCK к выводу A5 на плате Arduino. Будем использовать аппаратный I2C интерфейс микроконтроллера ATMega 328 со стандартной для среды Arduino IDE библиотекой Whare. 

#include <Wire.h>

#define SSD1306_Address               0x3C
#define SSD1306_Command_Mode          0x80
#define SSD1306_Data_Mode             0xC0
#define SSD1306_Dats_Mode             0x40

#define SSD1306_MEMORYMODE          0x20 //2< Автоматическая адресация
#define SSD1306_COLUMNADDR          0x21 //3< See datasheet
#define SSD1306_PAGEADDR            0x22 //3< See datasheet
#define SSD1306_SETCONTRAST         0x81 //2< Контрастность
#define SSD1306_CHARGEPUMP          0x8D //2< Умножитель напряжения
#define SSD1306_SEGREMAP_MIRROR     0xA0 ///< Развёртка справа/налево
#define SSD1306_SEGREMAP            0xA1 ///< Развёртка слева/направо
#define SSD1306_DISPLAYALLON_RESUME 0xA4 ///< отображение содержимого RAM
#define SSD1306_DISPLAYALLON        0xA5 ///<  Игнорирует содержимое RAM.
#define SSD1306_NORMALDISPLAY       0xA6 ///< Нет инверсии
#define SSD1306_INVERTDISPLAY       0xA7 ///< Инверсия
#define SSD1306_SETMULTIPLEX        0xA8 //2< See datasheet
#define SSD1306_DISPLAYOFF          0xAE ///< Выключить дисплей
#define SSD1306_DISPLAYON           0xAF ///< Дисплей включен
#define SSD1306_COMSCANINC          0xC0 ///< Развёртка снизу/верх
#define SSD1306_COMSCANDEC          0xC8 ///< Развёртка сверху/вниз
#define SSD1306_SETDISPLAYOFFSET    0xD3 //2< See datasheet
#define SSD1306_SETDISPLAYCLOCKDIV  0xD5 //2< Частота обновления
#define SSD1306_SETPRECHARGE        0xD9 ///< See datasheet
#define SSD1306_SETCOMPINS          0xDA //2< Разрешение 0x02-128x32, 0x12-128x64
#define SSD1306_SETVCOMDETECT       0xDB ///< See datasheet

#define SSD1306_SETLOWCOLUMN        0x00 ///< Not currently used
#define SSD1306_SETHIGHCOLUMN       0x10 ///< Not currently used
#define SSD1306_SETSTARTLINE        0x40 ///< See datasheet

#define SSD1306_EXTERNALVCC         0x01 ///< External display voltage source
#define SSD1306_SWITCHCAPVCC        0x02 ///< Gen. display voltage from 3.3V

#define SSD1306_RIGHT_HORIZONTAL_SCROLL              0x26 ///< Init rt scroll
#define SSD1306_LEFT_HORIZONTAL_SCROLL               0x27 ///< Init left scroll
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29 ///< Init diag scroll
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL  0x2A ///< Init diag scroll
#define SSD1306_DEACTIVATE_SCROLL                    0x2E ///< Stop scroll
#define SSD1306_ACTIVATE_SCROLL                      0x2F ///< Start scroll
#define SSD1306_SET_VERTICAL_SCROLL_AREA             0xA3 ///< Set scroll range

unsigned char ledComIni1[] {
  SSD1306_SETMULTIPLEX,
  0x3F,
  SSD1306_SETDISPLAYOFFSET,
  0x00,
  SSD1306_SETSTARTLINE,
  SSD1306_MEMORYMODE,
  0x00,
  SSD1306_COLUMNADDR,
  0x00,
  0x7F,
  SSD1306_PAGEADDR,
  0x00,
  0x07,
  SSD1306_SEGREMAP,
  SSD1306_COMSCANDEC,
  SSD1306_SETCOMPINS,
  0x12,
  SSD1306_SETCONTRAST,
  0x7F,
  SSD1306_NORMALDISPLAY,
  SSD1306_SETDISPLAYCLOCKDIV,
  0x20,
  SSD1306_CHARGEPUMP,
  0x14,
  SSD1306_DISPLAYALLON_RESUME,
  SSD1306_DISPLAYON
};

void setup() {
  Wire.begin();
  Wire.setClock(400000);
  for (int n = 0; n < sizeof(ledComIni1); n++) {
    sendCommand(ledComIni1[n]);
  }
  // Serial.begin(9600);
  // Serial.print(tekst);
}

void loop() {
  for (int n = 0; n < 128; n++) {
    sendDats(0xff);
  }
  delay(500);
  for (int n = 0; n < 128; n++) {
    sendDats(0x00);
  }
  delay(500);
}

void sendCommand(unsigned char command)
{
  Wire.beginTransmission(SSD1306_Address);
  Wire.write(SSD1306_Command_Mode);
  Wire.write(command);
  Wire.endTransmission();
}

void sendData(unsigned char Data)
{
  Wire.beginTransmission(SSD1306_Address);
  Wire.write(SSD1306_Data_Mode);
  Wire.write(Data);
  Wire.endTransmission();
}
void sendDats(unsigned char Data)
{
  Wire.beginTransmission(SSD1306_Address);
  Wire.write(SSD1306_Dats_Mode);
  Wire.write(Data);
  Wire.write(0xAA);
  Wire.write(Data);
  Wire.write(0xAA);
  Wire.write(Data);
  Wire.write(0xAA);
  Wire.write(Data);
  Wire.write(0xAA);
  Wire.endTransmission();
}

Рис. 1. ПО для дисплея SSD1306 I2C.

впвыап