OLED I2C Display

Choose SSD1306 and open example in this library.

Convert images to bitmaps online in order to add images in screen.

After opening your image in GIMP image editor, select: File > Export As in the Toolbar

– Change the name of the image to: yourimagename.bmp

– Select the drop down menu to select the .BMP file format from the selection of image types

– Select where you want the file to be saved.

– Click Export button

There will be a new pop-up menu titled ‘Export Image as BMP’

– Open Advanced Options

– Select 24 bits

– Click Export button

This ‘saves’ your newly exported bitmap image file, which is now ready to use in your screen.
Testing Fonts

Testing menus with physical buttons

OLED I2C Display 0.91 Inch 128 by 32 Arduino Tutorial

 

OLED display is based on a SSD1306 OLED driver IC connected or interfaced to an Arduino. Libraries are then installed and some example programs run which show how to use the display in an Arduino sketch.

 

The display connects to Arduino using only four wires – two for power, one for clock and one for data, making the wiring very simple. The data connection is I2C (I²C, IIC or Inter-Integrated Circuit). This interface is sometimes called TWI (Two Wire Interface).

 

Libraries are installed in the Arduino IDE to make using the OLED display very quick and easy. After installing the libraries, an example sketch can be run to test if the display is working.

 

The OLED display  has a regulator on the bottom layer of the circuit board. This regulator is a XC6206 series voltage regulator in a SOT-23 package. On the SOT23 package is the marking 662K which denotes a 5V in to 3.3V out voltage regulator.

 

Because of the regulator, the display can be connected to a 5V Arduino, such as an Arduino Uno or Arduino MEGA 2560. If you have a similar display, make sure that it is rated to operate at 5V. Some OLED displays are rated to operate from 3.3V only.

 

The first and most important thing to note is that some of the displays may have the GND and VCC power pins swapped around. Check your display to make sure that it is the same as the image below. If the pins are swapped, make sure to change the connections to the Arduino – OLED VCC connects to 5V on the Arduino, OLED GND to GND on the Arduino.

 

Caution! Make sure that you connect the power pins correctly. Some modules have GND and VCC swapped around. Don’t blow up your display!

 

Also make sure that your display is 5V compatible as this one is.

 

 

 

Connexions:

 

OLED GND – Arduino GND

 

OLED VCC – Arduino 5V

 

OLED SCL – Arduino Uno A5

 

OLED SDA – Arduino Uno A4

 

Arduino 128 x 32 OLED I²C Libraries for SSD1306 and Graphics Functions

 

Two Arduino libraries must be installed in the Arduino IDE to start using the display. The SSD1306 driver library is used to initialize the display and provide low level display functions. The GFX library provides graphics functions for displaying text, drawing lines and circles, etc. Both these libraries can be installed from within the Arduino IDE.

 

Install the SSD1306 Driver Library

 

Start the Arduino IDE application. Use the top menu bar to select Tools > Manage Libraries… This opens the Library Manager dialog box.

 

In the Library Manager dialog box, type SSD1306 in the search field and GFX library next, select the corresponding library n the Arduino IDE and then click the Install button that appears.

 

Open OLED Display Arduino Example Sketch

 

After installing the two libraries, as described above, new example sketches are found in the Arduino IDE. These example sketches are found under File >Examples >Adafruit SSD1306 from the top menu of the Arduino IDE. Under File > Examples, scroll down to find the section called Examples from Custom Libraries to find the Adafruit SSD1306 examples.

 

Open the OLED Example Sketch

 

Open the ssd1306_128x32_12c example sketch from the above menu. The full menu navigation to this sketch is File >Examples > Adafruit SSD1306 > ssd1306_128x32_12c

 

Run the Example OLED Sketch

 

After opening the ssd1306_128x32_12c example sketch, load it to the Arduino board with the OLED wired, as already explained. If the wiring is correct, the OLED will start showing a demo that displays various text and graphics on the screen.

 

Fault Finding

 

The only things that can really go wrong are 1) incorrect wiring, 2) faulty display, or 3) incorrect I2C address.

 

An I2C address of 0x3C is set for the OLED display in the example sketch. If your display uses a different I2C address, this must be changed in the sketch.

 

Change the I2C address at the following line of code if your OLED display uses a different address.

 

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128×32

 

Arduino OLED Example Sketch Code

 

Find the full code of the ssd1306_128x32_12c OLED example sketch, as it was captured at the time of writing. This is just for convenience in case it ever gets removed from the Arduino IDE.

 

/**************************************************************************

 

#include <SPI.h>

 

#include <Wire.h>

 

#include <Adafruit_GFX.h>

 

#include <Adafruit_SSD1306.h>

 

 

 

#define SCREEN_WIDTH 128 // OLED display width, in pixels

 

#define SCREEN_HEIGHT 32 // OLED display height, in pixels

 

 

 

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)

 

#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)

 

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

 

 

 

#define NUMFLAKES 10 // Number of snowflakes in the animation example

 

 

 

#define LOGO_HEIGHT 16

 

#define LOGO_WIDTH 16

 

static const unsigned char PROGMEM logo_bmp[] =

 

{ B00000000, B11000000,

 

B00000001, B11000000,

 

B00000001, B11000000,

 

B00000011, B11100000,

 

B11110011, B11100000,

 

B11111110, B11111000,

 

B01111110, B11111111,

 

B00110011, B10011111,

 

B00011111, B11111100,

 

B00001101, B01110000,

 

B00011011, B10100000,

 

B00111111, B11100000,

 

B00111111, B11110000,

 

B01111100, B11110000,

 

B01110000, B01110000,

 

B00000000, B00110000 };

 

 

 

void setup() {

 

Serial.begin(9600);

 

 

 

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally

 

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128×32

 

Serial.println(F(“SSD1306 allocation failed”));

 

for(;;); // Don’t proceed, loop forever

 

}

 

 

 

// Show initial display buffer contents on the screen —

 

// the library initializes this with an Adafruit splash screen.

 

display.display();

 

delay(2000); // Pause for 2 seconds

 

 

 

// Clear the buffer

 

display.clearDisplay();

 

 

 

// Draw a single pixel in white

 

display.drawPixel(10, 10, SSD1306_WHITE);

 

 

 

// Show the display buffer on the screen. You MUST call display() after

 

// drawing commands to make them visible on screen!

 

display.display();

 

delay(2000);

 

// display.display() is NOT necessary after every single drawing command,

 

// unless that’s what you want…rather, you can batch up a bunch of

 

// drawing operations and then update the screen all at once by calling

 

// display.display(). These examples demonstrate both approaches…

 

 

 

testdrawline(); // Draw many lines

 

 

 

testdrawrect(); // Draw rectangles (outlines)

 

 

 

testfillrect(); // Draw rectangles (filled)

 

 

 

testdrawcircle(); // Draw circles (outlines)

 

 

 

testfillcircle(); // Draw circles (filled)

 

 

 

testdrawroundrect(); // Draw rounded rectangles (outlines)

 

 

 

testfillroundrect(); // Draw rounded rectangles (filled)

 

 

 

testdrawtriangle(); // Draw triangles (outlines)

 

 

 

testfilltriangle(); // Draw triangles (filled)

 

 

 

testdrawchar(); // Draw characters of the default font

 

 

 

testdrawstyles(); // Draw ‘stylized’ characters

 

 

 

testscrolltext(); // Draw scrolling text

 

 

 

testdrawbitmap(); // Draw a small bitmap image

 

 

 

// Invert and restore display, pausing in-between

 

display.invertDisplay(true);

 

delay(1000);

 

display.invertDisplay(false);

 

delay(1000);

 

 

 

testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps

 

}

 

 

 

void loop() {

 

}

 

 

 

void testdrawline() {

 

int16_t i;

 

 

 

display.clearDisplay(); // Clear display buffer

 

 

 

for(i=0; i<display.width(); i+=4) {

 

display.drawLine(0, 0, i, display.height()-1, SSD1306_WHITE);

 

display.display(); // Update screen with each newly-drawn line

 

delay(1);

 

}

 

for(i=0; i<display.height(); i+=4) {

 

display.drawLine(0, 0, display.width()-1, i, SSD1306_WHITE);

 

display.display();

 

delay(1);

 

}

 

delay(250);

 

 

 

display.clearDisplay();

 

 

 

for(i=0; i<display.width(); i+=4) {

 

display.drawLine(0, display.height()-1, i, 0, SSD1306_WHITE);

 

display.display();

 

delay(1);

 

}

 

for(i=display.height()-1; i>=0; i-=4) {

 

display.drawLine(0, display.height()-1, display.width()-1, i, SSD1306_WHITE);

 

display.display();

 

delay(1);

 

}

 

delay(250);

 

 

 

display.clearDisplay();

 

 

 

for(i=display.width()-1; i>=0; i-=4) {

 

display.drawLine(display.width()-1, display.height()-1, i, 0, SSD1306_WHITE);

 

display.display();

 

delay(1);

 

}

 

for(i=display.height()-1; i>=0; i-=4) {

 

display.drawLine(display.width()-1, display.height()-1, 0, i, SSD1306_WHITE);

 

display.display();

 

delay(1);

 

}

 

delay(250);

 

 

 

display.clearDisplay();

 

 

 

for(i=0; i<display.height(); i+=4) {

 

display.drawLine(display.width()-1, 0, 0, i, SSD1306_WHITE);

 

display.display();

 

delay(1);

 

}

 

for(i=0; i<display.width(); i+=4) {

 

display.drawLine(display.width()-1, 0, i, display.height()-1, SSD1306_WHITE);

 

display.display();

 

delay(1);

 

}

 

 

 

delay(2000); // Pause for 2 seconds

 

}

 

 

 

void testdrawrect(void) {

 

display.clearDisplay();

 

 

 

for(int16_t i=0; i<display.height()/2; i+=2) {

 

display.drawRect(i, i, display.width()-2*i, display.height()-2*i, SSD1306_WHITE);

 

display.display(); // Update screen with each newly-drawn rectangle

 

delay(1);

 

}

 

 

 

delay(2000);

 

}

 

 

 

void testfillrect(void) {

 

display.clearDisplay();

 

 

 

for(int16_t i=0; i<display.height()/2; i+=3) {

 

// The INVERSE color is used so rectangles alternate white/black

 

display.fillRect(i, i, display.width()-i*2, display.height()-i*2, SSD1306_INVERSE);

 

display.display(); // Update screen with each newly-drawn rectangle

 

delay(1);

 

}

 

 

 

delay(2000);

 

}

 

 

 

void testdrawcircle(void) {

 

display.clearDisplay();

 

 

 

for(int16_t i=0; i<max(display.width(),display.height())/2; i+=2) {

 

display.drawCircle(display.width()/2, display.height()/2, i, SSD1306_WHITE);

 

display.display();

 

delay(1);

 

}

 

 

 

delay(2000);

 

}

 

 

 

void testfillcircle(void) {

 

display.clearDisplay();

 

 

 

for(int16_t i=max(display.width(),display.height())/2; i>0; i-=3) {

 

// The INVERSE color is used so circles alternate white/black

 

display.fillCircle(display.width() / 2, display.height() / 2, i, SSD1306_INVERSE);

 

display.display(); // Update screen with each newly-drawn circle

 

delay(1);

 

}

 

 

 

delay(2000);

}

 

void testdrawroundrect(void) {

display.clearDisplay();

 

for(int16_t i=0; i<display.height()/2-2; i+=2) {

display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,

display.height()/4, SSD1306_WHITE);

display.display();

delay(1);

}

 

delay(2000);

}

void testfillroundrect(void) {

display.clearDisplay();

for(int16_t i=0; i<display.height()/2-2; i+=2) {

// The INVERSE color is used so round-rects alternate white/black

display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,

display.height()/4, SSD1306_INVERSE);

display.display();

delay(1);

}

delay(2000);

}

void testdrawtriangle(void) {

display.clearDisplay();

for(int16_t i=0; i<max(display.width(),display.height())/2; i+=5) {

display.drawTriangle(

display.width()/2 , display.height()/2-i,

display.width()/2-i, display.height()/2+i,

display.width()/2+i, display.height()/2+i, SSD1306_WHITE);

display.display();

delay(1);

}

delay(2000);

}

void testfilltriangle(void) {

display.clearDisplay();

for(int16_t i=max(display.width(),display.height())/2; i>0; i-=5) {

// The INVERSE color is used so triangles alternate white/black

display.fillTriangle(

display.width()/2 , display.height()/2-i,

display.width()/2-i, display.height()/2+i,

display.width()/2+i, display.height()/2+i, SSD1306_INVERSE);

display.display();

delay(1);

}

delay(2000);

}

void testdrawchar(void) {

display.clearDisplay();

display.setTextSize(1); // Normal 1:1 pixel scale

display.setTextColor(SSD1306_WHITE); // Draw white text

display.setCursor(0, 0); // Start at top-left corner

display.cp437(true); // Use full 256 char ‘Code Page 437’ font

// Not all the characters will fit on the display. This is normal.

// Library will draw what it can and the rest will be clipped.

for(int16_t i=0; i<256; i++) {

if(i == ‘\n’) display.write(‘ ‘);

else display.write(i);

}

display.display();

delay(2000);

}

void testdrawstyles(void) {

display.clearDisplay();

display.setTextSize(1); // Normal 1:1 pixel scale

display.setTextColor(SSD1306_WHITE); // Draw white text

display.setCursor(0,0); // Start at top-left corner

display.println(F(“Hello, world!”));

display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw ‘inverse’ text

display.println(3.141592);

display.setTextSize(2); // Draw 2X-scale text

display.setTextColor(SSD1306_WHITE);

display.print(F(“0x”)); display.println(0xDEADBEEF, HEX);

display.display();

delay(2000);

}

void testscrolltext(void) {

display.clearDisplay();

display.setTextSize(2); // Draw 2X-scale text

display.setTextColor(SSD1306_WHITE);

display.setCursor(10, 0);

display.println(F(“scroll”));

display.display(); // Show initial text

delay(100);

// Scroll in various directions, pausing in-between:

display.startscrollright(0x00, 0x0F);

delay(2000);

display.stopscroll();

delay(1000);

display.startscrollleft(0x00, 0x0F);

delay(2000);

display.stopscroll();

delay(1000);

display.startscrolldiagright(0x00, 0x07);

delay(2000);

display.startscrolldiagleft(0x00, 0x07);

delay(2000);

display.stopscroll();

delay(1000);

}

void testdrawbitmap(void) {

display.clearDisplay();

display.drawBitmap(

(display.width() – LOGO_WIDTH ) / 2,

(display.height() – LOGO_HEIGHT) / 2,

logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);

display.display();

delay(1000);

}

#define XPOS 0 // Indexes into the ‘icons’ array in function below

#define YPOS 1

#define DELTAY 2

void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {

int8_t f, icons[NUMFLAKES][3];

// Initialize ‘snowflake’ positions

for(f=0; f< NUMFLAKES; f++) {

icons[f][XPOS] = random(1 – LOGO_WIDTH, display.width());

icons[f][YPOS] = -LOGO_HEIGHT;

icons[f][DELTAY] = random(1, 6);

Serial.print(F(“x: “));

Serial.print(icons[f][XPOS], DEC);

Serial.print(F(” y: “));

Serial.print(icons[f][YPOS], DEC);

Serial.print(F(” dy: “));

Serial.println(icons[f][DELTAY], DEC);

}

for(;;) { // Loop forever…

display.clearDisplay(); // Clear the display buffer

// Draw each snowflake:

for(f=0; f< NUMFLAKES; f++) {

display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SSD1306_WHITE);

}

display.display(); // Show the display buffer on the screen

delay(200); // Pause for 1/10 second

// Then update coordinates of each flake…

for(f=0; f< NUMFLAKES; f++) {

icons[f][YPOS] += icons[f][DELTAY];

// If snowflake is off the bottom of the screen…

if (icons[f][YPOS] >= display.height()) {

// Reinitialize to a random position, just off the top

icons[f][XPOS] = random(1 – LOGO_WIDTH, display.width());

icons[f][YPOS] = -LOGO_HEIGHT;

icons[f][DELTAY] = random(1, 6);

}

}