Arduino library for interfacing with OLED displays based on the Solomon Systech SSD1306 controller.
The SSD1306 is a single-chip CMOS OLED/PLED driver with controller for organic/polymer light emitting diode dot-matrix graphic display systems. It supports displays with resolutions up to 128x64 pixels and provides a simple interface for drawing graphics and text. This library provides a buffered interface that extends Adafruit's GFX library, allowing you to use all standard GFX drawing functions while maintaining efficient partial screen updates.
Install via the Arduino Library Manager by searching for "Sitron Labs SSD1306".
Alternatively, install manually:
- Download or clone this repository
- Place it in your Arduino
librariesfolder - Restart the Arduino IDE
Install via the PlatformIO Library Manager by searching for "Sitron Labs SSD1306".
Alternatively, add the library manually to your platformio.ini file:
lib_deps =
https://github.com/sitronlabs/SitronLabs_Solomon_SSD1306_Arduino_Library.gitConnect the SSD1306 to your Arduino using I2C:
- VCC → 3.3V or 5V (check your board's specifications)
- GND → GND
- SDA → SDA (I2C Data)
- SCL → SCL (I2C Clock)
- RES → Any digital pin (reset pin, configure in code)
The I2C address is typically 0x3C or 0x3D (check your display module's documentation).
| Interface | Status | Notes |
|---|---|---|
| I2C, Unbuffered | ❌ | Technically impossible as driver doesn't allow read access to display ram. |
| I2C, Buffered | ✔️ | Works. |
| SPI, 3-Wires, Buffered | ❌ | Needs to be implemented. |
| SPI, 4-Wires, Buffered | ❌ | Needs to be implemented. |
#include <Wire.h>
#include <ssd1306.h>
// Display buffer (128x64 = 1024 bytes, 128x32 = 512 bytes)
// Buffer size = width * (height / 8)
uint8_t display_buffer[128 * 64 / 8];
// Create display object (width, height)
ssd1306 display(128, 64);
// I2C address (typically 0x3C or 0x3D)
const uint8_t I2C_ADDRESS = 0x3C;
// Reset pin
const int PIN_RES = 4;
void setup() {
Serial.begin(9600);
// Initialize I2C
Wire.begin();
// Setup the SSD1306 (I2C library, I2C address, reset pin, buffer)
if (display.setup(Wire, I2C_ADDRESS, PIN_RES, display_buffer) != 0) {
Serial.println("Failed to setup SSD1306");
return;
}
// Detect the display
if (!display.detect()) {
Serial.println("SSD1306 not detected");
return;
}
// Clear the display
display.clear();
display.display();
Serial.println("SSD1306 initialized");
}
void loop() {
// Clear display
display.clear();
// Use Adafruit GFX functions
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Hello, World!");
display.println("SSD1306 OLED");
// Draw a rectangle
display.drawRect(10, 20, 100, 30, SSD1306_WHITE);
// Draw a filled circle
display.fillCircle(64, 50, 10, SSD1306_WHITE);
// Update the display (only changed regions are sent)
display.display();
delay(1000);
}#include <Wire.h>
#include <ssd1306.h>
uint8_t display_buffer[128 * 64 / 8];
ssd1306 display(128, 64);
const uint8_t I2C_ADDRESS = 0x3C;
const int PIN_RES = 4;
void setup() {
Wire.begin();
display.setup(Wire, I2C_ADDRESS, PIN_RES, display_buffer);
display.detect();
// Clear and display
display.clear();
display.display();
}
void loop() {
display.clear();
// All Adafruit GFX functions are available
display.drawLine(0, 0, 127, 63, SSD1306_WHITE);
display.drawTriangle(20, 20, 40, 10, 30, 30, SSD1306_WHITE);
display.fillRect(50, 20, 30, 20, SSD1306_WHITE);
// Text functions
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 40);
display.print("GFX!");
display.display();
delay(1000);
}Initializes the SSD1306 display.
i2c_library: I2C library instance to use (typicallyWire)i2c_address: I2C address (0x3C or 0x3D)pin_res: GPIO pin number connected to the display's reset pinbuffer: Pointer to display buffer (must bewidth * (height / 8)bytes)
Returns 0 on success, or -EINVAL if the I2C address is invalid, or -EIO on I2C communication failure.
Detects if an SSD1306 display is present on the I2C bus.
Returns true if display is detected, false otherwise.
Clears the display buffer (sets all pixels to off).
Returns 0 on success.
Updates the display with the current buffer contents. Only changed regions are sent to the display for efficiency.
Returns 0 on success, or -EINVAL if the interface is not properly initialized, or -EIO on I2C communication failure.
Sets the display brightness.
ratio: Brightness ratio from 0.0 (off) to 1.0 (maximum)
Returns 0 on success, or -EINVAL if ratio is out of range, or -EIO on I2C communication failure.
Sets the display inversion state.
inverted: true to invert colors, false for normal
Returns 0 on success, or -EIO on I2C communication failure.
Sets a single pixel in the buffer.
x: X coordinate (0 to width-1)y: Y coordinate (0 to height-1)color: Pixel color (0 for off, non-zero for on)
Returns 0 on success, or -EINVAL if coordinates are out of range.
Adafruit GFX compatible function to draw a pixel. Calls pixel_set() internally.
Adafruit GFX compatible function to invert the display. Calls inverted_set() internally.
Since this library extends Adafruit_GFX, all standard GFX functions are available:
drawLine(),drawRect(),fillRect()drawCircle(),fillCircle()drawTriangle(),fillTriangle()print(),println(),setCursor(),setTextSize(),setTextColor()- And many more...
- Display resolution: Up to 128x64 pixels (configurable)
- Communication interface: I2C (SPI support planned)
- I2C addresses: 0x3C or 0x3D
- Buffer mode: Buffered (local frame buffer)
- Partial updates: Supported (only changed regions are updated)
- GFX library: Relies on the Adafruit GFX Library
- Rotation: Supported (0°, 90°, 180°, 270°)