How OLED Pixels Emit Light
An OLED pixel is built as a multi-layer sandwich between two electrodes:
- Anode (ITO — Indium Tin Oxide): Transparent electrode that injects positive charge carriers (holes).
- Hole Transport Layer (HTL): Organic material that moves holes toward the emissive layer.
- Emissive Layer (EML): The organic compound that emits light when electrons and holes recombine (Alq₃ for green, fluorescent dyes for red/blue).
- Electron Transport Layer (ETL): Moves electrons from cathode toward the EML.
- Cathode (LiF/Al): Metal electrode injecting electrons. Light exits through the transparent anode (bottom emission) or through the top (top emission).
OLED vs LCD: Technical Comparison
| Property | OLED | LCD (IPS) |
|---|---|---|
| Black Level | True black (pixel off) | Backlight bleed |
| Contrast Ratio | Infinite (∞:1) | 1000:1 – 5000:1 |
| Viewing Angle | >160° minimal shift | >170° (IPS) |
| Response Time | <0.1ms | 1–5ms |
| Power (dark content) | Very low | Always-on backlight |
| Lifespan | 60,000–100,000 hrs | >100,000 hrs |
| Burn-in Risk | Yes (static content) | No |
Arduino + SSD1306 OLED: Complete Code Example
Wire the 4-pin OLED module: VCC to 5V, GND to GND, SDA to A4, SCL to A5 (Arduino Uno I2C pins):
// Arduino SSD1306 OLED display with Adafruit library
// Install: Adafruit SSD1306, Adafruit GFX Library
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // No reset pin (share Arduino reset)
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
&Wire, OLED_RESET);
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("SSD1306 OLED not found!");
while (true); // Halt
}
display.clearDisplay();
// Draw text
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Volt X");
display.setTextSize(1);
display.setCursor(0, 24);
display.println("SSD1306 OLED Ready");
display.println("128x64 pixels");
// Draw a rectangle
display.drawRect(0, 48, 128, 16, SSD1306_WHITE);
display.display(); // Push buffer to screen
}
void loop() {
// Update display with sensor data
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Temp: ");
display.print(25.3, 1);
display.println(" C");
display.display();
delay(500);
}How the SSD1306 Controller Works
The SSD1306 is a dedicated OLED controller IC that handles all the complexity of driving 8,192 individual pixels:
GDDRAM Buffer
1KB internal Graphic Display Data RAM stores the full 128×64 pixel frame — one bit per pixel.
Charge Pump
Built-in charge pump generates the ~12V needed to drive OLED pixels from a 3.3V or 5V supply.
Multiplexing
Scans 64 rows using a voltage selector, refreshing at ~60Hz using page addressing.
I2C Interface
Supports I2C at up to 400kHz. Address selectable between 0x3C and 0x3D via SA0 pin.
Frequently Asked Questions
How does an OLED display work?
Each OLED pixel emits its own light through electroluminescence — organic compounds between electrodes release photons when electrons and holes recombine. No backlight is needed; black pixels simply turn off.
What is the SSD1306 and how does it control an OLED?
SSD1306 is a dedicated OLED controller IC with 1KB frame buffer RAM, built-in charge pump (generates 12V from 3.3V), and I2C/SPI interface. The MCU writes pixel data to the SSD1306 over I2C; the chip handles the display refresh continuously.
What is the difference between AMOLED and PMOLED?
PMOLED scans row-by-row (simple, for small displays <3"). AMOLED adds a TFT transistor per pixel holding charge independently (enables large smartphone and TV displays with better brightness uniformity).
What are the advantages of OLED over LCD?
True infinite contrast (black pixels = off), wider viewing angles, microsecond response time, thinner design, lower power for dark content. Disadvantages: burn-in risk, organic material degradation over time, higher cost for large panels.
What I2C address does the SSD1306 OLED use?
Default I2C address is 0x3C. Some modules support 0x3D via solder jumper, allowing two OLEDs on one bus. Use an I2C scanner sketch to confirm your module's address.
📚 References & Sources
Related Resources
How I2C Works
The SSD1306 communicates via I2C — understand the bus protocol behind it.
Arduino Uno Guide
The microcontroller platform for driving SSD1306 OLED displays.
MPU6050 IMU Guide
Display real-time IMU data on an OLED for a complete sensor project.
How Transistors Work
TFT transistors form the AMOLED backplane driving each pixel.
