Arduino Uno R4 · SSD1306 OLED

Arduino Uno R4 SSD1306 OLED Simulator: Wiring, Code and a Live Circuit

This is a 0.96 inch SSD1306 OLED, 128 by 64 pixels, wired to an Arduino Uno R4 Minima over I2C and running live: the board writes two lines of text, draws a box and counts the seconds in it. It uses the Adafruit SSD1306 and GFX libraries, exactly as a tutorial would.

Four wires: power, ground, SDA to pin A4 and SCL to pin A5. The Arduino Uno R4 is a 5 V board and the module takes 5 V directly.

  • 5 V logic
  • Library: Adafruit_SSD1306.h
  • I2C address 0x3C
  • SDA A4, SCL A5
Arduino Uno R4 · SSD1306 OLEDlive0.000 s 0.00x
Click to open it in the editor
The circuit itself, running on the simulator with the sketch below. Press what can be pressed; click anything else to open it in the editor.

Wiring the SSD1306 OLED to the Arduino Uno R4

Every connection in the circuit above, with the board’s own pin names.

SSD1306 OLED pinArduino Uno R4 pinWhy
VCC5VThe module has its own regulator and runs from 3.3 or 5 V.
GNDGNDCommon ground.
SDApin A4Arduino Uno R4’s I2C data line, where Wire.begin() puts it.
SCLpin A5Arduino Uno R4’s I2C clock line.

The Uno R4 keeps the Uno’s layout: I2C is A4 (SDA) and A5 (SCL), also brought out as SDA and SCL beside AREF. The display answers at address 0x3C, the address almost every 0.96 inch module ships with.

Pins to leave alone on the Arduino Uno R4

An Uno sketch’s source builds for the R4, but a compiled Uno program will not run on it: different chip. The R4’s pins source less current than an Uno’s, about 8 mA each, so do not drive a relay coil or a motor straight from one.

On a real bench

The Uno R4 Minima fits every Uno shield and every Uno breadboard layout, so wire the SSD1306 OLED exactly as you would on an Uno R3. It has a USB-C socket, and its VIN accepts up to 24 V where an Uno R3 stops at 12.

The code

The sketch the circuit above runs. Open it in the editor, change a line and press Run: it compiles in your browser.

SSD1306 on Arduino Uno R4 I2C
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// 128 x 64 pixels, on the I2C bus: SDA pin A4, SCL pin A5
Adafruit_SSD1306 display(128, 64, &Wire, -1);

void setup() {
  Serial.begin(9600);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("No SSD1306 at 0x3C");
    for (;;) {}
  }
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(2);
  display.setCursor(0, 0);
  display.println("HELLO");
  display.setTextSize(1);
  display.println("SSD1306 OLED");
  display.drawRect(0, 40, 128, 24, SSD1306_WHITE);
  display.display();
  Serial.println("OLED ready");
}

void loop() {
  // A counter in the box, redrawn twice a second.
  display.fillRect(2, 42, 124, 20, SSD1306_BLACK);
  display.setCursor(8, 48);
  display.print("Up for ");
  display.print(millis() / 1000);
  display.print(" s");
  display.display();
  delay(500);
}

Adafruit_SSD1306 display(128, 64, &Wire, -1) describes a 128 by 64 panel on the Wire bus with no reset pin. display.begin(SSD1306_SWITCHCAPVCC, 0x3C) starts the controller at its address and returns false if nothing answers there, which the sketch reports on the serial monitor rather than drawing into thin air.

Every drawing call (println, drawRect, fillRect) changes a copy of the screen in the board’s RAM. Nothing reaches the glass until display() sends the whole frame, 1024 bytes, over I2C. That is why the loop clears its box, draws the new number and calls display() once.

The frame buffer is 1 KB, which the Renesas RA4M1 (Cortex-M4) has room for many times over. The font in the simulator is a 5 by 7 one with capitals, digits and punctuation, so lower case prints as capitals here.

Common mistakes with the SSD1306 OLED on the Arduino Uno R4

Forgetting display()

Every call before display() only changes the copy in RAM. A sketch that draws and never calls display() leaves the screen black, and that is the most common "my OLED does not work" there is.

Trying address 0x3D first

Adafruit’s own example uses 0x3D, the address of their 128 by 64 board with the jumper changed. The cheap blue and yellow modules answer at 0x3C. If begin() fails, the address is the first thing to check.

Mixing up the 128x32 module

The 128 by 32 OLED uses the same chip and the same address, but the constructor needs 128, 32. Built for 64 rows, everything is drawn half off the panel.

Questions and answers

Can I test an SSD1306 OLED with an Arduino Uno R4 Minima without the hardware?

Yes. The circuit at the top of this page is an Arduino Uno R4 Minima with a SSD1306 OLED, running in your browser on a simulated Renesas RA4M1 (Cortex-M4). Every pixel the sketch sends is drawn on the simulated panel, so you can lay out a screen before the module arrives. Press Run it in the editor to change the wiring or the code; it is free and needs no account.

Which pins are SDA and SCL on the Arduino Uno R4?

The Uno R4 keeps the Uno’s layout: I2C is A4 (SDA) and A5 (SCL), also brought out as SDA and SCL beside AREF.

Does the display work at 3.3 V?

Yes, the common modules run from 3.3 to 5 V. On an Arduino Uno R4 Minima 5 V is simpler, because the module’s pull-ups then pull to the same voltage the board uses.

Can I use U8g2 instead of the Adafruit library?

U8g2lib.h compiles here too. The page uses Adafruit_SSD1306 because it is what most tutorials start from, and its calls (setCursor, print, display) carry over to the other Adafruit displays.

Build your own SSD1306 OLED project

Open this circuit in the editor, change the wiring or the code, and keep your version in a free account.