Choosing a Display

Compare OLED SSD1306 and I2C LCD displays for ESP32 — resolution, contrast, power, readability, and when to use each

A display turns your ESP32 project from a serial-monitor-only prototype into something you can actually use across the room. The two most common options for beginners — the SSD1306 OLED and the I2C character LCD — serve different purposes. This guide explains the trade-offs and helps you pick.

🔗Quick Recommendations

  • Sensor readings, graphs, or custom graphics: SSD1306 OLED — pixel-level control, high contrast, compact.
  • Simple text readout (status messages, menus): I2C LCD — large readable characters, works in bright light.
  • Outdoor or direct sunlight: I2C LCD — the backlit characters are easier to read than a small OLED.
  • Dark room / bedside display: OLED — high contrast, no backlight bleed, looks clean.

🔗Comparison Table

FeatureSSD1306 OLED (0.96")I2C LCD (16x2 / 20x4)
Display typePixel-based (OLED)Character-based (LCD)
Resolution$128 \times 64$ pixels16 or 20 characters per line
GraphicsYes (text, shapes, bitmaps)Text only (+ 8 custom $5\times8$ characters)
ContrastExcellent (self-emitting pixels)Moderate (backlit)
Viewing angleWideModerate
Sunlight readabilityPoor (small, dim)Good (large characters, bright backlight)
Size$0.96"$ diagonal$\sim 3"$ ($16\times2$) or $\sim 4"$ ($20\times4$)
InterfaceI2CI2C (via PCF8574 backpack)
I2C address0x3C or 0x3D0x27 (PCF8574) or 0x3F (PCF8574A)
Supply voltage$3.3\,\text{V}$ (some accept $5\,\text{V}$)$5\,\text{V}$
Current draw$\sim 20\,\text{mA}$ (varies with pixels lit)$\sim 30\text{--}80\,\text{mA}$ (mostly backlight)
RAM usage$1{,}024\,\text{bytes}$ frame bufferMinimal
LibraryAdafruit SSD1306 + GFXLiquidCrystal_I2C
LifetimeOrganic LEDs degrade over yearsLED backlight lasts very long
PriceVery cheapVery cheap

🔗SSD1306 OLED — Pixel Graphics

The SSD1306 OLED is a $128 \times 64$ pixel monochrome display. Because each pixel is a self-emitting organic LED, it produces excellent contrast — lit pixels are bright against a truly black background.

Best for:

  • Displaying sensor readings with labels and formatting
  • Drawing charts, graphs, or progress bars
  • Custom icons, logos, or bitmaps
  • Dashboard-style layouts with multiple data fields
  • Compact enclosures (the 0.96" form factor is tiny)

Limitations:

  • Small — $0.96"$ is hard to read from more than about a metre away
  • Pixel-hungry — the Adafruit library requires a $1{,}024$-byte frame buffer in RAM ($128 \times 64 \div 8$), which is not much on ESP32 but matters on smaller boards
  • OLED burn-in — static content displayed for very long periods can cause permanent ghosting. Use screen savers or shift content periodically for always-on displays.
  • Poor sunlight readability — the small, dim pixels wash out in bright ambient light

I2C address: Most 0.96" SSD1306 modules default to 0x3C. Some (especially 1.3" SH1106 modules) use 0x3D. Run an I2C scanner if your display does not respond.

🔗I2C LCD — Large Text

The I2C character LCD displays fixed-size characters in a grid — typically 16 columns by 2 rows ($16\times2$) or 20 by 4 ($20\times4$). An I2C "backpack" module (PCF8574) converts the original 16-pin parallel interface down to just 4 wires.

Best for:

  • Simple status messages and labels
  • Menu systems (especially with buttons)
  • Workshop and garage displays (large, readable)
  • Outdoor projects where sunlight readability matters
  • Situations where you just need text, not graphics

Limitations:

  • Text only — you cannot draw shapes, graphs, or arbitrary bitmaps (custom characters are limited to 8 slots of $5\times8$ pixels each)
  • 5V required — the LCD needs $5\,\text{V}$, though the I2C bus works fine with the ESP32's $3.3\,\text{V}$ logic (I2C uses open-drain signalling)
  • Contrast adjustment — there is a potentiometer on the back of the I2C backpack. If the display appears blank after upload, adjust it with a small screwdriver. This is the single most common "my LCD doesn't work" issue.
  • Viewing angle — narrower than OLED, especially vertically

🔗Other Display Technologies Worth Knowing

DisplayTypeResolutionInterfaceNotes
SH1106 OLED ($1.3"$)OLED$128 \times 64$I2CLarger OLED with slightly different driver — needs U8g2 library instead of Adafruit SSD1306
TFT (ILI9341, ST7789)Full colour LCD$240 \times 320$ or largerSPIColour graphics, photos; needs more pins and processing power
E-paper / E-inkBistable displayVariousSPIHolds image without power; very slow refresh; ideal for battery-powered dashboards
MAX7219 LED matrixLED grid$8 \times 8$ per module (chainable)SPIBright, visible from far away; good for scrolling text or simple animations

For most beginners, the OLED and character LCD cover everything you need. TFT and e-paper are worth exploring once you are comfortable with the basics.

🔗I2C Address Quick Reference

DisplayDefaultAlternate
SSD1306 OLED0x3C0x3D
SH1106 OLED0x3C0x3D
PCF8574 LCD backpack0x270x200x27 (solder jumpers)
PCF8574A LCD backpack0x3F0x380x3F (solder jumpers)

The SSD1306 and LCD backpack use different addresses, so you can use both on the same I2C bus without conflicts.

🔗Which Should You Pick?

Your SituationRecommendedWhy
Weather station / sensor dashboardOLED SSD1306Custom layouts with multiple readings
Workshop / garage toolLCD 16x2Large text, readable in bright light
Battery-powered projectOLED (or e-paper)Lower power draw, no backlight
Data with charts or graphsOLED (or TFT for colour)Pixel-level drawing
Simple status text ("ON", "Ready", "Error")LCDFast to code, large and readable
Always-on display (24/7)LCDNo burn-in risk
Compact enclosureOLED0.96" fits almost anywhere
Full colour imagesTFT (ILI9341/ST7789)Only option for colour

🔗Next Steps

  • Read our individual guides: SSD1306 OLED, I2C LCD
  • Build a DIY Weather Station with an OLED display
  • Combine a display with a BME280 for a desktop environment monitor
  • Add a display to any existing sensor project for a standalone readout