Blog

0.96 Inch OLED Display Module (SSD1306) – Complete Guide

I2C OLED Display

0.96” OLED Display Module (SSD1306)

128x64 Monochrome Display with I2C Interface

Unlike an LCD, an OLED display has no backlight at all - each of its 128x64 pixels is its own tiny organic LED that emits light directly when driven, which means a pixel that's ”off” is truly off and draws essentially zero power. For typical embedded-project UI content, which is usually a mostly-black screen with sparse text or a small graphic, this gives both sharp, high-contrast visibility and lower overall power draw than a comparable backlit LCD. The SSD1306 driver chip built into the module handles all the pixel-level multiplexing itself and maintains its own onboard display RAM, so your microcontroller's job is simply to push pixel data over a 2-wire I2C connection (or SPI, on some pin variants) - the chip then keeps that image displayed on its own without needing continuous refreshing from your code. Because every pixel is individually addressable rather than tied to fixed character-cell segments the way a 16x2 character LCD is, this display can render any mix of multiple fonts and sizes, custom bitmap graphics, and even simple animations.

128 x 64 px
Resolution
I2C
Interface
Monochrome
Color

Key features

Self-Illuminating Pixels

No backlight needed - unlit pixels are truly off and draw virtually no power.

High Contrast

True blacks and sharp visibility, even in bright ambient light.

I2C 2-Wire Interface

Shares the same bus as other I2C sensors, needing only 4 pins total.

Onboard Display RAM

The SSD1306 driver retains the image itself - no continuous redraw needed from the MCU.

Wide Viewing Angle

Stays legible from steep side angles, unlike many LCD panels.

Compact Footprint

A 0.96-inch diagonal screen that fits easily into small project enclosures.

Technical specifications

Supply Voltage 3.3V – 5V (onboard regulator on most breakouts)
Resolution 128 x 64 pixels
Driver IC SSD1306
Interface I2C (400kHz); SPI on 4/7-pin variants
Display Color Monochrome (white, blue, or split yellow/blue)
Default I2C Address 0x3C (sometimes 0x3D)
Viewing Angle >160°
Operating Current ~20mA (content-dependent)
Screen Size 0.96" diagonal

Pinout

PinFunction
VCC 3.3V – 5V power supply
GND Ground
SCL I2C clock line
SDA I2C data line

Applications

Sensor readout dashboards Menu and UI screens for embedded projects Battery and status indicators Small clocks and weather displays IoT device local status screens Retro-style mini games

What's in the box

1x 0.96" OLED I2C display module

Downloads

Datasheet (PDF) Adafruit SSD1306 + GFX Library Example Sketch
🔌
Pin Connections
1 Table
Pin Connections Table 1
BoardSensor PinConnection
OLEDVCC/GND/SDA/SCL3.3-5V / GND / board SDA / board SCL
📟
0.96 inch OLED Display Module (128x64) - Yellow Blue I2C Screen for Arduino Projects
7 Examples • C/C++ | Boards: Arduino Uno, Arduino Nano, Arduino Mega, ESP32, ESP8266, STM32, Raspberry Pi Pico
0.96 inch OLED Display Module (128x64) - Yellow Blue I2C Screen for Arduino Projects - Arduino Uno
0.96 inch OLED Display Module (128x64) - Yellow Blue I2C Screen for Arduino Projects - Arduino Nano
0.96 inch OLED Display Module (128x64) - Yellow Blue I2C Screen for Arduino Projects - Arduino Mega
0.96 inch OLED Display Module (128x64) - Yellow Blue I2C Screen for Arduino Projects - ESP32
0.96 inch OLED Display Module (128x64) - Yellow Blue I2C Screen for Arduino Projects - ESP8266
0.96 inch OLED Display Module (128x64) - Yellow Blue I2C Screen for Arduino Projects - STM32
0.96 inch OLED Display Module (128x64) - Yellow Blue I2C Screen for Arduino Projects - Raspberry Pi Pico
📄 File: 0.96_inch_oled_display_module_(128x64)_-_yellow_blue_i2c_screen_for_arduino_projects_-_arduino_uno.inoArduino Uno
857 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// I2C wiring for Arduino Uno: A4=SDA, A5=SCL
6#include <Wire.h>
7#include <Adafruit_GFX.h>
8#include <Adafruit_SSD1306.h>
9
10#define SCREEN_WIDTH 128
11#define SCREEN_HEIGHT 64
12Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
13
14void setup() {
15 Wire.begin();
16 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C is the common default address
17 Serial.begin(115200);
18 Serial.println("OLED not found - check wiring/address!");
19 while (1) delay(10);
20 }
21 display.clearDisplay();
22 display.setTextSize(1);
23 display.setTextColor(SSD1306_WHITE);
24 display.setCursor(0, 0);
25 display.println("Hello, Ekostra!");
26 display.display();
27}
28
29void loop() {
30 display.setCursor(0, 16);
31 display.print(millis() / 1000);
32 display.print(" sec ");
33 display.display();
34 delay(500);
35}
📄 File: 0.96_inch_oled_display_module_(128x64)_-_yellow_blue_i2c_screen_for_arduino_projects_-_arduino_nano.inoArduino Nano
858 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// I2C wiring for Arduino Nano: A4=SDA, A5=SCL
6#include <Wire.h>
7#include <Adafruit_GFX.h>
8#include <Adafruit_SSD1306.h>
9
10#define SCREEN_WIDTH 128
11#define SCREEN_HEIGHT 64
12Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
13
14void setup() {
15 Wire.begin();
16 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C is the common default address
17 Serial.begin(115200);
18 Serial.println("OLED not found - check wiring/address!");
19 while (1) delay(10);
20 }
21 display.clearDisplay();
22 display.setTextSize(1);
23 display.setTextColor(SSD1306_WHITE);
24 display.setCursor(0, 0);
25 display.println("Hello, Ekostra!");
26 display.display();
27}
28
29void loop() {
30 display.setCursor(0, 16);
31 display.print(millis() / 1000);
32 display.print(" sec ");
33 display.display();
34 delay(500);
35}
📄 File: 0.96_inch_oled_display_module_(128x64)_-_yellow_blue_i2c_screen_for_arduino_projects_-_arduino_mega.inoArduino Mega
860 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// I2C wiring for Arduino Mega: D20=SDA, D21=SCL
6#include <Wire.h>
7#include <Adafruit_GFX.h>
8#include <Adafruit_SSD1306.h>
9
10#define SCREEN_WIDTH 128
11#define SCREEN_HEIGHT 64
12Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
13
14void setup() {
15 Wire.begin();
16 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C is the common default address
17 Serial.begin(115200);
18 Serial.println("OLED not found - check wiring/address!");
19 while (1) delay(10);
20 }
21 display.clearDisplay();
22 display.setTextSize(1);
23 display.setTextColor(SSD1306_WHITE);
24 display.setCursor(0, 0);
25 display.println("Hello, Ekostra!");
26 display.display();
27}
28
29void loop() {
30 display.setCursor(0, 16);
31 display.print(millis() / 1000);
32 display.print(" sec ");
33 display.display();
34 delay(500);
35}
📄 File: 0.96_inch_oled_display_module_(128x64)_-_yellow_blue_i2c_screen_for_arduino_projects_-_esp32.inoESP32
859 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// I2C wiring for ESP32: GPIO21=SDA, GPIO22=SCL
6#include <Wire.h>
7#include <Adafruit_GFX.h>
8#include <Adafruit_SSD1306.h>
9
10#define SCREEN_WIDTH 128
11#define SCREEN_HEIGHT 64
12Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
13
14void setup() {
15 Wire.begin();
16 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C is the common default address
17 Serial.begin(115200);
18 Serial.println("OLED not found - check wiring/address!");
19 while (1) delay(10);
20 }
21 display.clearDisplay();
22 display.setTextSize(1);
23 display.setTextColor(SSD1306_WHITE);
24 display.setCursor(0, 0);
25 display.println("Hello, Ekostra!");
26 display.display();
27}
28
29void loop() {
30 display.setCursor(0, 16);
31 display.print(millis() / 1000);
32 display.print(" sec ");
33 display.display();
34 delay(500);
35}
📄 File: 0.96_inch_oled_display_module_(128x64)_-_yellow_blue_i2c_screen_for_arduino_projects_-_esp8266.inoESP8266
853 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// I2C wiring for ESP8266: D2=SDA, D1=SCL
6#include <Wire.h>
7#include <Adafruit_GFX.h>
8#include <Adafruit_SSD1306.h>
9
10#define SCREEN_WIDTH 128
11#define SCREEN_HEIGHT 64
12Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
13
14void setup() {
15 Wire.begin();
16 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C is the common default address
17 Serial.begin(115200);
18 Serial.println("OLED not found - check wiring/address!");
19 while (1) delay(10);
20 }
21 display.clearDisplay();
22 display.setTextSize(1);
23 display.setTextColor(SSD1306_WHITE);
24 display.setCursor(0, 0);
25 display.println("Hello, Ekostra!");
26 display.display();
27}
28
29void loop() {
30 display.setCursor(0, 16);
31 display.print(millis() / 1000);
32 display.print(" sec ");
33 display.display();
34 delay(500);
35}
📄 File: 0.96_inch_oled_display_module_(128x64)_-_yellow_blue_i2c_screen_for_arduino_projects_-_stm32.inoSTM32
853 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// I2C wiring for STM32: PB7=SDA, PB6=SCL
6#include <Wire.h>
7#include <Adafruit_GFX.h>
8#include <Adafruit_SSD1306.h>
9
10#define SCREEN_WIDTH 128
11#define SCREEN_HEIGHT 64
12Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
13
14void setup() {
15 Wire.begin();
16 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C is the common default address
17 Serial.begin(115200);
18 Serial.println("OLED not found - check wiring/address!");
19 while (1) delay(10);
20 }
21 display.clearDisplay();
22 display.setTextSize(1);
23 display.setTextColor(SSD1306_WHITE);
24 display.setCursor(0, 0);
25 display.println("Hello, Ekostra!");
26 display.display();
27}
28
29void loop() {
30 display.setCursor(0, 16);
31 display.print(millis() / 1000);
32 display.print(" sec ");
33 display.display();
34 delay(500);
35}
📄 File: 0.96_inch_oled_display_module_(128x64)_-_yellow_blue_i2c_screen_for_arduino_projects_-_raspberry_pi_pico.inoRaspberry Pi Pico
869 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// I2C wiring for Raspberry Pi Pico: GPIO4=SDA, GPIO5=SCL
6#include <Wire.h>
7#include <Adafruit_GFX.h>
8#include <Adafruit_SSD1306.h>
9
10#define SCREEN_WIDTH 128
11#define SCREEN_HEIGHT 64
12Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
13
14void setup() {
15 Wire.begin();
16 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C is the common default address
17 Serial.begin(115200);
18 Serial.println("OLED not found - check wiring/address!");
19 while (1) delay(10);
20 }
21 display.clearDisplay();
22 display.setTextSize(1);
23 display.setTextColor(SSD1306_WHITE);
24 display.setCursor(0, 0);
25 display.println("Hello, Ekostra!");
26 display.display();
27}
28
29void loop() {
30 display.setCursor(0, 16);
31 display.print(millis() / 1000);
32 display.print(" sec ");
33 display.display();
34 delay(500);
35}
I2C SSD1306 OLED, 128x64.
If the display shows nothing, the most common cause is an I2C address mismatch - most units default to 0x3C but some batches ship at 0x3D, so run a simple I2C scanner sketch first to confirm the actual address rather than guessing. Also double-check SDA/SCL aren't swapped, which produces the same symptom (blank screen, no I2C errors) as a wrong address. Like all OLED technology, leaving a static, high-contrast element in exactly the same screen position for very long unattended periods can very gradually burn in over months of continuous use - a non-issue for a rotating sensor dashboard, but worth designing around for a fixed logo or always-on UI element.