0.96-inch SSD1315 OLED: Arduino and ESP32 Wiring Guide

This 0.96-inch, 128 x 64 OLED uses the SSD1315 controller and a four-wire I2C connection. The PCB labels are GND, VDD, SCK and SDA. This guide shows the correct Arduino Uno and ESP32-C3 wiring, a minimal first-screen sketch, and the checks that solve most blank displays.

In this guide
  1. Identify the display and pins
  2. Wire it to an Arduino Uno or Nano
  3. Wire it to an ESP32-C3 SuperMini
  4. Install the Arduino libraries
  5. Upload the first-screen code
  6. Run an I2C address scan
  7. Troubleshooting
  8. Frequently asked questions

Identify the display and pins

NZN's black and blue PCB modules both use the SSD1315 controller, a 128 x 64 monochrome panel and I2C. Screen colour is fixed by the panel hardware. It does not change the wiring, address or sketch.

SSD1315 OLED pin map showing GND, VDD, SCK and SDA connections
Read the labels on the module itself. SCK is the I2C clock connection, so it goes to the microcontroller's SCL pin.
OLED pin Meaning Important detail
GND Ground Must share ground with the microcontroller.
VDD Module power The NZN module accepts 3.3V to 5V power.
SCK I2C clock Connect this to SCL. The SCK label does not mean that this four-pin module needs SPI.
SDA I2C data Connect this to SDA.

The stock module's default I2C address is 0x3C. If a sketch uploads but the panel remains blank, an I2C scan is the quickest way to confirm the address and the wiring.

Wire it to an Arduino Uno or Nano

On a classic Arduino Uno or Nano, the I2C pins are A4 for SDA and A5 for SCL. Power the OLED from 5V or 3.3V, but do not swap VDD and GND.

OLED pin Arduino Uno or Nano
GND GND
VDD 5V
SCK A5 / SCL
SDA A4 / SDA
  1. Disconnect USB power. Make and check the four connections with the Arduino off.
  2. Connect ground first. Join OLED GND to Arduino GND.
  3. Connect power. Join OLED VDD to Arduino 5V.
  4. Connect the clock. Join OLED SCK to Arduino A5 or the dedicated SCL pin.
  5. Connect the data line. Join OLED SDA to Arduino A4 or the dedicated SDA pin.
  6. Inspect the pin order. Check the printed labels on your module rather than assuming every OLED uses the same physical order.

Do not copy the connector order from a lookalike display. Four-pin OLED modules can place GND and VDD differently. Follow the GND, VDD, SCK and SDA markings on the NZN board.

Wire it to an ESP32-C3 SuperMini

An ESP32 can route I2C to several GPIO pairs. For the NZN ESP32-C3 SuperMini, GPIO4 for SDA and GPIO5 for SCL are straightforward choices that avoid the BOOT button and the GPIO8 onboard LED.

OLED pin ESP32-C3 SuperMini
GND GND
VDD 3V3
SCK GPIO5, configured as SCL
SDA GPIO4, configured as SDA

The ESP32 sketch must explicitly start I2C on these pins with Wire.begin(4, 5);. The first number is SDA and the second is SCL. This prevents a board-package default from silently choosing a different pair.

Prove the ESP32-C3 upload first. Run the ESP32-C3 Blink guide with the OLED disconnected. Once USB upload and reset are reliable, add the four display wires and use the ESP32 version of the sketch below.

Install the Arduino libraries

Use Arduino IDE's Library Manager to install these two libraries:

  • Adafruit SSD1306 for the display driver.
  • Adafruit GFX Library for text and drawing functions.

The library is named Adafruit_SSD1306 even though the NZN module uses an SSD1315 controller. That is expected. The compatible library name appears in the include file, class name and constants. Do not install an unknown library just because its name contains SSD1315.

  1. Open Library Manager. Select the books icon in Arduino IDE.
  2. Search for Adafruit SSD1306. Install the library published by Adafruit.
  3. Accept its dependencies. Install Adafruit GFX when prompted, or search for it separately.
  4. Restart the IDE if includes remain unresolved. Then compile the sketch again.

Upload the first-screen code

This sketch sets a 128 x 64 display, uses the default 0x3C address and writes a short message. It works on an Arduino Uno or Nano as written.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(
  SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET
);

void setup() {
  Serial.begin(115200);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLED not found");
    while (true) { delay(10); }
  }

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Hello, NZN!");
  display.println("SSD1315 OLED");
  display.display();
}

void loop() {
}

For the ESP32-C3 SuperMini wiring above, add Wire.begin(4, 5); immediately before display.begin(...):

void setup() {
  Serial.begin(115200);
  Wire.begin(4, 5);  // SDA, SCL

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLED not found");
    while (true) { delay(10); }
  }

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Hello from ESP32-C3");
  display.display();
}

display.display() is essential. Drawing commands update a memory buffer first, then that function sends the buffer to the panel. A sketch that clears and prints without calling display.display() can run normally while the screen stays unchanged.

Run an I2C address scan

If the display remains blank, scan before changing libraries. The scanner proves whether the microcontroller can see any device on the bus and reports its address.

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  // For ESP32-C3 with SDA on 4 and SCL on 5, use:
  // Wire.begin(4, 5);
  Wire.begin();
  delay(1000);

  Serial.println("Scanning I2C...");
  for (byte address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    byte error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("Found device at 0x");
      if (address < 16) Serial.print("0");
      Serial.println(address, HEX);
    }
  }
}

void loop() {
}

For an Arduino Uno, leave Wire.begin() active. For the ESP32-C3 wiring in this guide, replace it with Wire.begin(4, 5). Open Serial Monitor at 115200 baud. A correctly connected NZN display should normally report 0x3C.

No address found means a bus problem. Recheck power, common ground, SDA and SCL before changing the display constructor. An address found at 0x3C means the electrical connection is working and the next check is software setup.

Troubleshooting

Symptom What to check
Screen is completely blank Confirm VDD and GND, run the I2C scanner, verify address 0x3C, and make sure the sketch calls display.display().
I2C scanner finds nothing Check the board labels, swap neither power nor data pins, and remember that OLED SCK connects to SCL.
Arduino reports Adafruit_SSD1306.h missing Install Adafruit SSD1306 and Adafruit GFX through Library Manager, then compile again.
Sketch stops at OLED not found The display.begin() call did not receive a response at 0x3C. Check the scanner result and the selected I2C pins.
ESP32-C3 uploads but display is blank Use Wire.begin(4, 5) before display.begin() and match SDA to GPIO4, SCK to GPIO5.
Text is cut off or shifted Confirm SCREEN_WIDTH 128 and SCREEN_HEIGHT 64. Clear the buffer before drawing a new screen.
Display shows old content Call display.clearDisplay(), draw the new content, then call display.display().
Image colour differs from a photo White, blue and yellow-blue are physical panel variants. Code changes pixels, not the panel's fixed colour.

Frequently asked questions

Why does an SSD1315 module use the Adafruit SSD1306 library?

The established Adafruit driver retains its SSD1306 name, but it provides the compatible commands needed by this SSD1315 module. The class and constant names in the example are therefore normal.

Is SCK the same as SCL on this module?

Yes. On this four-pin I2C board, the pin marked SCK is the serial clock line and connects to the microcontroller's SCL pin. There is no chip-select or separate SPI data pin.

Can I power the display from 3.3V?

Yes. The NZN module accepts 3.3V to 5V power. For the ESP32-C3 wiring here, use 3V3 so the display and controller share the same logic supply environment.

Can software change a yellow-blue panel to all white or all blue?

No. The panel colour is fixed in the display hardware. Software controls which pixels are lit, but it cannot change their physical colour.

Why does nothing appear until I call display.display()?

The library draws into a memory buffer. display.display() transfers that buffer to the panel. This lets a complete frame be prepared before it becomes visible.

Reference material checked: the library installation, 128 x 64 constructor and display.begin() pattern were checked against Adafruit's current SSD1306 repository and official example. The SSD1315 identity, voltage range, address and pin labels were checked against the current NZN product records and exact stock images.

Adafruit SSD1306 library | Adafruit 128 x 64 I2C example | Arduino ESP32 I2C guide

Find the address before chasing the code

Four correct wires and a 0x3C scan result give you a solid baseline. From there, the library, 128 x 64 constructor and final display call are easy to verify.

Choose an SSD1315 OLED

Practical help from New Zealand

Still stuck? Send us a photo.

Tell us what you’re building and what the circuit is doing. Our small NZ team knows these parts and can help you spot a wiring problem or choose what you need next.

Ask NZN for help Browse more guides