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
| Feature | SSD1306 OLED (0.96") | I2C LCD (16x2 / 20x4) |
|---|---|---|
| Display type | Pixel-based (OLED) | Character-based (LCD) |
| Resolution | $128 \times 64$ pixels | 16 or 20 characters per line |
| Graphics | Yes (text, shapes, bitmaps) | Text only (+ 8 custom $5\times8$ characters) |
| Contrast | Excellent (self-emitting pixels) | Moderate (backlit) |
| Viewing angle | Wide | Moderate |
| Sunlight readability | Poor (small, dim) | Good (large characters, bright backlight) |
| Size | $0.96"$ diagonal | $\sim 3"$ ($16\times2$) or $\sim 4"$ ($20\times4$) |
| Interface | I2C | I2C (via PCF8574 backpack) |
| I2C address | 0x3C or 0x3D | 0x27 (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 buffer | Minimal |
| Library | Adafruit SSD1306 + GFX | LiquidCrystal_I2C |
| Lifetime | Organic LEDs degrade over years | LED backlight lasts very long |
| Price | Very cheap | Very 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) use0x3D. 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
| Display | Type | Resolution | Interface | Notes |
|---|---|---|---|---|
| SH1106 OLED ($1.3"$) | OLED | $128 \times 64$ | I2C | Larger OLED with slightly different driver — needs U8g2 library instead of Adafruit SSD1306 |
| TFT (ILI9341, ST7789) | Full colour LCD | $240 \times 320$ or larger | SPI | Colour graphics, photos; needs more pins and processing power |
| E-paper / E-ink | Bistable display | Various | SPI | Holds image without power; very slow refresh; ideal for battery-powered dashboards |
| MAX7219 LED matrix | LED grid | $8 \times 8$ per module (chainable) | SPI | Bright, 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
| Display | Default | Alternate |
|---|---|---|
| SSD1306 OLED | 0x3C | 0x3D |
| SH1106 OLED | 0x3C | 0x3D |
| PCF8574 LCD backpack | 0x27 | 0x20–0x27 (solder jumpers) |
| PCF8574A LCD backpack | 0x3F | 0x38–0x3F (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 Situation | Recommended | Why |
|---|---|---|
| Weather station / sensor dashboard | OLED SSD1306 | Custom layouts with multiple readings |
| Workshop / garage tool | LCD 16x2 | Large text, readable in bright light |
| Battery-powered project | OLED (or e-paper) | Lower power draw, no backlight |
| Data with charts or graphs | OLED (or TFT for colour) | Pixel-level drawing |
| Simple status text ("ON", "Ready", "Error") | LCD | Fast to code, large and readable |
| Always-on display (24/7) | LCD | No burn-in risk |
| Compact enclosure | OLED | 0.96" fits almost anywhere |
| Full colour images | TFT (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