Documentation

1.3" I2C Blue OLED Display Module 4-Pin SH1106 | ShillehTek Product Manual
Documentation / 1.3" I2C Blue OLED Display Module 4-Pin SH1106 | ShillehTek Product Manual

1.3" I2C Blue OLED Display Module 4-Pin SH1106 | ShillehTek Product Manual

manualshillehtek

Overview

The ShillehTek 1.3" Blue OLED Display Module is a 128×64 pixel monochrome screen driven by the SH1106 controller over I2C. The larger 1.3" panel gives you noticeably more room for text, UI elements, and graphics than the 0.96" version while keeping the same simple 4-wire I2C hookup — ideal for dashboards, menus, and status screens in Arduino, ESP32, Raspberry Pi, and Pico projects.

The SH1106 controller is a close cousin of the SSD1306 but uses a 132×64 internal frame buffer (with a 2-pixel horizontal offset to the visible 128×64 area). Any library that supports SH1106 explicitly will handle this offset for you. The onboard regulator accepts 3.3V or 5V, so this module works out-of-the-box with both 3.3V and 5V microcontrollers.

At a Glance

Resolution
128 × 64
Screen Size
1.3"
Driver IC
SH1106
Interface
I2C (0x3C)
Voltage
3.3V – 5V
Pins
VCC, GND, SCL, SDA

Specifications

Parameter Value
Display Type Passive Matrix OLED (PMOLED)
Pixel Color Blue on black
Resolution 128 × 64 pixels
Active Area 29.42 × 14.7 mm
Driver Controller SH1106
Communication Protocol I2C (TWI)
Default I2C Address 0x3C (some units 0x3D)
Operating Voltage 3.3V – 5V DC
Operating Current ~20 mA (all pixels on)
Viewing Angle > 160°
Operating Temperature -30°C to 70°C
Module Dimensions 35 × 33 mm

Pinout Diagram

128 x 64 SH1106 I2C OLED VCC (3.3V - 5V) GND (Ground) SCL (I2C Clock) SDA (I2C Data)

Wiring Guide

Arduino Wiring

On Arduino Uno, Nano, and similar ATmega328P boards the hardware I2C lines are A4 (SDA) and A5 (SCL). The module runs happily off the 5V rail and has onboard pull-up resistors on SDA and SCL, so no external resistors are needed.

Module Pin Arduino Pin
VCC 5V
GND GND
SCL A5 (SCL)
SDA A4 (SDA)
Tip: On Arduino Mega, SDA is pin 20 and SCL is pin 21. On Leonardo and Micro, SDA is pin 2 and SCL is pin 3.

ESP32 Wiring

The ESP32 default hardware I2C bus is on GPIO 21 (SDA) and GPIO 22 (SCL). The module accepts 3.3V directly, so run VCC from the ESP32 3V3 rail for the cleanest setup.

Module Pin ESP32 Pin
VCC 3V3
GND GND
SCL GPIO 22
SDA GPIO 21
Tip: You can remap I2C to any GPIO pair using Wire.begin(sda, scl). Avoid strapping pins (GPIO 0, 2, 12, 15) to keep boot behavior clean.

Raspberry Pi Wiring

The Raspberry Pi exposes I2C-1 on physical pins 3 (SDA) and 5 (SCL). Enable I2C first with sudo raspi-config → Interface Options → I2C → Enable, then confirm the display appears at 0x3C with i2cdetect -y 1.

Module Pin Raspberry Pi Pin
VCC Pin 1 (3.3V)
GND Pin 6 (GND)
SCL Pin 5 (GPIO 3)
SDA Pin 3 (GPIO 2)
Info: You can also power the module from the Pi 5V rail (pin 2) — the onboard regulator handles either voltage. Using 3.3V keeps the logic levels matched and is the recommended option.

Raspberry Pi Pico Wiring

The Pico has two I2C blocks. This guide uses I2C0 on GP4 (SDA) and GP5 (SCL), which are the most common defaults in MicroPython examples. Power the module from 3V3(OUT).

Module Pin Pico Pin
VCC 3V3(OUT)
GND GND
SCL GP5 (I2C0 SCL)
SDA GP4 (I2C0 SDA)
Tip: The Pico can route I2C to many GPIO pairs. If GP4/GP5 are already in use, GP6/GP7, GP20/GP21, or GP26/GP27 will also work for I2C0.

Code Examples

Arduino

sh1106_oled.ino
// 1.3" SH1106 OLED - Arduino I2C Example
// Library: U8g2 by olikraus (Library Manager) - the recommended driver for SH1106
// Wiring: SDA -> A4, SCL -> A5

#include <U8g2lib.h>
#include <Wire.h>

// Hardware I2C constructor for 1.3" SH1106 128x64
U8G2_SH1106_128X64_NONAME_F_HW_I2C display(U8G2_R0, U8X8_PIN_NONE);

void setup() {
  display.begin();
  display.setContrast(255);

  display.clearBuffer();
  display.setFont(u8g2_font_ncenB14_tr);
  display.drawStr(0, 20, "ShillehTek");
  display.setFont(u8g2_font_6x10_tr);
  display.drawStr(0, 40, "SH1106 OLED 1.3\"");
  display.drawStr(0, 55, "128 x 64 I2C");
  display.sendBuffer();
}

void loop() {
  // Static demo - nothing to update
}

Raspberry Pi (Python)

sh1106_oled_rpi.py
#!/usr/bin/env python3
# 1.3" SH1106 OLED - Raspberry Pi Example
# Install: pip install luma.oled --break-system-packages

from luma.core.interface.serial import i2c
from luma.oled.device import sh1106
from luma.core.render import canvas
import time

serial = i2c(port=1, address=0x3C)
device = sh1106(serial, width=128, height=64)

while True:
    with canvas(device) as draw:
        draw.text((0, 0),  "ShillehTek",    fill="white")
        draw.text((0, 16), "SH1106 OLED",   fill="white")
        draw.text((0, 32), "128 x 64",      fill="white")
        draw.text((0, 48), time.strftime("%H:%M:%S"), fill="white")
    time.sleep(1)

Raspberry Pi Pico (MicroPython)

sh1106_oled_pico.py
# 1.3" SH1106 OLED - Pico MicroPython Example
# Upload sh1106.py to the Pico (micropython-sh1106 driver)
# Wiring: SDA -> GP4, SCL -> GP5

from machine import Pin, I2C
import sh1106
import time

i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400_000)
oled = sh1106.SH1106_I2C(128, 64, i2c, None, 0x3C)
oled.rotate(True)   # optional - flip 180 if orientation is off

oled.fill(0)
oled.text("ShillehTek",  0, 0)
oled.text("SH1106 OLED", 0, 16)
oled.text("128 x 64",    0, 32)
oled.show()

while True:
    time.sleep(1)

ESP32 (MicroPython)

sh1106_oled_esp32.py
# 1.3" SH1106 OLED - ESP32 MicroPython Example
# Upload sh1106.py to the ESP32 first
# Wiring: SDA -> GPIO 21, SCL -> GPIO 22

from machine import Pin, I2C
import sh1106

i2c = I2C(0, sda=Pin(21), scl=Pin(22), freq=400_000)
oled = sh1106.SH1106_I2C(128, 64, i2c, None, 0x3C)

oled.fill(0)
oled.text("ShillehTek",  0, 0)
oled.text("SH1106 OLED", 0, 16)
oled.text("ESP32 I2C",   0, 32)
oled.show()

Frequently Asked Questions

Which I2C address does this OLED use?
The default address is 0x3C. A small number of units are configured for 0x3D instead. If your screen does not respond at 0x3C, run an I2C scanner first (i2cdetect -y 1 on a Pi, or a Wire-based scan on Arduino) to confirm the actual address.
Do I need pull-up resistors on SDA and SCL?
No. The module already includes pull-up resistors on both I2C lines, so you can connect SDA and SCL directly to your microcontroller without adding your own.
Can I run the display from 3.3V?
Yes. The module has an onboard regulator that accepts anything from 3.3V to 5V. 3.3V is preferred when paired with ESP32, Pico, or Raspberry Pi for cleanest logic-level matching.
Why are some pixels slightly dim at the edges?
OLED pixels have a small amount of brightness falloff at the extreme edges, which is completely normal and not a defect. If it bothers you, frame your UI a few pixels inside the 128x64 boundary.
Which Arduino library should I install?
Install "U8g2" by olikraus from the Arduino Library Manager — it has solid SH1106 support and includes a large font library out of the box. Adafruit's SH1106 fork also works but U8g2 is the most widely used choice for this driver.
Why does my 1.3" SH1106 look shifted or show garbled pixels with the Adafruit SSD1306 library?
The SH1106 controller has a 132-pixel-wide internal frame buffer but only the middle 128 columns are visible. Libraries written for SSD1306 don't account for this offset and will draw the image a few pixels off-screen. Use an SH1106-aware library (U8g2 on Arduino, luma.oled sh1106 device on Pi, sh1106 MicroPython module on Pico/ESP32) and the offset is handled automatically.
Will this module work on the Pico 2 and Pico 2W?
Yes. The wiring is identical to the original Pico, and the ssd1306 MicroPython driver works without changes on the Pico 2 and Pico 2W.
Can I share the I2C bus with other sensors?
Absolutely. I2C is a shared bus, so you can daisy-chain the OLED with any other I2C device (BME280, ADS1115, MPU6050, etc.) as long as their addresses are different. Just connect all SDA lines together and all SCL lines together.

Related Tutorials